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

5 minuti di lettura
0

Desidero consentire l'accesso multiorigine alle risorse nel bucket Amazon Simple Storage Service (Amazon S3), ma ricevo un errore.

Soluzione

Puoi applicare le regole di condivisione delle risorse multiorigine (CORS) al bucket utilizzando la console Amazon S3 o l'interfaccia della linea di comando AWS (AWS CLI). Per testare le regole CORS sul bucket Amazon S3, usa il comando cURL. CORS è una funzionalità di HTTP che utilizza le intestazioni per consentire ai browser di visualizzare da un’origine diversa il contenuto richiesto da un server Web. Se effettui una richiesta multiorigine a un bucket Amazon S3 che 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: http://www.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 bucket non verrà visualizzato nel browser. Per consentire la visualizzazione dei tuoi contenuti, configura una policy CORS sul bucket Amazon S3. La corretta configurazione della policy CORS assicura che vengano restituite le intestazioni appropriate. Puoi configurare una regola CORS sul bucket utilizzando la console Amazon S3 o AWS CLI.

Configurazione di una regola CORS utilizzando la console Amazon S3

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

1.    Accedi alla Console di gestione AWS.

2.    Apri la console di Amazon S3.

3.    Seleziona il bucket.

4.    Scegli la scheda Autorizzazioni.

5.    Nel riquadro Condivisione delle risorse multiorigine, scegli Modifica.

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

Example:

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

Per ulteriori informazioni su ciascuno degli elementi delle regole CORS o regole di esempio, consulta CORS configuration.

7.    Scegli Salva.

Configurazione di una regola CORS utilizzando AWS CLI

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

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

Nota: se ricevi errori durante l'esecuzione dei comandi dell'interfaccia della linea di comando (AWS CLI), assicurati di utilizzare la versione più recente di AWS CLI.

Verifica della 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: http://www.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: http://www.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, riceverai una risposta 200 OK.

Risoluzione dei problemi relativi ai metodi CORS

Se riscontri un comportamento imprevisto durante l'accesso ai bucket con la configurazione CORS, prova quanto segue:

1.    Usa il comando cURL per effettuare richieste utilizzando metodi CORS specifici aggiungendo il flag -H "Access-Control-Request-Method: <Method>[Metodo]". Questo flag specifica il metodo CORS da testare. Usa il flag --request OPTIONS per eseguire un controllo preflight 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: http://www.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>

2.    Se la richiesta restituisce un errore, verifica che la configurazione CORS sia impostata nel bucket. Assicurati di avere aggiunto il metodo richiesto alla regola CORS sul bucket. Se la configurazione CORS è impostata, nella sezione Autorizzazioni del bucket nella console S3 verrà visualizzata l'opzione per modificare la configurazione CORS.

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

3.    Verifica la regola CORS aggiornata. Se il 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: http://www.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: http://www.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

4.    Acquisisci la richiesta e la risposta complete utilizzando uno strumento a tua scelta. Per ogni richiesta ricevuta da Amazon S3, è necessario disporre di una regola CORS che corrisponda ai dati contenuti nella richiesta.

  • Verifica che la richiesta abbia l'intestazione Origin. Se manca l'intestazione, Amazon S3 non considera la richiesta come una richiesta multiorigine e non invia intestazioni di risposta CORS nella risposta.
  • Verifica che l'intestazione Origin nella richiesta corrisponda ad almeno uno degli elementi AllowedOrigins nella CORSRule specificata. I valori di schema, host e porta nell'intestazione della richiesta Origin devono corrispondere agli elementi AllowedOrigins in CORSRule. Ad esempio, supponiamo di impostare CORSRule per consentire l'origine http://www.example.com. Quando si esegue questa operazione, le origini https://www.example.com e http://www.example.com:80 nella richiesta non corrispondono all'origine consentita nella configurazione.
  • Verifica che il metodo nella tua richiesta o richiesta preflight (metodo specificato in Access-Control-Request-Method) sia uno degli elementi AllowedMethods nella stessa CORSRule.
  • Se una richiesta preflight include un'intestazione Access-Control-Request-Headers, verifica che CORSRule includa le voci AllowedHeader per ogni valore nell'intestazione Access-Control-Request-Headers.

Informazioni correlate

Adding HTTP headers to Amazon CloudFront responses

Come posso risolvere l'errore "Nessuna intestazione 'Access-Control-Allow-Origin' presente nella risorsa richiesta" di CloudFront?

How does Amazon S3 evaluate the CORS configuration on a bucket?

Troubleshoot CORS

AWS UFFICIALE
AWS UFFICIALEAggiornata un anno fa