🍔
[備忘録] EC2でインスタンス立ててあれこれする
長期的に稼働させる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
参考
- https://aws.amazon.com/jp/premiumsupport/knowledge-center/connect-http-https-ec2/
- https://qiita.com/leomaro7/items/42967c080814dfc82139
- https://qiita.com/ymzk-jp/items/ef9203a9b9f8ce5d34af
- https://qiita.com/Esfahan/items/a159753d156d23baf180
- https://aws.amazon.com/jp/premiumsupport/knowledge-center/new-user-accounts-linux-instance/
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
参考
- https://qiita.com/ymzk-jp/items/49daf14495ba090b3187
- https://dev.classmethod.jp/articles/how-to-work-with-amazon-linux2-amazon-linux-extras/
- https://gist.github.com/catatsuy/7e8a5bf5d5874a02f40832eb2777c549
- https://www.nedia.ne.jp/blog/tech/aws/2019/04/16/13991
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 &
参考
- https://qiita.com/int_main_Nick/items/c0550239081b67f43d18
- https://qiita.com/TECHFUND/items/1b005563a782d68f7c17
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'; # (よくない)
参考
- https://qiita.com/miriwo/items/eb09c065ee9bb7e8fe06
- https://qiita.com/miriwo/items/c0ba0ff17c329700fc9e
- https://dekiruengineer.com/engineer/mysql_disable_password_policy/
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