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