【小ネタ】S3オブジェクトのContent-TypeをAWS CLIで一括で変更する

2017.02.24

この記事は公開されてから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 Objectmetadata-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だと簡単ですね。

どこかの誰かのお役に立てば嬉しいです。