web-dev-qa-db-ja.com

AWS CLIを使用してS3にアップロードするときにContent-Typeを設定するにはどうすればよいですか?

S3静的ウェブサイトホスティングを設定しようとしていますが、AWSコンソールでContent-Typeメタデータフィールドが設定されていないオブジェクトでは403を返すようです。 AWS CLIツールを使用してこれを行う方法がわかりません。

--metadataオプションを使用すると動作するようです:

$ aws s3api put-object --bucket <bucket> --key foo.html --body foo.html --metadata Content-Type=text/html
{
    "ETag": "\"fd5ff7743e5ed1e1c304eb1c34e8e39f\""
}
$ aws s3api head-object --bucket <bucket> --key foo.html
{
    "AcceptRanges": "bytes",
    "ContentType": "binary/octet-stream",
    "LastModified": "Wed, 15 Apr 2015 06:39:48 GMT",
    "ContentLength": 189,
    "ETag": "\"fd5ff7743e5ed1e1c304eb1c34e8e39f\"",
    "Metadata": {
        "content-type": "text/html"
    }
}

ただし、オブジェクトのContent-TypeフィールドはAWSコンソールの[メタデータ]セクションに表示されず、ブラウザーでファイルにアクセスしようとすると403が表示されます。

--content-typeオプションを使用しても機能しません。

$ aws s3api put-object --bucket <bucket> --key foo.html --body foo.html --content-type text/html
{
    "ETag": "\"fd5ff7743e5ed1e1c304eb1c34e8e39f\""
}
$ aws s3api head-object --bucket <bucket> --key foo.html
{
    "AcceptRanges": "bytes",
    "ContentType": "text/html",
    "LastModified": "Wed, 15 Apr 2015 06:46:49 GMT",
    "ContentLength": 189,
    "ETag": "\"fd5ff7743e5ed1e1c304eb1c34e8e39f\"",
    "Metadata": {}
}

何らかの特殊なContentTypeプロパティを設定しているように見えますが、AWSコンソールにはContent-Typeメタデータフィールドがなく、ブラウザでファイルにアクセスすることもできません。

同様のコマンド(aws s3 cpaws s3 sync)も試してみましたが、運はありませんでした。バケットポリシーをパブリックに読み取り可能に設定しています。

13
Alek Storm

--content-typeを使用した2番目の例は、オブジェクトのコンテンツタイプを設定する方法です。表示されるJSON応答は、HTTP応答のContent-TypeヘッダーをContentTypeキーにマッピングしていますが、オブジェクトの実際のContent-Typeヘッダーに対応しています。 --content-typeを使用すると、コンテンツタイプの値がコンソールのメタデータセクションに表示されることを確認しました。

$ aws s3api put-object --bucket bucket --key foo.json --body foo.json --content-type application/json --acl public-read

$ aws s3api head-object --bucket jamesls-test-sync --key foo.json
{
    "AcceptRanges": "bytes",
    "ContentType": "application/json",
    "LastModified": "Wed, 15 Apr 2015 17:18:58 GMT",
    "ContentLength": 0,
    "ETag": "\"d41d8cd98f00b204e9800998ecf8427e\"",
    "Metadata": {}
}

また、curlを使用すると、コンテンツタイプヘッダーが設定されていることがわかります。

$ curl -I https://bucket.s3.amazonaws.com/foo.json
HTTP/1.1 200 OK
x-amz-id-2: ZlSg1aDUBu7z+9gWUg24uRn2TioI0hk2AGBBZ1iVbpUkv8RTrHWovzbHxL/y21Qe
x-amz-request-id: 8568C73EB95EE5A6
Date: Wed, 15 Apr 2015 17:20:42 GMT
Last-Modified: Wed, 15 Apr 2015 17:18:58 GMT
ETag: "d41d8cd98f00b204e9800998ecf8427e"
Accept-Ranges: bytes
Content-Type: application/json
Content-Length: 0
Server: AmazonS3
16
jamesls

AWSコンソールでは、ドロップダウンにコンテンツタイプがリストされていない場合でも、必要なコンテンツタイプをキー入力できます。

4
chris

これはOPが探していたものではありませんが、Googleは多くの人をここに送ります。

--bodyを再度アップロードすることなく、すでにS3にあるオブジェクトのコンテンツタイプを設定する場合は、 Amazon S3オブジェクトのコンテンツタイプを変更する方法 を参照してください。

2
Bruno Bronosky