Come posso configurare CORS in Amazon S3 e confermare le regole CORS utilizzando cURL?

Ultimo aggiornamento: 07/12/2021

Desidero consentire l'accesso tra origini alle risorse nel mio bucket Amazon Simple Storage Service (Amazon S3), ma viene visualizzato un errore. Come si risolve questo problema?

Breve descrizione

Puoi applicare regole CORS (Cross-Origin Resource Sharing) al tuo bucket utilizzando la console Amazon S3 o l'AWS Command Line Interface (AWS CLI). Per testare le regole CORS sul tuo bucket Amazon S3, usa il comando cURL.

Risoluzione

CORS è una caratteristica di HTTP che utilizza le intestazioni per consentire ai browser di visualizzare contenuti richiesti da un server Web da un'origine diversa. Se effettui una richiesta tra origini a un bucket Amazon S3 non definito da una regola CORS, l'intestazione CORS non viene restituita.

Ad esempio:

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

Se un server Web ha effettuato una richiesta simile a un sito Web, il contenuto recuperato dal tuo bucket non verrà visualizzato nel tuo browser. Per consentire la visualizzazione dei contenuti, configura una policy CORS sul tuo bucket Amazon S3. La corretta configurazione della policy CORS assicura che vengano restituite le intestazioni appropriate. Puoi configurare una regola CORS sul tuo bucket utilizzando la console Amazon S3 o l'AWS CLI.

Configurazione di una regola CORS utilizzando la console Amazon S3

Per configurare una regola CORS sul tuo bucket utilizzando la console Amazon S3, procedi come segue:

1.    Accedi alla Gestione della Console AWS

2.    Apri la console Amazon S3.

3.    Seleziona il tuo bucket.

4.    Seleziona la scheda Permissions (Autorizzazioni).

5.    Nel riquadro Condivisione delle risorse multiorigine, scegli Edit (Modifica).

6.    Nella casella di testo, inserisci la regola JSON CORS che desideri attivare:

Example:

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

Per ulteriori informazioni su ciascuno degli elementi della regola CORS o delle regole di esempio, vedere Configurazione CORS.

7.    Scegli Save (Salva).

Configurazione di una regola CORS utilizzando l'AWS CLI

Per configurare una regola CORS sul tuo bucket utilizzando l'AWS CLI, esegui il seguente comando:

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

Nota: se ricevi un messaggio di errore durante l’esecuzione dei comandi di AWS CLI, assicurati di utilizzare la versione più recente di AWS CLI.

Testare la regola CORS

Per testare la regola CORS, utilizza il comando cURL, in questo modo:

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

Se la regola CORS è configurata correttamente, si riceve una risposta 200 OK.

Risoluzione dei problemi dei metodi CORS

È inoltre possibile utilizzare il comando cURL per effettuare richieste utilizzando metodi CORS specifici aggiungendo il contrassegno -H "Access-Control-Request-Method: <Method>". Questo contrassegno specifica il metodo CORS da testare. Utilizza il contrassegno --request OPTIONS per eseguire un controllo preliminare della richiesta.

Nota: Amazon S3 supporta i metodi GET, HEAD, PUT, POST e 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>

Se la richiesta restituisce un errore, aggiungi il metodo richiesto alla regola CORS sul tuo bucket:

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

Verifica la regola CORS aggiornata. Se il tuo metodo funziona come previsto, riceverai la seguente risposta:

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