Como configuro o CORS no Amazon S3 e confirmo as regras do CORS usando cURL?

Data da última atualização: 07/12/2021

Quero permitir o acesso entre origens a recursos no meu bucket do Amazon Simple Storage Service (Amazon S3), mas estou recebendo um erro. Como resolver esse problema?

Breve descrição

Você pode aplicar regras de compartilhamento de recursos de origem cruzada (CORS) ao seu bucket usando o console do Amazon S3 ou a AWS Command Line Interface (AWS CLI). Para testar as regras do CORS no seu bucket do Amazon S3, use o comando cURL.

Resolução

O CORS é um recurso do HTTP que usa cabeçalhos para permitir que os navegadores exibam o conteúdo que um servidor Web solicitou de uma origem diferente. Se você fizer uma solicitação entre origens para um bucket do Amazon S3 que não esteja definido por uma regra do CORS, o cabeçalho do CORS não será retornado.

Por exemplo:

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 um servidor Web tiver feito uma solicitação semelhante a um site, o conteúdo recuperado do seu bucket não aparecerá no navegador. Para permitir que o conteúdo apareça, configure uma política do CORS no bucket do Amazon S3. A devida configuração da política do CORS garante que os cabeçalhos apropriados sejam retornados. Você pode configurar uma regra do CORS no seu bucket usando o console do Amazon S3 ou a AWS CLI.

Configurar uma regra do CORS usando o console do Amazon S3

Para configurar uma regra do CORS no seu bucket usando o console do Amazon S3, execute as seguintes etapas:

1.    Conecte-se ao Console de Gerenciamento da AWS.

2.    Abra o console do Amazon S3.

3.    Selecione seu bucket.

4.    Escolha a guia Permissions (Permissões).

5.    No painel Cross-origin resource sharing (Compartilhamento de recursos entre origens), escolha Edit (Editar).

6.    Na caixa de texto, insira a regra JSON do CORS que você deseja ativar:

Example:

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

Para obter mais informações sobre cada um dos elementos de regras do CORS ou regras de exemplo, consulte Configuração do CORS.

7.    Escolha Save (Salvar).

Configurar uma regra do CORS usando a AWS CLI

Para configurar uma regra do CORS no seu bucket usando a AWS CLI, execute o seguinte comando:

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

Observação: se você receber erros ao executar comandos da AWS CLI, verifique se está usando a versão mais recente da AWS CLI.

Testar a regra do CORS

Para testar a regra do CORS, use o comando cURL, assim:

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 a regra do CORS estiver configurada corretamente, você receberá uma resposta 200 OK.

Solução de problemas com métodos do CORS

Você também pode usar o comando cURL para fazer solicitações usando métodos do CORS específicos, adicionando o sinalizador -H "Access-Control-Request-Method:<Method>". Esse sinalizador especifica o método do CORS a ser testado. Use o sinalizador --request OPTIONS para realizar uma verificação de comprovação da solicitação.

Observação: o Amazon S3 oferece suporte aos métodos 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 a solicitação retornar um erro, adicione o método necessário à regra do CORS no seu 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"]}]}'

Teste a regra do CORS atualizada. Se o método funcionar conforme o esperado, você receberá a seguinte resposta:

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