Comment configurer le CORS dans Amazon S3 et confirmer les règles dédiées à l'aide de cURL ?

Dernière mise à jour : 07/12/2021

Je souhaite autoriser l'accès aux ressources cross-origin dans mon compartiment Amazon Simple Storage Service (Amazon S3), mais je reçois un message d'erreur. Comment résoudre ce problème ?

Brève description

Vous pouvez appliquer des règles CORS (Cross-Origin Resource Sharing) à votre compartiment depuis la console Amazon S3 ou l'AWS Command Line Interface (AWS CLI). Pour tester les règles CORS sur votre compartiment Amazon S3, utilisez la commande cURL.

Solution

Le CORS est une fonction HTTP qui utilise des en-têtes pour autoriser les navigateurs à afficher le contenu demandé par un serveur web à partir d'une source différente. Lorsque vous envoyez une demande cross-origin à un compartiment Amazon S3 en l'absence de règle CORS définie, l'en-tête CORS n'est pas renvoyé.

Par exemple :

curl -i http://mycorsbucket.s3.amazonaws.com/cors-test.html -H "Origin: example.com"

HTTP/1.1 200 OK
x-amz-id-2: Va106gWx1uUDGbouopXfpjvjHW0VXydI8/VGlraf/62f2vvxtI+iAnmu7lF4MK2B6CxuzReyfRI=
x-amz-request-id: QWNNX1Y0MWFM152H
Date: Thu, 04 Nov 2021 18:52:55 GMT
Last-Modified: Thu, 04 Nov 2021 16:03:50 GMT
ETag: "cd4276d2cd5a2dc8ebcc1e04746680f6"
Accept-Ranges: bytes
Content-Type: text/html
Server: AmazonS3
Content-Length: 55

Si un serveur web a envoyé une demande similaire à un site Internet, le contenu récupéré dans votre compartiment n'apparaîtra pas dans votre navigateur. Pour y remédier, configurez une politique CORS dans votre compartiment Amazon S3. La configuration adéquate de la politique CORS veille à ce que les en-têtes appropriés soient renvoyés. Vous pouvez configurer une règle CORS sur votre compartiment depuis la console Amazon S3 ou l'AWS CLI.

Configuration d'une règle CORS depuis la console Amazon S3

Suivez ces étapes pour configurer une règle CORS dans votre compartiment à l'aide de la console Amazon S3 :

1.    Connectez-vous à la console de gestion AWS.

2.    Ouvrez la console Amazon S3.

3.    Sélectionnez votre compartiment.

4.    Sélectionnez l'onglet Permissions (Autorisations).

5.    Dans le volet Cross-origin resource sharing (Partage de ressources cross-origin), choisissez Edit (Modifier).

6.    Dans la zone de texte, saisissez la règle JSON CORS que vous souhaitez activer :

Example:

[
    {
        "AllowedHeaders": [
            "Authorization"
        ],
        "AllowedMethods": [
            "GET",
            "HEAD"
        ],
        "AllowedOrigins": [
            "example.com"
        ],
        "ExposeHeaders": [
            "Access-Control-Allow-Origin"
        ]
    }
]

Pour plus d'informations sur les éléments de règle CORS ou pour en consulter des exemples, reportez-vous à la rubrique Configuration CORS.

7.    Choisissez Save (Enregistrer).

Configuration d'une règle CORS à l'aide de l'AWS CLI

Exécutez la commande suivante afin de configurer une règle CORS dans votre compartiment depuis l'AWS CLI :

aws s3api put-bucket-cors --bucket mycorsbucket --cors-configuration '{"CORSRules" : [{"AllowedHeaders":["Authorization"],"AllowedMethods":["GET","HEAD"],"AllowedOrigins":["example.com"],"ExposeHeaders":["Access-Control-Allow-Origin"]}]}'

Remarque : en cas d'erreurs lors de l'exécution des commandes d'AWS CLI, vérifiez que vous utilisez la version la plus récente de l'AWS CLI.

Test de la règle CORS

Pour tester la règle CORS, utilisez la commande cURL, comme dans cet exemple :

curl -i http://mycorsbucket.s3.amazonaws.com/index.html -H "Origin: example.com"

