¿Cómo puedo configurar CORS en Amazon S3 y confirmar las reglas de CORS mediante cURL?

6 minutos de lectura
0

Quiero permitir el acceso entre orígenes a los recursos de mi bucket de Amazon Simple Storage Service (Amazon S3), pero aparece un error.

Resolución

Puede aplicar reglas de uso compartido de recursos entre orígenes (CORS) a su bucket mediante la consola de Amazon S3 o la Interfaz de la línea de comandos de AWS (AWS CLI). Para probar las reglas de CORS en su bucket de Amazon S3, utilice el comando cURL. CORS es una característica de HTTP que utiliza encabezados para permitir a los navegadores mostrar el contenido que un servidor web solicitó desde un origen diferente. Si hace una solicitud entre orígenes a un bucket de Amazon S3 que no esté definido por una regla CORS, no se devolverá el encabezado de CORS.

Por ejemplo:

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

Si un servidor web hizo una solicitud similar a un sitio web, el contenido que se recupere de su bucket no se mostrará en su navegador. Para permitir que se muestre su contenido, configure una política de CORS en su bucket de Amazon S3. Configurar correctamente la política de CORS garantiza que se devuelvan los encabezados adecuados. Puede configurar una regla de CORS en su bucket mediante la consola de Amazon S3 o la AWS CLI.

Configuración de una regla de CORS mediante la consola de Amazon S3

Para configurar una regla de CORS en su bucket mediante la consola de Amazon S3, lleve a cabo los siguientes pasos:

1.    Inicie sesión en la Consola de administración de AWS.

2.    Abra la consola de Amazon S3.

3.    Seleccione su bucket.

4.    Elija la pestaña Permisos.

5.    En el panel Uso compartido de recursos entre orígenes, seleccione Editar.

6.    En el cuadro de texto, introduzca la regla de CORS JSON que quiera activar:

Example:

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

Para obtener más información sobre cada uno de los elementos de la regla de CORS o reglas de ejemplo, consulte Configuración de CORS.

7.    Seleccione Guardar.

Configuración de una regla de CORS mediante la AWS CLI

Para configurar una regla de CORS en su bucket mediante la AWS CLI, ejecute el siguiente 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: Si se muestran errores al ejecutar comandos de AWS CLI, compruebe si está utilizando la versión más reciente de AWS CLI.

Cómo probar la regla de CORS

Para probar la regla de CORS, utilice el comando cURL de la siguiente manera:

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

Si la regla de CORS está configurada correctamente, se mostrará una respuesta 200 OK.

Solución de problemas de los métodos de CORS

Si encuentra un comportamiento inesperado al acceder a los buckets con la configuración de CORS, pruebe lo siguiente:

1.    Utilice el comando cURL para hacer solicitudes con métodos de CORS específicos añadiendo la marca -H «Access-Control-Request-Method: <Method>». Esta marca especifica el método de CORS que se va a probar. Utilice la marca --request OPTIONS para efectuar una verificación preliminar de la solicitud.

Nota: Amazon S3 admite los métodos GET, HEAD, PUT, POST y 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.    Si la solicitud devuelve un error, compruebe que la configuración de CORS se haya aplicado en el bucket. Asegúrese de haber agregado el método necesario a la regla de CORS de su bucket. Si la configuración de CORS está establecida, verá la opción de editar la configuración de CORS en la sección Permisos del bucket en la consola S3.

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.    Pruebe la regla de CORS actualizada. Si el método funciona según lo previsto, se mostrará la siguiente respuesta:

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.    Capture toda la solicitud y la respuesta con la herramienta de su elección. Para cada solicitud que reciba Amazon S3, debe tener una regla de CORS que coincida con los datos de su solicitud.

  • Compruebe que la solicitud tenga el encabezado Origin. Si falta el encabezado, Amazon S3 no trata la solicitud como una solicitud entre orígenes y no envía encabezados de respuesta de CORS en la respuesta.
  • Verifique que el encabezado Origin de su solicitud coincida con al menos uno de los elementos AllowedOrigins de la regla CORSRule especificada. Los valores de esquema, host y puerto del encabezado de la solicitud Origin deben coincidir con los elementos AllowedOrigins de la regla CORSRule. Por ejemplo, supongamos que configura la regla CORSRule para permitir el origen http://www.example.com. Al hacerlo, los orígenes https://www.example.com y http://www.example.com:80 de su solicitud no coinciden con el origen permitido en su configuración.
  • Compruebe que el método de su solicitud o solicitud preliminar (el método que se especifica en Access-Control-Request-Method) sea uno de los elementos AllowedMethods de la misma regla CORSRule.
  • Si una solicitud preliminar incluye un encabezado Access-Control-Request-Headers, compruebe que la regla CORSRule incluya las entradas AllowedHeader para cada valor del encabezado Access-Control-Request-Headers.

Información relacionada

Añadido o eliminación de encabezados HTTP en las respuestas de CloudFront con una política

¿Cómo puedo solucionar el error «No "Access-Control-Allow-Origin" header is present on the requested resource» de CloudFront?

¿Cómo evalúa Amazon S3 la configuración de CORS en un bucket?

Solucionar problemas de CORS

OFICIAL DE AWS
OFICIAL DE AWSActualizada hace un año