2015-04-15 5 views
7

J'essaie de configurer l'hébergement de site Web statique S3, mais il semble renvoyer 403 sur l'un de mes objets qui n'ont pas le champ de métadonnées Content-Type dans la console AWS. Je n'arrive pas à comprendre comment faire avec l'outil AWS CLI.Comment définir le type de contenu lors du téléchargement vers S3 avec AWS CLI?

En utilisant l'option --metadata semble fonctionner:

$ 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" 
    } 
} 

Mais le champ Content-Type sur l'objet ne soit pas visible dans la section « métadonnées » de la console AWS, et je reçois un 403 en essayant d'accéder le fichier dans un navigateur.

En utilisant l'option --content-type ne fonctionne pas non plus:

$ 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": {} 
} 

Bien qu'il semble mettre une sorte de propriété spéciale ContentType, il n'y a toujours pas un champ de métadonnées Content-Type dans la console AWS, et je ne peux accéder au fichier dans un navigateur.

J'ai également essayé des commandes similaires (aws s3 cp, aws s3 sync), sans succès. La stratégie de compartiment est définie sur publiquement lisible.

Répondre

11

Votre deuxième exemple avec --content-type est le moyen de définir le type de contenu pour un objet. La réponse JSON affichée correspond à l'en-tête Content-Type dans la réponse HTTP à la clé ContentType, mais correspond à l'en-tête réel Content-Type de l'objet. J'ai confirmé que la valeur du type de contenu apparaît dans la section des métadonnées de la console lors de l'utilisation de --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": {} 
} 

également d'utiliser curl, nous pouvons voir l'en-tête de type de contenu est défini:

$ 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 
+0

Cela ne fonctionne pas si j'omets le paramètre '--acl public-read'. Existe-t-il un moyen de faire fonctionner cela tout en verrouillant l'accès à une certaine plage IP, comme je l'ai fait dans ma politique de compartiment? –

+0

Peu importe, il semble que cette configuration fasse exactement ce que je veux: même si l'ACL de l'objet est définie sur public-read, la politique du compartiment s'applique également. –

0

Dans la console AWS, vous pouvez entrer dans le type de contenu que vous voulez, même si le type de contenu n'est pas répertorié dans la liste déroulante.