サーバの初期設定する(Amazon Linux 2)

AWSを使う機会があったので忘れないようにメモ。数年前にも触ったことはあるんだけど、もう忘れてたw

サーバ準備

AWSコンソールから設定していきます。

リージョン
「アジアパシフィック(東京)」にする。

ネットワーク
VPCダッシュボードからVPCウィザードを起動。以下の設定でVPC作成。

・作成するリソース:VPC、サブネットなど
・名前タグ:任意の名前
・IPv4 CIDRブロック:10.0.0.0/16
・テナンシー:デフォルト
・DNS ホスト名を有効化:チェック
・DNS 解決を有効化:チェック

これでVPC、サブネット、インターネットゲートウェイ、ルートテーブルが自動生成される。便利だねえ。正直この辺ややこしいし。

セキュリティグループ
EC2のセキュリティグループから作成。アウトバウンドグループは全部通す。インバウンドグループはsshやhttpなど必要なものだけ通す。

インスタンス
EC2の「インスタンスを起動」から作成。

・名前とタグ:任意の名前
・アプリケーションおよび OS イメージ:Amazon Linux 2
・インスタンスタイプ:適切なもの
・キーペア:新しいキーペアの作成
・VPC:上で作成したもの
・サブネット:上で作成したもの
・パブリック IP の自動割り当て:有効化
・ファイアウォール:「既存のセキュリティグループを選択する」で上で作成したもの
・ストレージ:適切なもの

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

DB

MariaDBがあったので使います。

$ sudo amazon-linux-extras install mariadb10.5
$ sudo systemctl start mariadb
$ sudo systemctl enable mariadb

rootにはパスワードが設定されてなくてログインできません。なのでセーフモードで設定します。

$ 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

ユーザを作成します。

$ mysql -u root -p
> CREATE USER '(ユーザ名)'@'localhost' IDENTIFIED BY '(パスワード)';
> GRANT ALL PRIVILEGES ON *.* TO '(ユーザ名)'@'localhost';

特定のテーブルのみ、かつ外部からのアクセス許可(%)の場合は
> GRANT ALL PRIVILEGES ON (テーブル名).* TO '(ユーザ名)'@'%';

実はここからの接続先はAmazon RDSのAuroraなんだけど、そっちは割愛。

まとめ

結構調べるのに苦労しました。まあでもこれでAWSの案件が来ても大丈夫。

ちょこちょこ記述が足りない箇所がありますが、後日追加予定。

コメントを残す

メールアドレスが公開されることはありません。