AWSを使う機会があったので忘れないようにメモ。数年前にも触ったことはあるんだけど、もう忘れてたw
サーバ準備
AWSコンソールから設定していきます。
リージョン
「アジアパシフィック(東京)」にする。
ネットワーク
VPCダッシュボードからVPCウィザードを起動。以下の設定でVPC作成。
・作成するリソース:VPC、サブネットなど
・名前タグ:任意の名前
・IPv4 CIDRブロック:10.0.0.0/16
・テナンシー:デフォルト
・DNS ホスト名を有効化:チェック
・DNS 解決を有効化:チェック
これでVPC、サブネット、インターネットゲートウェイ、ルートテーブルが自動生成される。便利だねえ。正直この辺ややこしいし。
セキュリティグループ
EC2のセキュリティグループから作成。アウトバウンドグループ(外に出ていく通信)は全部通す。インバウンドグループ(中に入ってくる通信)はsshやhttp、mysqlなど必要なものだけ通す。
ソースには全部許可のAnywhere-IPv4 (0.0.0.0/0)。
インスタンス
EC2の「インスタンスを起動」から作成。
・名前とタグ:任意の名前
・アプリケーションおよび OS イメージ:Amazon Linux 2
・インスタンスタイプ:適切なもの
・キーペア:新しいキーペアの作成
・ネットワーク設定:右側にある編集ボタン押す
・VPC:上で作成したもの
・サブネット:上で作成したもの(public1, private1等をちゃんと確認)
・パブリック IP の自動割り当て:有効化
・ファイアウォール:「既存のセキュリティグループを選択する」で上で作成したもの
・ストレージ:適切なもの
データベース
RDSの「データベースの作成」から作成。
・データベース作成方法を選択:標準作成
・エンジンのオプション:MySQL
・バージョン:適切なもの
・テンプレート:本番稼働用
・可用性と耐久性:単一のDBインスタンス
・設定:DBインスタンス識別子やパスワード設定
・インスタンスの設定:任意のインスタンス
・ストレージ:適切なもの
・コンピューティングリソース:ECコンピューティングリソースに接続しない
・VRC:上で作成したもの
・DBサブネットグループ:新規?
・パブリックアクセス:なし
・VRCセキュリティグループ:既存の選択
・アベイラビリティーゾーン:指定なし
・データベース認証:パスワード認証
Elastic IP
EC2の「Elastic IP アドレスを割り当てる」から作成。アクションボタンの「Elastic IP アドレスの関連付け」でインスタンス関連付け。
これでサーバが用意できました。慣れれば簡単なんだろうけど、調べるのに結構時間かかりました。コロコロ仕様変わってるみたいで、ネットに書かれた通りに行かなかったりするし。
サーバーログイン
コンソールのEC2のインスタンス>接続ボタン>sshクライアントで接続方法わかります。
$ ssh -i key.pem ec2-user@(IPアドレス)
sshのタイムアウトが早いので延ばします。60秒ごとチェックで30分アクセスなければタイムアウトに変更。
$ sudo vi /etc/ssh/sshd_config
ClientAliveInterval 60
ClientAliveCountMax 30
$ sudo service sshd restart
ついでにタイムゾーンも変更。
$ sudo timedatectl set-timezone Asia/Tokyo
ユーザ作成
IDパスワード設定。
$ sudo useradd test
$ sudo passwd test
sudoできるようにする。
$ sudo usermod -G wheel test
$ sudo visudo
以下の行を有効化
%wheel ALL=(ALL) NOPASSWD: ALL
鍵作成。
$ sudo su - test
$ ssh-keygen -t rsa
何も入力せずエンター
公開鍵の設定
$ cd ~/.ssh
$ cat id_rsa.pub >> authorized_keys
$ chmod 600 authorized_keys
$ exit
作成されたid_rsaファイルをダウンロードして、ファイル名をkey.pemに変更。このファイルを鍵としてログイン出来るようになります。
アプリインストール方法
Amazon独自のリポジトリを使います。まずは以下のようにインストール可能なアプリのバージョンを確認します。ここではPHP。
$ sudo amazon-linux-extras |grep php
するとphp7.4とphp8.0がインストール可能と出ました。そこでphp8.0を以下のようにインストールします。
$ sudo amazon-linux-extras install php8.0
終わり。簡単だね。この手順を元に以下やっていきます。
amazon-linux-extrasで見つからない場合は、他のOSと同じく他のリポジトリから持ってくることも可能です。
webサーバ関係
nginx
$ sudo amazon-linux-extras install nginx1
$ sudo systemctl start nginx
$ sudo systemctl enable nginx
サブドメイン設定
$ sudo vi /etc/nginx/conf.d/(ドメイン名).conf
server {
listen 80;
server_name (ドメイン名);
root /home/(ユーザ名)/public_html;
index index.html index.htm index.php;
location ~ \.php$ {
try_files $uri =404;
fastcgi_pass unix:/run/php-fpm/www.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
再起動
$ sudo systemctl restart nginx.service
php
$ sudo amazon-linux-extras install php8.0
$ sudo yum install php-cli php-pdo php-fpm php-json php-mysqlnd php-mbstring
$ sudo vi /etc/php.ini
date.timezone = "Asia/Tokyo"
$ sudo vi /etc/php-fpm.d/www.conf
user = nginx
group = nginx
$ sudo chown nginx /var/log/php-fpm/
$ sudo systemctl start php-fpm
$ sudo systemctl enable php-fpm
再起動
$ sudo systemctl restart php-fpm.service
composer
$ cd /home/ec2-user
$ sudo curl -sS https://getcomposer.org/installer | php
$ sudo mv composer.phar /usr/local/bin/composer
Git
$ sudo yum install git
SSL(Let’s Encrypt)
$ sudo amazon-linux-extras install epel
$ sudo yum install certbot
$ sudo certbot --nginx
$ sudo certbot certonly --webroot -w /(パス)/public_html -d (ドメイン名) --email (メールアドレス)
$ sudo vi /etc/nginx/default.d/(ドメイン名).conf
server {} 内に以下追加
listen 443 ssl;
ssl_certificate /etc/letsencrypt/live/(ドメイン名)/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/(ドメイン名)/privkey.pem;
$ sudo systemctl restart nginx.service
バッチでSSL証明書自動更新(※後でチェック)
$ sudo crontab -e
0 4 1,15 * * root certbot renew && systemctl start nginx
データベース
EC2にMarinaDBインストールします。
$ sudo amazon-linux-extras install mariadb10.5
$ sudo systemctl start mariadb
$ sudo systemctl enable mariadb
rootにはパスワードが設定されてなくてログインできません。なのでセーフモードで設定します。
RDSに繋ぐ場合は設定しなくても大丈夫です。
$ sudo systemctl stop mariadb
$ sudo mysqld_safe --skip-grant-tables --skip-networking &
$ mysql -u root
> FLUSH PRIVILEGES;
> ALTER USER 'root'@'localhost' IDENTIFIED BY '(パスワード)';
> FLUSH PRIVILEGES;
> exit
$ sudo kill `sudo cat /var/run/mariadb/mariadb.pid`
$ sudo systemctl start mariadb
ユーザを作成します。RDSの場合はもちろんRDS上でやります。
$ mysql -u root -p
> CREATE USER '(ユーザ名)'@'localhost' IDENTIFIED BY '(パスワード)';
> GRANT ALL PRIVILEGES ON *.* TO '(ユーザ名)'@'localhost';
特定のテーブルのみ、かつ外部からのアクセス許可(%)の場合は
> CREATE USER '(ユーザ名)'@'%' IDENTIFIED BY '(パスワード)';
> GRANT ALL PRIVILEGES ON (テーブル名).* TO '(ユーザ名)'@'%';
まとめ
結構調べるのに苦労しました。まあでもこれでAWSの案件が来ても大丈夫。
ちょこちょこ記述が足りない箇所がありますが、後日追加予定。