【小ネタ】S3オブジェクトのContent-TypeをAWS CLIで一括で変更する
西澤です。S3からコンテンツ配信を行う際に、Content-Typeを指定せずにアップロードしてしまい、後からまとめて修正したいケースがあります。今回はそれをAWS CLIでやってみました。
作業前のContent-Typeを確認する
まずは、作業前の状態をHEAD Object
から確認します。今回は、拡張子が".mp4"のファイルを抽出します。意図した拡張子のオブジェクトのみが抽出されていることを確認し、現在のContent-Typeがどのような設定になっているかを確認します。
$ BUCKETNAME=s3bucket-hoge $ for KEY in $(aws s3api list-objects \ > --bucket $BUCKETNAME \ > --query "Contents[].[Key]" \ > --output text | grep "\.mp4$") > do > aws s3api head-object \ > --bucket $BUCKETNAME \ > --key $KEY \ > --query "[\`$KEY\`,ContentType]" \ > --output text > done aaa/test.mp4 video/mp4 bbb/test.mp4 application/octet-stream test.mp4 application/octet-stream
Content-Typeをまとめて変更する
COPY Object
にmetadata-directive
に"REPLACE"をつけつつ、オブジェクトを上書きすることで、メタデータを書き換えることが可能です。十分注意の上で実行するようにしてください。
$ for KEY in $(aws s3api list-objects \ > --bucket $BUCKETNAME \ > --query "Contents[].[Key]" \ > --output text | grep "\.mp4$") > do > aws s3api copy-object \ > --bucket $BUCKETNAME \ > --copy-source $BUCKETNAME/$KEY \ > --key $KEY \ > --metadata-directive "REPLACE" \ > --content-type "video/mp4" > done { "CopyObjectResult": { "LastModified": "2017-02-23T15:25:08.000Z", "ETag": "\"baecXXXXXXXXXXXXXXXXXXXXXXXX92be\"" } } { "CopyObjectResult": { "LastModified": "2017-02-23T15:25:11.000Z", "ETag": "\"baecXXXXXXXXXXXXXXXXXXXXXXXX92be\"" } } { "CopyObjectResult": { "LastModified": "2017-02-23T15:25:13.000Z", "ETag": "\"baecXXXXXXXXXXXXXXXXXXXXXXXX92be\"" } }
作業後のContent-Typeを確認する
作業前と同じコマンドで、実際にContent-Typeが意図したものに修正されているかを確認します。
$ for KEY in $(aws s3api list-objects \ > --bucket $BUCKETNAME \ > --query "Contents[].[Key]" \ > --output text | grep "\.mp4$") > do > aws s3api head-object \ > --bucket $BUCKETNAME \ > --key $KEY \ > --query "[\`$KEY\`,ContentType]" \ > --output text > done aaa/test.mp4 video/mp4 bbb/test.mp4 video/mp4 test.mp4 video/mp4
想定通りにContent-Typeを変更することができました。
Content-Type変更に要する時間
実行に要する時間も確認しましたの参考にしていただければと思います。メタデータのmodifyができると良いのですが、内部的にはコピーされているのか、サイズの大きいオブジェクトに対する変更操作には時間がかかることがわかりました。AWS CLIを実行しているローカル環境へのファイル転送があるわけではありませんが、S3上では分割、コピー、結合処理が実行されているのではないかと思われます。
### 32mb.mp4 real 0m1.310s user 0m0.332s sys 0m0.016s real 0m1.240s user 0m0.304s sys 0m0.044s real 0m1.199s user 0m0.316s sys 0m0.028s ### 128mb.mp4 real 0m2.026s user 0m0.320s sys 0m0.020s real 0m2.195s user 0m0.308s sys 0m0.044s real 0m2.332s user 0m0.304s sys 0m0.044s ### 512mb.mp4 real 0m5.830s user 0m0.304s sys 0m0.040s real 0m6.011s user 0m0.308s sys 0m0.028s real 0m7.815s user 0m0.332s sys 0m0.012s ### 2gb.mp4 real 0m21.669s user 0m0.300s sys 0m0.052s real 0m21.909s user 0m0.312s sys 0m0.032s real 0m21.339s user 0m0.300s sys 0m0.044s
まとめ
たいした作業ではありませんが、件数が多いときにまとめてやるのはAWS CLIだと簡単ですね。
どこかの誰かのお役に立てば嬉しいです。