Назад | Перейти на главную страницу

Невозможно добавить пользовательские заголовки в распространение CloudFront - использование s3 в качестве серверной части

Мы пытаемся добавить несколько настраиваемых заголовков в наш облачный дистрибутив, но он работает не так, как ожидалось. Ниже приводится сценарий.

У нас есть корзина s3 с именем "example-images" со всем статическим содержимым, корзина s3 доступна для общего доступа. Имеет следующую политику 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>

Мы можем получить доступ к содержимому s3 через URL-адрес после примера вывода, используя 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

Затем мы создали облачный дистрибутив для обслуживания этого контента.

Согласно документации, у нас есть следующие значения, установленные в "Происхождении по умолчанию"

  • Ограничить доступ к корзине = нет
  • Обычные настраиваемые заголовки Некоторые настраиваемые заголовки

    например "Access-Control-Allow-Credentials = true"

В раздаче CF "Поведение" у нас есть следующие настройки.

  • Политика протокола = http и https
  • Разрешить http методы = GET, HEAD, OPTIONS.
  • Перенаправленные заголовки = белый список
  • Заголовки белого списка = Источник
  • Кэширование объектов = использовать заголовки исходного кеша

Тем не менее, мы не можем просматривать пользовательские заголовки при использовании URL-адреса CF Distribution.

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

Не могли бы вы помочь нам определить, какие настройки нам здесь не хватает.

Вы можете добавить собственные заголовки к ответу от CloudFront / S3, используя Лямбда @ Edge функция. Лямбда-код выполняется в локальных периферийных местоположениях, но его необходимо создавать и поддерживать в us-east-1 область.

В примере кода здесь используется nodeJS 6.10 для добавления x-frame-options заголовок ответа, но вы можете добавить любой заголовок, который не ограниченный компании 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);
 }; 

Создайте окончательную версию Lambda, затем установите конфигурацию триггера Lambda Version как CloudFront. origin-response Тип события для поведения вашего шаблона пути.

В этом примере кода события регистрируются в службе журналов CloudWatch для целей отладки. Если у вас его еще нет, вам необходимо настроить роль IAM для выполнения лямбда-выражения, которая позволяет использовать политику, позволяющую выполнять действия журналов CloudWatch. edgelambda.amazonaws.com и lambda.amazonaws.com.

Базовая политика выполнения Lambda, позволяющая записывать журналы в CloudWatch:

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

Отношения доверия, позволяющие Lambda и Lambda @ Edge взять на себя роль:

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

Было бы лучше, если бы AWS просто позволял настраивать пользовательские заголовки с помощью графического интерфейса CloudFront, но до тех пор это решение должно удовлетворять вашим требованиям.