【Tips】S3 アップロード時に ContentType を指定する

はじめに

本記事は、S3 利用時の Tips となります。 また、以下に示すソフトウェア環境で検証しております。

~ $ aws --version
aws-cli/1.11.163 Python/2.7.10 Darwin/16.7.0 botocore/1.7.43
~ $ sw_vers 
ProductName:    Mac OS X
ProductVersion: 10.12.6
BuildVersion:   16G1036
~ $

問題

awscli で S3 に tgz(tar + gzip 圧縮)ファイルをアップロードし、ブラウザ(マネジメントコンソール)からダウンロードしようとすると gzip が展開され tar ファイルに変更されてしまう

$ aws s3 cp test.tgz s3://bucket-name
upload: ./test.tgz to s3://bucket-name

原因

aws s3 cp コマンドによりアップロードされた tgz ファイルの ContentType が "application/x-tar" に設定されていたため

$ aws s3api head-object --bucket [Bucket Name] --key [Key Name] | grep ContentType
    "ContentType": "application/x-tar"

(aws s3 cp で ContentType を指定しない場合、Python のライブラリによりファイルの型を推定するようです)

対処方法

S3 へのファイルアップロード時に適切な Content-Type を指定する。

$ aws s3 cp test.tgz s3://bucket-name --content-encoding "gzip" --content-type "application/x-gzip"

RFC 6713 の記載より 'application/gzip' を設定するのが良いか迷いましたがマネジメントコンソールからアップロードしたファイルの ContentType が "application/x-gzip" に設定されるようなので、こちらの設定に従いました。

さいごに

どこかで同じように困っている誰かの役に立てれば幸いです。ではでは