- サーバ(EC2)にサイト更新用のアカウント(ex: webadmin)を作成してSFTPで繋がるようにする
- S3の内容をサーバのローカル(ex: /home/webadmin/web-root)にコピー
- lsyncdで/home/webadmin/web-root以下を監視(設定内容を後述)
- ファイル追加時:
- aws s3 cp でローカル→S3へ転送
- ファイル変更時:
- aws s3 cp でローカル→S3へ転送
- aws cloudfront create-invalidation で invalidation を実行
- ファイル削除時:
- aws s3 rm で S3からファイルを削除
- aws cloudfront create-invalidation で invalidation を実行
(/etc/lsyncd.conf)
settings {
logfile = "/var/log/lsyncd.log",
statusFile = "/var/log/lsyncd.status",
nodaemon = false,
statusInterval = 1,
delay = 15,
}
s3sync = {
maxProcesses = 1,
onCreate = "[ -f ^source^pathname ] && aws s3 cp ^source^pathname ^target^pathname || true",
onModify = "[ -f ^source^pathname ] && aws s3 cp ^source^pathname ^target^pathname && aws cloudfront create-invalidation --distribution-id ディストリビューションID --paths ^pathname || true",
onDelete = "[ -f ^source^pathname ] && aws s3 rm ^target^pathname && aws cloudfront create-invalidation --distribution-id ディストリビューションID --paths ^pathname || true",
}
sync {
s3sync,
source = "/home/webadmin/web-root",
target = "s3://S3バケット名",
}
※上記の網掛け部分を適宜書き換える
(補足)
- 最初、AWS Transfer for SFTPを使おうとしたけど、CloudFrontのinvalidation込みで動かそうとすると結局サーバが必要になりそうだったし、Lambdaを使うのも面倒だったので、個人的に一番楽な方法で対応
- この方式に切り替えたサイトはAWSコンソール上で直接S3にファイルアップロードするのは避けるように運用変更が必要(S3とローカルで不整合が発生してしまうので)
- 本当は git でwebサイト全体を管理して、master更新の都度S3+CloudFrontに反映する感じの方が個人的には良いと思います...ただ、非エンジニアにgitを使わせるのは難儀なので、そうなると安定のFTP(ただし、これから構築するならFTPやFTPSではなくSFTPですが)