S3バケットに含まれる全オブジェクトのCache-Controlを書き換える、一撃で!

はじめに

CloudFrontとS3オリジンを組み合わせたWebサイトを構築した場合、キャッシュ時間(TTL)を制御する際には、S3オリジンに配置されたオブジェクトのMetaDataにCache-ControlExpiresを設定する必要があります。詳しくは都元の以下の記事を参照して下さい。

ただし、AWS管理コンソールでは、S3のオブジェクトを複数選択して一気にMetaDataを書き換えることは出来ません。ちまちまとGUIで操作するのは大変面倒臭い。

なので、これを一撃で書き換えるスクリプトをAWS SDK for Rubyを使って作りました。

やってみる

スクリプトの内容はこんな感じです。

# Must be carried out in advance:
# export AWS_ACCESS_KEY_ID='YOUR_ACCESS_KEY'
# export AWS_SECRET_ACCESS_KEY='SECRET_ACCESS_KEY'
# export AWS_REGION='YOUR_REGION'

require 'aws-sdk'

s3 = AWS::S3.new
bucket = s3.buckets[ARGV[0]]

bucket.objects.each do |obj|
  obj.copy_from(obj, {:cache_control => "no-cache, no-store"})
end

以下のようにS3バケット名を引数にして渡します。

$ ruby ./s3chmod.rb YOUR_BUCKET_NAME

すると指定したS3バケットに含まれる全てのオブジェクトのMetaDataにCache-Controlが設定されます!

S3_Management_Console

はい一撃!

まとめ

Cache-Control以外にも様々なオプションの書き換えが可能です。詳しくはClass: AWS::S3::S3Object — AWS SDK For Rubyを参照して下さい。