Não é possível adicionar cabeçalhos personalizados à distribuição do CloudFront - usando s3 como backend

2

Estamos tentando colocar alguns cabeçalhos personalizados em nossa distribuição do cloud fount, mas isso não está funcionando como esperado. A seguir, o cenário.

Temos um bucket s3 chamado "example-images" com todo o conteúdo estático, o bucket s3 é exposto para acesso público. Tem a seguinte política de CORS

<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
    <CORSRule>
        <AllowedOrigin>*</AllowedOrigin>
        <AllowedMethod>GET</AllowedMethod>
        <ExposeHeader>Access-Control-Allow-Credentials</ExposeHeader>
        <AllowedHeader>*</AllowedHeader>
    </CORSRule>
</CORSConfiguration>

Podemos acessar o conteúdo do s3 por meio de URL seguindo a saída da amostra usando o curl.

x-amz-id-2: xxxxxxxxxxxx
x-amz-request-id: xxxxxxxxxxxx
Date: Wed, 05 Oct 2016 04:10:26 GMT
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: GET
Access-Control-Expose-Headers: Access-Control-Allow-Credentials
Vary: Origin, Access-Control-Request-Headers, Access-Control-Request-Method
Last-Modified: Mon, 26 Sep 2016 13:12:58 GMT
ETag: "xxxxxxxxxxxxxx"
Accept-Ranges: bytes
Content-Type: image/png
Content-Length: 1630
Server: AmazonS3

Em seguida, criamos uma distribuição em nuvem para veicular esses conteúdos.

Conforme a documentação, temos os seguintes valores definidos em "Origem padrão"

  • Restrict bucket access = no
  • Oringnal custom headers Some custom header

    e.g. "Access-Control-Allow-Credentials = true"

Na distribuição "Comportamento" do CF, temos as seguintes configurações.

  • Protocol policy = http & https
  • Allow http methods = GET, HEAD, OPTIONS.
  • Forward Headers = whitelist
  • Whitelist headers = Origin
  • Object Caching = Use origin cache headers

Ainda assim, não podemos visualizar os cabeçalhos personalizados ao usar o URL de distribuição do CF.

curl -sI -H "Origin: example.com" -H "Access-Control-Request-Method: GET" -H "Access-Control-Allow-Credentials: GET"
HTTP/1.1 200 OK
Content-Type: image/png
Content-Length: 1630
Connection: keep-alive
Date: Wed, 05 Oct 2016 04:03:20 GMT
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: GET
Access-Control-Expose-Headers: Access-Control-Allow-Credentials
Last-Modified: Mon, 26 Sep 2016 13:12:58 GMT
ETag: "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
Accept-Ranges: bytes
Server: AmazonS3
Vary: Origin
Age: 1231
X-Cache: Hit from cloudfront
Via: 1.1 xxxxxxxx.cloudfront.net (CloudFront)
X-Amz-Cf-Id: xxxxxxxxxxxxxxxxxxxxx

Você pode nos ajudar a identificar o cenário que está faltando aqui?

    
por vasco.debian 05.10.2016 / 06:37

1 resposta

1

Você pode adicionar cabeçalhos personalizados à resposta do CloudFront / S3 usando um Lambda @ Edge função. O código lambda é executado dentro dos locais de borda locais, mas precisa ser criado e mantido na região us-east-1 .

O código de exemplo aqui usa nodeJS 6.10 para adicionar o cabeçalho de resposta x-frame-options , mas você pode adicionar qualquer cabeçalho que não seja restricted da AWS.

'use strict'; 
 exports.handler = (event, context, callback) => {
   const response = event.Records[0].cf.response; 
   const headers = response.headers; 
   response.headers['x-frame-options'] = [{"key":"X-Frame-Options","value":"SAMEORIGIN"}]; 
   console.log(response.headers); 
   callback(null, response);
 }; 

Crie uma versão definitiva do Lambda e defina a configuração do acionador da versão Lambda como o tipo de evento origin-response do CloudFront para seu comportamento de padrão de caminho.

O código de exemplo registra eventos no serviço de logs do CloudWatch para fins de depuração. Se você ainda não tiver uma, precisará configurar uma função IAM de execução lambda que permita uma política que permita que as ações de logs do CloudWatch sejam assumidas por edgelambda.amazonaws.com e lambda.amazonaws.com .

Política básica de execução de lambda que permite que os registros sejam gravados no CloudWatch:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "logs:CreateLogGroup",
                "logs:CreateLogStream",
                "logs:PutLogEvents"
            ],
            "Resource": "arn:aws:logs:*:*:*",
            "Effect": "Allow"
        }
    ]
}

Confie no Relacionamento, permitindo que o Lambda e o Lambda @ Edge assumam o papel:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": [
          "edgelambda.amazonaws.com",
          "lambda.amazonaws.com"
        ]
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

Seria melhor se a AWS simplesmente permitisse que os cabeçalhos personalizados fossem definidos usando a GUI do CloudFront, mas até lá essa solução deveria satisfazer sua necessidade.

    
por 06.12.2017 / 05:12