TLDR: Мы должны обмануть кэширование CloudFront 307 путем создания нового поведения кэша для ответов от нашей лямбда-функции.Обновите изображения на лету в CloudFront и сразу же получите их одним и тем же URL: AWS CloudFront -> S3 -> Lambda -> CloudFront
Вы не поверите, насколько мы должны достичь этого. На последнем шаге мы так сильно застряли.
Бизнес-кейс:
Наши магазины приложений изображения в S3 и служит их CloudFront для того, чтобы избежать каких-либо географических медленного падения по всему земному шару. Теперь мы хотим быть очень гибкими с дизайном и иметь возможность запрашивать новые параметры изображения непосредственно в URL CouldFront! Каждый новый размер будет создан по требованию, а затем сохранен в S3, поэтому во второй раз он будет запрошен, будет , который будет работать очень быстро, поскольку он будет существовать в S3, а также будет кэшироваться в CloudFront.
Скажем, пользователь загрузил изображение chucknorris.jpg. только исходное изображение будет сохранено в S3 и Виль быть подан на нашей странице, как это:
//xxxxx.cloudfront.net/chucknorris.jpg
Мы подсчитали, что нам нужно, чтобы отобразить миниатюру 200x200 пикселей. Поэтому мы ставим СРК изображение, чтобы быть в нашем шаблоне:
//xxxxx.cloudfront.net/chucknorris-200x200.jpg
Когда этот новый размер запрашивается Амазонка веб-службы должны обеспечить его летать в том же ковше и с запрошенным ключом. Таким образом, изображение будет загружено в тот же URL-адрес CloudFront.
Я сделал некрасивый рисунок с обзором архитектуры и рабочего процесса о том, как мы делаем это в AWS:
Вот как Python Lambda заканчивается:
return {
'statusCode': '301',
'headers': {'location': redirect_url},
'body': ''
}
Проблема :
Если мы переадресуем функцию Lambda на S3, она работает как шарм. Если мы перенаправляемся на CloudFront, он переходит в цикл перенаправления, потому что CloudFront кэширует 307 (а также 301, 302 и 303). Как только наша функция Lambda перенаправляет CloudFront, CloudFront вызывает API Getaway URL вместо извлечения изображения из S3:
Я хотел бы создать новое поведение кэша в закладке Behaviors
настройки CloudFront в. Это поведение не должно кэшировать ответы от Lambda или S3 (не знаю, что именно там происходит внутри), но все равно следует кэшировать любые последующие запросы на это изображение с одинаковым размером. Я пытаюсь установить шаблон пути -\d+x\d+\..+$
, добавьте ARN функции лямбда в добавлении «Ассоциация функций лямбда» и установите тип события Origin Response
. Рядом с этим, я устанавливаю «TTL по умолчанию» на 0
.
Но я не могу сохранить поведение из-за какой-то ошибки:
ли мы на правильном пути, или идея этой «ассоциации лямбда-функции» совершенно по-другому?
Вы должны связаться со службой поддержки AWS относительно этого сообщения об ошибке. Кроме того, вы посмотрели новую функцию Lambda @ Edge от Cloudfront? –