J'essaie de configurer l'hébergement de site Web statique S3, mais il semble renvoyer 403 sur tous mes objets qui n'ont pas le champ de métadonnées Content-Type
Défini dans la console AWS. Je ne peux pas comprendre comment le faire avec l'outil AWS CLI.
L'utilisation de 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 n'est pas visible dans la section "Métadonnées" de la console AWS, et j'obtiens un 403 lorsque j'essaie d'accéder au fichier dans un navigateur.
L'utilisation de 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 définir une sorte de propriété spéciale ContentType
, il n'y a toujours pas de champ de métadonnées Content-Type
Dans la console AWS, et je ne peux pas accéder au fichier dans un navigateur.
J'ai également essayé des commandes similaires (aws s3 cp
, aws s3 sync
), Sans succès. J'ai la stratégie de compartiment définie sur lisible publiquement.
Votre deuxième exemple avec --content-type
Est la façon de définir le type de contenu d'un objet. La réponse JSON affichée mappe l'en-tête Content-Type
Dans la réponse HTTP à la clé ContentType
, mais elle correspond à l'en-tête Content-Type
Réel 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 lorsque j'utilise --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": {}
}
En utilisant également curl, nous pouvons voir que l'en-tête du 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
Dans la console AWS, vous pouvez saisir le type de contenu souhaité, même si le type de contenu n'est pas répertorié dans la liste déroulante.
Ce n'est pas ce que le PO recherchait, mais Google envoie beaucoup de gens ici.
Si vous souhaitez définir le type de contenu d'un objet qui est déjà sur S3 sans avoir à télécharger le --body
encore une fois, voir Comment changer le type de contenu des objets Amazon S