はじめに
CloudFrontのOriginをS3にしているケースで、S3のファイルを更新し、対応するCloudFrontキャッシュをinvalidationしたいというケースがあると思います。
s3cmdを使うと、ローカルからS3へ差分アップロードを行い、かつ自動的に対象ファイルのキャッシュinvalidationを行うことが出来ます。ステキ!
s3cmdは、S3の操作を行うためのコマンドラインツールです。
http://s3tools.org/s3cmd
※今回、バージョンは1.5.2を使用しています。
IAMユーザ作成
まず、S3とCloudFrontを操作するためのIAMユーザを作成します。
CloudFrontのinvalidationを行うために、ポリシーにはS3の基本的な操作(Delete,Get,List,Put)に加え、
S3のGetBucketWebsiteとCloudFrontのListDistributions,CreateInvalidation,GetInvalidationの権限を付与します。
対象バケットの制限等は適宜行って下さい。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Stmt123456789",
"Effect": "Allow",
"Action": [
"cloudfront:ListDistributions",
"cloudfront:CreateInvalidation",
"cloudfront:GetInvalidation"
],
"Resource": [
"*"
]
},
{
"Sid": "Stmt123456789",
"Effect": "Allow",
"Action": [
"s3:DeleteObject",
"s3:GetBucketLocation",
"s3:GetObject",
"s3:GetObjectAcl",
"s3:ListBucket",
"s3:PutObject",
"s3:PutObjectAcl",
"s3:GetBucketWebsite"
],
"Resource": [
"arn:aws:s3:::test-bucket"
]
}
]
}
s3cmdの設定
s3cmdのインストールはyum等で簡単に出来ます。
インストール後、以下コマンドを実行し、上で設定したIAMユーザのAccess Key,Secret Keyを設定します。
# s3cmd --configure
コマンドの実行
以下コマンドを実行すると、ローカルとS3の差分をアップロードし、対応するCloudFrontキャッシュのinvalidationを行うことが出来ます。
s3cmd sync --cf-invalidate <同期元のパス> s3://<同期先のパス>
$ s3cmd sync --cf-invalidate ./test-dir/ s3://test-bucket/test-dir/
./test-dir/1.html -> s3://test-bucket/test-dir/1.html [1 of 3]
10 of 10 100% in 0s 45.01 B/s done
./test-dir/2.html -> s3://test-bucket/test-dir/2.html [2 of 3]
15 of 15 100% in 0s 63.01 B/s done
./test-dir/3.html -> s3://test-bucket/test-dir/3.html [3 of 3]
20 of 20 100% in 0s 78.65 B/s done
Done. Uploaded 45 bytes in 1.0 seconds, 45.00 B/s. Copied 0 files saving 0 bytes transfer.
Created invalidation request for 3 paths
Check progress with: s3cmd cfinvalinfo cf://AAABBBCCCDDD/EEEFFFGGGHHH
ちなみに、実行後に最後の行に出力されるコマンドを実行すると、invalidationの進行状況(InProgress/Completed)を確認できます。
# s3cmd cfinvalinfo cf://AAABBBCCCDDD/EEEFFFGGGHHH
URI: cf://AAABBBCCCDDD/EEEFFFGGGHHH
Status: InProgress
Created: 2015-05-21T08:50:57.214Z
Nr of paths: 3
Reference: E22HEU1NSKFPQ9.20150521175056.4757