HTTP/1.1 200 OK
x-amz-id-2: d5Jsw1vCf8tR3cMdXrtcTKYgczU/1pjxahnrw7C6jU1fLo8py2Nv2kpeFs8pYPruVZg6Y3JuRUA=
x-amz-request-id: BMCCY18E58B3GBWV
Date: Thu, 04 Nov 2021 19:12:26 GMT
Access-Control-Allow-Origin: example.com
Access-Control-Allow-Methods: GET, HEAD
Access-Control-Expose-Headers: Access-Control-Allow-Origin
Access-Control-Allow-Credentials: true
Vary: Origin, Access-Control-Request-Headers, Access-Control-Request-Method
Last-Modified: Thu, 04 Nov 2021 16:03:50 GMT
ETag: "cd4276d2cd5a2dc8ebcc1e04746680f6"
Accept-Ranges: bytes
Content-Type: text/html
Server: AmazonS3
Content-Length: 55

Si la règle CORS est correctement configurée, vous recevez une réponse 200 OK.

Dépannage des méthodes CORS

Vous pouvez également utiliser la commande cURL pour effectuer des requêtes à l'aide de méthodes CORS spécifiques en ajoutant l'indicateur -H "Access-Control-Request-Method: <Method>". Cet indicateur spécifie la méthode CORS à tester. Utilisez l'indicateur --request OPTIONS pour effectuer une vérification en amont.

Remarque : Amazon S3 prend en charge les méthodes GET, HEAD, PUT, POST et DELETE.

curl -i http://mycorsbucket.s3.amazonaws.com/cors-test.html -H "Access-Control-Request-Method: POST" --request OPTIONS -H "Origin: example.com"
HTTP/1.1 403 Forbidden
x-amz-request-id: 190J4Q6222HA2KZ5
x-amz-id-2: 6oEci3qg88OeoLvBGwkN8K9AGdxyVela8ZKxftXMqyWrtZFfiKMrBwpTAeRiOth8amovJMtAAdA=
Content-Type: application/xml
Transfer-Encoding: chunked
Date: Fri, 19 Nov 2021 18:43:38 GMT
Server: AmazonS3

<?xml version="1.0" encoding="UTF-8"?>
<Error><Code>AccessForbidden</Code><Message>CORSResponse: This CORS request is not allowed. This is usually because the evalution of Origin, request method / Access-Control-Request-Method or Access-Control-Request-Headers are not whitelisted by the resource's CORS spec.</Message><Method>POST</Method><ResourceType>OBJECT</ResourceType><RequestId>190J4Q6222HA2KZ5</RequestId><HostId>6oEci3qg88OeoLvBGwkN8K9AGdxyVela8ZKxftXMqyWrtZFfiKMrBwpTAeRiOth8amovJMtAAdA=</HostId></Error>

Si la demande renvoie une erreur, ajoutez la méthode requise à la règle CORS de votre compartiment :

aws s3api put-bucket-cors --bucket mycorsbucket --cors-configuration '{"CORSRules" : [{"AllowedHeaders":["Authorization"],"AllowedMethods":["GET","HEAD","POST"],"AllowedOrigins":["example.com"],"ExposeHeaders":["Access-Control-Allow-Origin"]}]}'

Testez la règle CORS mise à jour. Si votre méthode fonctionne comme prévu, vous recevez la réponse suivante :

curl -i http://mycorsbucket.s3.amazonaws.com/index.html -H "Access-Control-Request-Method: POST" -X OPTIONS -H "Origin: example.com"
HTTP/1.1 200 OK
x-amz-id-2: Cx4kuM31KPVE19woEPRRYxF+85vEWkLk8+M0p6BIb72T550njMnmLtjqRgYzuxKelR0f+cxhFqI=
x-amz-request-id: QBSHV46QK43HGW15
Date: Fri, 19 Nov 2021 18:48:21 GMT
Access-Control-Allow-Origin: example.com
Access-Control-Allow-Methods: GET, HEAD, POST
Access-Control-Expose-Headers: Access-Control-Allow-Origin
Access-Control-Allow-Credentials: true
Vary: Origin, Access-Control-Request-Headers, Access-Control-Request-Method
Server: AmazonS3
Content-Length: 0