🍔

[備忘録] EC2でインスタンス立ててあれこれする

6 min read

長期的に稼働させるWEBアプリケーション用のインスタンスではなく、とりあえず、あれこれ動かしてみてやり方を学ぶ用。

EC2インスタンス

インスタンスを建てる(頑張る)

セキュリティグループから80番ポートを開ける

1. インスタンス > セキュリティ > セキュリティグループ
2. インバウンドルール > インバウンドルールを編集
3. 80番ポートを追加。ソースに「マイIP」をつける

新しいユーザーを作る

$ sudo adduser new_user
$ sudo usermod -aG wheel new_user

sudoを実行する時にパスワードを不要にする

$ visudo
# Same thing without a password
%wheel        ALL=(ALL)       NOPASSWD: ALL

sshで接続できるようにする。公開鍵は事前に用意する。

$ sudo su - new_user
$ mkdir .ssh
$ chmod 600 .ssh/authorized_keys
$ cat >> .ssh/authorized_keys

参考

nginx

日本時間に合わせる

$ sudo yum update -y
$ sudo timedatectl set-timezone Asia/Tokyo
$ sudo localectl set-locale LANG=ja_JP.UTF-8
$ sudo localectl set-keymap jp106

amazon-linux-extrasで利用可能なトピック(≒パッケージ)の一覧

$ amazon-linux-extras list

nginxをインストール

$ sudo amazon-linux-extras install nginx1

nginx.confのバックアップを作成

$ sudo cp -a /etc/nginx/nginx.conf /etc/nginx/nginx.conf.back

nginxを起動

$ sudo systemctl start nginx
$ systemctl status nginx

参考

GO

golangをインストール(バージョンは確認する)

$ sudo amazon-linux-extras install golang1.11

/etc/nginx/nginx.confのserverを以下に書き換え

server {
    listen       80;
    server_name  hostname;

    location / {
        fastcgi_pass  127.0.0.1:9000;
        include       fastcgi_params;
    }
}

nginxの設定を反映させる(再起動がラク)

$ sudo systemctl restart nginx

アプリケーション側のコードを書く

$ mkdir /var/app/
$ cd /var/app
$ vim app.go

Hello, World!

package main

import (
    "fmt"
    "net"
    "net/http"
    "net/http/fcgi"
)

func handler(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "Hello, World!")
}

func main() {
    l, err := net.Listen("tcp", "127.0.0.1:9000")
    if err != nil {
        return
    }
    http.HandleFunc("/", handler)
    fcgi.Serve(l, nil)
}

コンパイルして実行

$ go build app.go
$ ./app &

参考

MySQL

MariaDB用パッケージを削除

$ sudo yum remove mariadb-libs

MySQL8.0のインストール

$ sudo yum localinstall https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm
$ sudo yum install --enablerepo=mysql80-community mysql-community-server
$ sudo yum install --enablerepo=mysql80-community mysql-community-devel

MySQLの起動

$ sudo touch /var/log/mysqld.log
$ sudo systemctl start mysqld
$ sudo systemctl enable mysqld

パスワードの確認と変更

$ sudo cat /var/log/mysqld.log | grep "temporary password"  # tmpパスワードが表示されるので、それでrootログイン
$ mysql -u root -p
mysql> ALTER USER 'root'@'localhost' identified BY '大文字、小文字、特殊文字(アスタリスク等)を含む新しいrootユーザのパスワード';
mysql> exit
$ mysql -u root -p  # 新パスワードで入れるか確認

新しいユーザーを作成する

mysql> set global validate_password.policy=LOW;
mysql> set global validate_password.length=4;
mysql> create user user0@localhost IDENTIFIED BY 'password';
mysql> GRANT all ON *.* TO 'isucon'@'localhost';   # (よくない)

参考

GO + MySQL アプリを動かす

mysql> CREATE DATABASE test_db;
mysql> USE test_db;
mysql> CREATE TABLE users (
    -> id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    -> name TEXT NOT NULL
    -> );
mysql> INSERT INTO users (name) VALUES ("Taro"),("Sam");

GOでMySQLを使うドライバのインストール

go get github.com/go-sql-driver/mysql

適当にテーブルを表示するコード

package main

import (
    "database/sql"
    "fmt"
    "net"
    "net/http"
    "net/http/fcgi"
    _ "github.com/go-sql-driver/mysql"
)

type User struct {
        ID   int
        Name string
}

func handler(w http.ResponseWriter, r *http.Request) {
    db, err := sql.Open("mysql", "user0:password@/test_db")
    if err != nil {
        panic(err.Error())
    }
    defer db.Close()

    rows, err := db.Query("SELECT * FROM users")
    if err != nil {
        panic(err.Error())
    }
    defer rows.Close()

    for rows.Next() {
        var user User;
        err := rows.Scan(&user.ID, &user.Name)
        if err != nil {
            panic(err.Error())
        }
        fmt.Fprintln(w, "Hello", user.Name)
    }
}

func main() {
    l, err := net.Listen("tcp", "127.0.0.1:9000")
    if err != nil {
        return
    }

    http.HandleFunc("/", handler)
    fcgi.Serve(l, nil)
}

バックグラウンドで動かしているアプリをキルして、再度動かす

$ ps -aux | grep app
$ kill [PID]
$ go build app.go
$ ./app &

参考

alp

alpのインストール

$ cd
$ wget https://github.com/tkuchiki/alp/releases/download/v1.0.3/alp_linux_amd64.zip
$ unzip alp_linux_amd64.zip
$ sudo install ./alp /usr/local/bin

ltsvのlog_formatを追加。

log_format ltsv "time:$time_iso8601"
      "\tremote_addr:$remote_addr"
      "\thost:$http_host"
      "\txff:$http_x_forwarded_for"
      "\tmethod:$request_method"
      "\turi:$request_uri"
      "\tstatus:$status"
      "\tsize:$body_bytes_sent"
      "\treferer:$http_referer"
      "\tua:$http_user_agent"
      "\tres_size:$bytes_sent"
      "\treqtime:$request_time"
      "\tapptime:$upstream_response_time"
      ;

# 多分mainになっているので、ltsvに変更
access_log /var/log/nginx/access.log ltsv;

以下のコマンドが動作すればOK

$ sudo cat /var/log/nginx/access.log | alp ltsv -m "^/posts/[0-9]+","^/image/[0-9]+\.(jpg|png)","^/@[a-z]*" --sort=sum --reverse

参考

Discussion

ログインするとコメントできます