Saltar al contenido

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

7 minutos de lectura
0

Quiero permitir el uso compartido de recursos entre orígenes (CORS) en mi bucket de Amazon Simple Storage Service (Amazon S3), pero aparece un error.

Solución

Nota: Si se muestran errores al ejecutar comandos de la Interfaz de la línea de comandos de AWS (AWS CLI), consulta Solución de problemas de AWS CLI. Además, asegúrate de utilizar la versión más reciente de la AWS CLI.

Puedes aplicar reglas de uso compartido de recursos entre orígenes (CORS) a tu bucket mediante la consola de Amazon S3 o la Interfaz de la línea de comandos de AWS (AWS CLI). 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 realizas una solicitud de origen cruzado a un bucket de Amazon S3 que no has configurado con una regla de CORS, el servidor web no devolverá el encabezado de CORS. Para probar las reglas de CORS en tu bucket de Amazon S3, usa el siguiente comando cURL:

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

Nota: Sustituye mycorsbucket por el nombre de tu bucket y sustituye www.example.com por la URL del servidor web desde el que solicitas contenido.

Si un servidor web hizo una solicitud similar a un sitio web de origen, el contenido que se recupere de tu bucket no se mostrará en el navegador. Para permitir que se muestre su contenido, configura una política de CORS en tu bucket de Amazon S3. Configura tu política de CORS para que se devuelvan los encabezados apropiados. Puedes 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 con la consola de Amazon S3

Para configurar una regla de CORS en tu bucket mediante la consola de Amazon S3, completa los siguientes pasos:

  1. Abre la consola de Amazon S3.

  2. Selecciona tu bucket.

  3. Selecciona la pestaña Permisos.

  4. En el panel Uso compartido de recursos entre orígenes, selecciona Editar.

  5. En el cuadro de texto, introduce la regla JSON CORS que quieras activar, como en el ejemplo siguiente:

    [
      {
        "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, consulta Configuración de CORS.

    Nota: Sustituye www.example.com por la URL del servidor web desde el que solicitas contenido.

  6. Elige Guardar.

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

Para configurar una regla de CORS en tu bucket con la AWS CLI, ejecuta 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: Sustituye mycorsbucket por el nombre de tu bucket y sustituye www.example.com por la URL del servidor web desde el que solicitas contenido.

Prueba de la regla de CORS

Para probar la regla de CORS, utiliza 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

Nota: Sustituye mycorsbucket por el nombre de tu bucket y sustituye www.example.com por la URL del servidor web desde el que solicitas contenido.

Si configuraste la regla de CORS correctamente, recibirás una respuesta 200 OK.

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

Si te encuentras un comportamiento inesperado al acceder a los buckets con CORS, prueba lo siguiente:

  1. Utiliza 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. Utiliza 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>

    Nota: Sustituye mycorsbucket por el nombre de tu bucket y sustituye www.example.com por la URL del servidor web desde el que solicitas contenido.

  2. Si la solicitud devuelve un error, comprueba que la configuración de CORS se haya aplicado en el bucket. Asegúrate de haber agregado el método necesario a la regla de CORS de tu bucket. Si la configuración de CORS está establecida, verás 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"]}]}'

    Nota: Sustituye mycorsbucket por el nombre de tu bucket y sustituye www.example.com por la URL del servidor web desde el que solicitas contenido.

  3. Prueba 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

    Nota: Sustituye mycorsbucket por el nombre de tu bucket y sustituye www.example.com por la URL del servidor web desde el que solicitas contenido.

  4. Captura toda la solicitud y la respuesta con la herramienta de tu elección.

Cada solicitud que reciba Amazon S3 debe tener una regla de CORS que coincida con los datos de tu solicitud. Comprueba que tu solicitud incluye lo siguiente:

  • Comprueba 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.
  • Verifica que el encabezado Origin de tu 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 configuras 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 tu solicitud no coinciden con el origen permitido en tu configuración.
  • Comprueba que el método de tu solicitud o solicitud preliminar que especificaste 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, comprueba que la regla CORSRule incluye las entradas AllowedHeader para cada valor del encabezado Access-Control-Request-Headers.

Información relacionada

Incorporación 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?

Solución de problemas de CORS