То, что вы написали, должно работать, но я думаю, что лучшей реализацией было бы просто изменить URI в OriginRequest лямбда-функции. Код такой простой, как:
import json
def lambda_handler(event, context):
request = event['Records'][0]['cf']['request'];
request['uri'] = "anything";
return request;
Интересная деталь, которую следует здесь отметить, заключается в том, что CF будет кэшировать результат измененного URI по сравнению с исходным URI. Таким образом, если запрос снова приходит на исходный URI, CloudFront возвращает ответ непосредственно из кэша.
Почему запрос источника?
- Поскольку он инициировантолько при отсутствии кеша
- Это помогает получить преимущество кеша, описанного выше
Почему этот способ лучше по сравнению с тем, что вы предложили?
Если вы решите использовать вышеупомянутый подход , поток запросов будет следующим:
Для не кэшированного контента:
User -> CF -> Lambda -> S3 -> Final response to the user
Для кэшированного контента:
User -> CF -> Final response to the user
Принимая во внимание, что если вы используете Lambda для генерации 301 , поток будет:
Для не кэшированного содержимого:
User -> CF -> Lambda -> User -> CF -> Lambda -> S3 -> Final response to the user
Для кэшированного содержимого:
User -> CF(cf returns 301) -> User -> CF -> Final response to the user
Таким образом, вы получаете два преимущества в этом подходе:
- Меньшая задержка для вашего пользователя.
- Меньший лямбда-вызов, что означаетменьший счет для вас.
На ваш второй вопрос , я не думаю, что естьспособ вызвать Lambda @ Edge только для 404-х годов на данный момент.
Надеюсь, это поможет!