この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
西澤です。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だと簡単ですね。
どこかの誰かのお役に立てば嬉しいです。