改めて AWS に WordPress を構築する
このスクラップについて
このスクラップでは AWS で EC2 インスタンスを使って WordPress を構築する過程を記録していく。
前に同じことを行う過程をスクラップに記録したが、今回はその時の記録を確認しながら進めていこうと思う。
やることリスト
- パスワード生成 → 済
- メールアドレスの作成 → 済
- アカウント作成 → 済
- EC2 起動 → 済
- Elastic IP アドレスの取得・割り当て → 済
- SSH 設定 → 済
- HTTP サーバーインストール・設定(Override & Document Root) → 済
- MariaDB サーバーインストール・DB 作成 → 済
- PHP インストール・設定(タイムゾーンやアップロードサイズなど) → 済
- WordPress インストール → 済
- バックアップ用 S3 バケットの作成・ライフサイクル設定 → 済
- ロールの作成 → 済
- バックアップスクリプトの作成 → 済
- CRON インストール・設定 → 済
- 自動再起動設定 → 済
- SNS トピック・サブスクリプション作成 → 済
- CloudWatch アラーム設定 → 済
- FTP サーバーインストール・設定 → 済
- ACM リクエスト → 済
- phpMyAdmin インストール・Basic 認証 → 済
- ALB 作成
- WordPress 無限ループ対策 → 済
- スワップ領域の作成 → 済
- PHP FPM プロセス数調整 → 済
- MariaDB の OOM スコア調整 → 済
- プロセス監視 → 済
こうしてリストアップしてみると結構やることがあるな。
ハマったりしたらかなり時間かかりそう。
ただ前回は手探りかつ記録をとりながらで 15 時間弱くらいで終わったので最小限の記録を取りながらなら 5 時間くらいで終わりそうだ。
30 分かけて
パスワード生成、メールアドレス作成、アカウント作成が終わった。
次回からは本格的に進めていこう。
EC2 起動から
こちらはほぼ同じで大丈夫だった。
インスタンスタイプは t3.large にした。
Elastic IP アドレスと SSH ログイン
こちらも手順通りで大丈夫だった。
HTTP サーバー
こちらも手順通りで大丈夫だった。
IP アドレスにアクセスすると It works! と表示される。
起動前に PHP のインストールや設定変更も行えばよかった。
MariaDB サーバー
こちらも手順通りで大丈夫だった。
データベース作成
せっかくログインしたので順序が変わるが行ってしまおう。
PHP インストール
PHP 設定
一緒にやってしまおう。
HTTP 設定
DocumentRoot の変更も一緒にやってしまったが、そうすると設定反映時にエラーになった。
どうやら /var/www/html/wordpress ディレクトリが無いからのようだ。
WordPress インストール
こちらも手順通りで大丈夫だった。
メール設定
今回はスキップする。
S3 バケット作成
バケット名は xxxx-ec2-backup とした。
ここでライフサイクルポリシーも設定した方が良いかも。
ここまでの作業時間
30 分くらいなので合計で 1 時間になった。
スイスイ進んで楽しい。
この振り返りが終わったら記事にしたい
もしかしたら誰かの役に立つかも知れない。
長い記事になりそうなので構成は考える必要はあるだろう。
ロールの作成
ロール名は S3FullAccessRole にしたが後から後悔した記憶がある。
これのことだ
バックアップスクリプトの作成
こちらは手順通りで成功した。
CRON のインストールと設定
こちらも手順通り設定した。
成功しているかどうかは明日以降に確かめよう。
自動再起動
こちらも明日以降に last reboot
を実行して確認しよう。
SNS トピック&サブスクリプション設定
こちらも大丈夫そうだ。
SNS がバージニア北部になっていた、うっかりしていた。
CloudWatch アラーム作成
これは説明がちょっと端折り気味かも知れない。
次は FTP 設定から
ここまで 30 分で合計 1.5 時間くらい。
FTP 設定
こちらも大丈夫だった。
ACM
ACM は使わないかも知れないのでスキップしておこう。
やはりやっておこう。
phpMyAdmin のインストールと設定
こちらも手順通りで進んだ。
しいていうなら .htaccess と .htpasswd のパーミッション設定を追加した方が良いかも知れない。
sudo chown apache:apache .htaccess .htpasswd
WordPress 無限ループ対策
こちらは設定だけで動作を確認していない。
次はスワップ領域作成
ここまで 15 分で合計 1.75 時間くらい。
こんなのがあった。
スワップ領域作成
容量で悩んでしまったので時間がかかってしまった。
今回は 8 GiB とした。
sudo dd if=/dev/zero of=/swapfile bs=1M count=8192
動作確認のためにリブートした。
PHP FPM プロセス数調整
こちらも記載通りで大丈夫だった。
大きいインスタンスの場合はどれくらいにすれば良いのだろう
OOM Score 調整
こちらも記載通りで大丈夫だった。
プロセス監視
この前はインストールに Amazon Systems Manager を使ったが、今回は手動でやってみよう。
sudo yum install -y amazon-cloudwatch-agent
CloudWatch Agent の設定
sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-config-wizard
================================================================
= Welcome to the Amazon CloudWatch Agent Configuration Manager =
= =
= CloudWatch Agent allows you to collect metrics and logs from =
= your host and send them to CloudWatch. Additional CloudWatch =
= charges may apply. =
================================================================
On which OS are you planning to use the agent?
1. linux
2. windows
3. darwin
default choice: [1]:
1
Trying to fetch the default region based on ec2 metadata...
I! imds retry client will retry 1 timesAre you using EC2 or On-Premises hosts?
1. EC2
2. On-Premises
default choice: [1]:
1
Which user are you planning to run the agent?
1. cwagent
2. root
3. others
default choice: [1]:
1
Do you want to turn on StatsD daemon?
1. yes
2. no
default choice: [1]:
1
Which port do you want StatsD daemon to listen to?
default choice: [8125]
8125
What is the collect interval for StatsD daemon?
1. 10s
2. 30s
3. 60s
default choice: [1]:
1
What is the aggregation interval for metrics collected by StatsD daemon?
1. Do not aggregate
2. 10s
3. 30s
4. 60s
default choice: [4]:
4
Do you want to monitor metrics from CollectD? WARNING: CollectD must be installed or the Agent will fail to start
1. yes
2. no
default choice: [1]:
2
Do you want to monitor any host metrics? e.g. CPU, memory, etc.
1. yes
2. no
default choice: [1]:
1
Do you want to monitor cpu metrics per core?
1. yes
2. no
default choice: [1]:
1
Do you want to add ec2 dimensions (ImageId, InstanceId, InstanceType, AutoScalingGroupName) into all of your metrics if the info is available?
1. yes
2. no
default choice: [1]:
1
Do you want to aggregate ec2 dimensions (InstanceId)?
1. yes
2. no
default choice: [1]:
1
Would you like to collect your metrics at high resolution (sub-minute resolution)? This enables sub-minute resolution for all metrics, but you can customize for specific metrics in the output json file.
1. 1s
2. 10s
3. 30s
4. 60s
default choice: [4]:
4
Which default metrics config do you want?
1. Basic
2. Standard
3. Advanced
4. None
default choice: [1]:
1
Current config as follows:
{
"agent": {
"metrics_collection_interval": 60,
"run_as_user": "cwagent"
},
"metrics": {
"aggregation_dimensions": [
[
"InstanceId"
]
],
"append_dimensions": {
"AutoScalingGroupName": "${aws:AutoScalingGroupName}",
"ImageId": "${aws:ImageId}",
"InstanceId": "${aws:InstanceId}",
"InstanceType": "${aws:InstanceType}"
},
"metrics_collected": {
"disk": {
"measurement": [
"used_percent"
],
"metrics_collection_interval": 60,
"resources": [
"*"
]
},
"mem": {
"measurement": [
"mem_used_percent"
],
"metrics_collection_interval": 60
},
"statsd": {
"metrics_aggregation_interval": 60,
"metrics_collection_interval": 10,
"service_address": ":8125"
}
}
}
}
Are you satisfied with the above config? Note: it can be manually customized after the wizard completes to add additional items.
1. yes
2. no
default choice: [1]:
1
Do you have any existing CloudWatch Log Agent (http://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/AgentReference.html) configuration file to import for migration?
1. yes
2. no
default choice: [2]:
2
Do you want to monitor any log files?
1. yes
2. no
default choice: [1]:
2
Do you want the CloudWatch agent to also retrieve X-ray traces?
1. yes
2. no
default choice: [1]:
2
Existing config JSON identified and copied to: /opt/aws/amazon-cloudwatch-agent/etc/backup-configs
Saved config file to /opt/aws/amazon-cloudwatch-agent/bin/config.json successfully.
Current config as follows:
{
"agent": {
"metrics_collection_interval": 60,
"run_as_user": "cwagent"
},
"metrics": {
"aggregation_dimensions": [
[
"InstanceId"
]
],
"append_dimensions": {
"AutoScalingGroupName": "${aws:AutoScalingGroupName}",
"ImageId": "${aws:ImageId}",
"InstanceId": "${aws:InstanceId}",
"InstanceType": "${aws:InstanceType}"
},
"metrics_collected": {
"disk": {
"measurement": [
"used_percent"
],
"metrics_collection_interval": 60,
"resources": [
"*"
]
},
"mem": {
"measurement": [
"mem_used_percent"
],
"metrics_collection_interval": 60
},
"statsd": {
"metrics_aggregation_interval": 60,
"metrics_collection_interval": 10,
"service_address": ":8125"
}
}
}
}
Please check the above content of the config.
The config file is also located at /opt/aws/amazon-cloudwatch-agent/bin/config.json.
Edit it manually if needed.
Do you want to store the config in the SSM parameter store?
1. yes
2. no
default choice: [1]:
2
Program exits now.
やっぱりAWS Systems Manager を使った方が良い気がしてきた
高速セットアップは何が行われているんだろう?
Host Management を選択
「CloudWatch エージェントをインストールして設定します。」にチェックを入れて実行する。
実行すると /opt/aws/amazon-cloudwatch-agent/etc に設定ファイルが追加されている。
やっちまった
CloudWatch エージェントが起動していないので気になってアンインストールしたが再インストールする方法がないようだ。
やってしまった。
Run Command の方から AWSQuickSetup-InstallAndManageCloudWatchDocument を実行したらもしかしたらできるかも。
ただインスタンスが表示されない、なんでだろう。
そして停止もしない
インスタンスを停止して起動してみようとしたが 5 分くらい「停止中」のままだ。
ようやく再起動できた
停止して起動したらインスタンスが表示されるようになった。
そして AWSQuickSetup-InstallAndManageCloudWatchDocument を実行したらどうにかなった。
ここまでの作業時間
今回は好奇心旺盛なせいで 1.75 時間もかかってしまった。
プロセス監視の設定は初めから記録の通りにすればよかった。
スクリーンショットが少ないので増やした方が良いかも。
証明書の設定
今回は ACM 証明書を 使わず Apache に証明書を設定することになったのでその内容を記録していこう。
証明書と秘密鍵のアップロード
scp secret.pem certificate.pem ca-certificate.pem xxxxx:~/
秘密鍵と証明書の配置
sudo mv ~/secret.pem /etc/pki/tls/private/secret.pem
sudo mv ~/certificate.pem /etc/pki/tls/certs/certificate.pem
sudo mv ~/ca-certificate.pem /etc/pki/tls/certs/ca-certificate.pem
sudo chmod 400 /etc/pki/tls/private/secret.pem
mod_ssl インストール
sudo yum install -y mod_ssl
設定ファイルの変更
SSLCertificateFile /etc/pki/tls/certs/certificate.pem
SSLCertificateKeyFile /etc/pki/tls/private/secret.key
証明書の結合
色々な情報を参照すると証明書と中間証明書を結合した方が良さそうだ。
cd /etc/pki/tls/certs/
awk 1 certificate.pem ca-certificate.pem | sudo tee combined-certificate.pem
この証明書を使う場合は下記のようになる。
SSLCertificateFile /etc/pki/tls/certs/combined-certificate.pem
設定の反映
一応停止してから再起動する。
sudo systemctl stop httpd
sudo systemctl start httpd
HTTP → HTTPS 転送設定
RewriteEngine on
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
再起動して HTTP アクセス時に転送されることを確認する。
TLS バージョン指定
一応やっておいた方が良さそう。
SSLProtocol +TLSv1.2
Mac の hosts ファイル
書き換えて試してみる。
xxx.xxx.xxx.xxx www.example.com
SSL 接続確認
openssl s_client -connect www.example.com:443
ただ、これだと本物のサーバーにアクセスしているのかどうかがわからない。
便利な方法を見つけた
openssl s_client -connect xxx.xxx.xx.xxx:443 -servername www.example.com
作業時間
追加で 1 時間なので合計 4 時間くらいかかった計算になる。