Мы пытаемся добавить несколько настраиваемых заголовков в наш облачный дистрибутив, но он работает не так, как ожидалось. Ниже приводится сценарий.
У нас есть корзина 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, но до тех пор это решение должно удовлетворять вашим требованиям.