はじめに
EC2上で動かしているWordPress(charakatsu.com)の画像ファイルをAmazon S3に自動同期する仕組みを作りました。
画像をS3に移すことで、EC2への負荷を減らし、障害時のリスクも分散できます。
小学生でもわかる説明
今まではWordPressにアップロードした画像がEC2のサーバーの中だけに保存されていました。
これをS3(AWSの倉庫)にも自動でコピーする仕組みを作りました。
WordPressに画像をアップロード
↓
EC2のサーバーに保存
↓ 5分ごとに自動コピー
S3(クラウドの倉庫)にも保存
EC2が壊れても、S3に画像が残るので安心です。
今回やったこと
① S3バケット(charakatsu-media)を作成
② バケットポリシーを設定(公開アクセスを許可)
③ 同期スクリプトを作成
④ cronで5分ごとに自動同期
実際にやったこと
① S3バケットを作成
AWSコンソールで charakatsu-media という名前のバケットを作成しました。
設定のポイントは**「パブリックアクセスをすべてブロック」をオフ**にすること。画像を公開するバケットなので必要な設定です。
② バケットポリシーを設定
json
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "PublicReadGetObject",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::charakatsu-media/*"
},
{
"Sid": "EC2WriteAccess",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::XXXXXXXXXXXX:role/EC2-S3-Backup-Role"
},
"Action": [
"s3:PutObject",
"s3:DeleteObject",
"s3:GetObject",
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::charakatsu-media",
"arn:aws:s3:::charakatsu-media/*"
]
}
]
}
③ 同期スクリプトを作成
EC2にSSH接続して以下を実行しました。
bash
cat > ~/s3sync.sh << 'EOF'
#!/bin/bash
aws s3 sync /var/www/html/wordpress/wp-content/uploads/ s3://charakatsu-media/wp-content/uploads/ --region ap-northeast-1
EOF
chmod +x ~/s3sync.sh
手動で実行して動作確認しました。
bash
./s3sync.sh
28件の画像ファイルがS3に同期されました。
④ cronで自動化
5分ごとに自動同期されるようにcronを設定しました。
bash
echo "*/5 * * * * /home/ec2-user/s3sync.sh" | crontab -
設定確認:
bash
crontab -l
# */5 * * * * /home/ec2-user/s3sync.sh
ハマったポイント
WP Offload Media LiteがPHP 8.5に対応していない
最初はWordPressプラグイン(WP Offload Media Lite)でS3配信しようとしましたが、PHP 8.5との相性問題でプラグインが正常に動作しませんでした。
プラグインに頼らずAWS CLIで直接同期する方法に切り替えて解決しました。
IMDSv2の問題
EC2のメタデータサービスがIMDSv2必須になっていたため、一部のツールがIAMロールを認識できない問題が発生しました。
AWSコンソールでIMDSv2を「オプション」に変更することで解決しました。
やったこと まとめ
① S3バケット作成 ② バケットポリシー設定 ③ 同期スクリプト作成 ④ cronで5分ごとに自動同期
今後の課題
次の記事では、WordPressの画像URLをS3に書き換えてS3から直接配信する設定を解説しています。
→【続編】【EC2 + Amazon Linux 2023】WordPressの画像URLをS3に書き換える方法【DB直接編集】

まとめ
| 項目 | 設定前 | 設定後 |
|---|---|---|
| 画像の保存先 | EC2のみ | EC2 + S3に自動同期 |
| 同期方法 | 手動 | 5分ごとに自動 |
| EC2障害時 | 画像消失リスクあり | S3に画像が残る |
学習時間は約4時間。プラグインのトラブル対応が一番時間がかかりました。

