この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
はじめに
本記事は、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 のライブラリによりファイルの型を推定するようです)
- aws-cli/utils.py at 833716e1dae531fe8c3835c5feaa50d255c01be1 · aws/aws-cli
- 19.5. mimetypes — ファイル名を MIME 型へマップする — Python 3.6.3 ドキュメント
対処方法
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" に設定されるようなので、こちらの設定に従いました。
さいごに
どこかで同じように困っている誰かの役に立てれば幸いです。ではでは