Доступ к исходному URL из AWS lambda@edge
Я пытаюсь реализовать "прокси" для нескольких веб-сайтов, используя lambda@edge в AWS Cloudfront.
Моя установка примерно:
DNS: *.domain.com -> some_uuid.cloudfront.net (дистрибутив Cloudfront)
Cloudfront: some_uuid.cloudfront.net -> источник корзины s3
s3 bucket: sites/ (папка, содержащая несколько веб-сайтов)
Функция lambda@edge: определяется как origin-запрос
Моя функция lambda@edge довольно проста:
проверьте, существует ли ресурс сайта в корзине s3.
если это так, измените uri запроса на URL ресурса s3.
если нет, отправьте запрос на внутренний сервер для рендеринга ресурса, сохраните его на s3 и верните его.
У меня проблемы с получением исходного домена сайта. Например, если я пытаюсь получить доступ к "my_website.domain.com" - в моей лямбда-функции у меня нет этой информации о домене из запроса.
Я думаю, что могу реализовать другую функцию lambda@edge в качестве запроса средства просмотра, чтобы передать домен в качестве заголовка, но если я могу, я предпочитаю избегать этого.
Есть ли другое решение?
Спасибо
2 ответа
Таким образом, проблема вашего варианта использования заключается в том, что значение заголовка хоста, доступного для вашей функции L@E исходного запроса, является доменным именем корзины s3, а не исходным заголовком хоста, который CloudFront получил от средства просмотра, верно?
Для того чтобы увидеть исходный заголовок Host CloudFront, полученный от зрителя, необходимо внести его в белый список. Однако CloudFront в настоящее время не позволяет включать заголовки в белый список для источников s3. Это ошибка / ограничение, которое должно быть исправлено CloudFront. Хотя есть обходной путь. Если корзина s3 общедоступна (т.е. вы не используете идентификацию доступа к источнику), вы можете настроить источник S3 в качестве пользовательского источника, используя конечную точку веб-сайта, такую как mybucket.s3-website-us-east-1.amazonaws.com. Затем вы сможете внести в белый список заголовок хоста и увидеть доменное имя вашего сайта в соответствии с запросом зрителя. Затем вы можете изменить исходный запрос в соответствии с вашим вариантом использования. Не забудьте также изменить заголовок узла обратно на конечную точку s3, чтобы S3 мог принять запрос.
Основная проблема заключается в том, что Cloudfront перезаписывает заголовок узла в запросе к узлу источника. Я смог обойти это, используя комбинацию запроса зрителя L@E и запроса источника L@E.
В запросе средства просмотра L@E скопируйте заголовок узла в другой заголовок, такой как x-forwarded-host.
// viewer-request.js
exports.handler = (event, context, callback) => {
const request = event.Records[0].cf.request
request.headers['x-forwarded-host'] = [
{ key: 'X-Forwarded-Host', value: request.headers.host[0].value }
]
return callback(null, request)
}
Настройте ваш облачный фронт на белый список x-forwarded-host
заголовок хоста в поведении. Таким образом, Cloudfront также принимает во внимание x-forwarded-host
при кэшировании, а также передает заголовок origin-request lambda
,
Так что теперь в вашем лямбда-запросе origin вы можете получить доступ к x-forwarded-host
заголовок
// origin-request.js
exports.handler = (event, context, callback) => {
const request = event.Records[0].cf.request;
const headers = request.headers;
const requestHost = headers['x-forwarded-host'][0].value;
console.log(requestHost);
callback(null, request);
}