Спасибо @thomasmichaelwallace за указание на мой пост на форуме AWS, который объясняет способ вставки заголовка исходного запроса Host
в альтернативный заголовок запроса с использованием триггера Lambda @ Edge Origin Request.Это одно из решений, но для него требуется лямбда-триггер, поэтому есть дополнительные издержки и затраты.Это решение на самом деле касалось дистрибутива CloudFront, который обрабатывает несколько доменных имен, но должен отправить один заголовок Host
во внутреннее приложение, одновременно предупреждая приложение о другом заголовке запроса, который я произвольно назвал X-Forwarded-Host
.
Существуют альтернативы.
Если дистрибутив CloudFront обрабатывает только одно входящее имя хоста, вы можете просто настроить статический настраиваемый заголовок источника .Они безоговорочно вводятся в запросы CloudFront (и если исходный запросчик устанавливает такой заголовок, он отбрасывается до того, как настроенный заголовок будет введен).Установите X-Forwarded-Host: api.example.com
, и он будет введен во все запросы и видим на API Gateway.
Это самое простое решение, и в зависимости от того, что в вопросе, оно должно работать.
Но интуитивно понятныйрешение не работает - вы не можете просто внести в белый список заголовок Host
для пересылки к источнику, потому что это не то, что ожидает API-шлюз.
Но там должно бытьспособ заставить его ожидать этот заголовок.
Следующее основано на ряде наблюдений, которые являются точными, независимо, но я не проверял их все вместе.Вот идея:
- использовать развертывание регионального API-шлюза, а не Edge-Optimized.В любом случае вам не нужно оптимизированное по краям развертывание, когда вы используете собственный дистрибутив CloudFront, потому что это увеличивает задержку, отправляя запрос через сеть CloudFront с избыточностью.Это также не будет работать в этой настройке.
- настроить ваш API как настраиваемый домен (для вашего открытого домена)
- , подключив соответствующий сертификат к API-шлюзу, но
- делать, не указывать DNS на назначенное региональное доменное имя, которое дает вам API Gateway;вместо этого
- использует назначенное имя хоста региональной конечной точки в качестве имени домена происхождения в CloudFront
- , в белый список заголовка хоста для переадресации
Этот должен работать, потому что это заставит API Gateway ожидать исходный заголовок Host
в сочетании с тем, как CloudFront обрабатывает TLS на внутреннем сервере, когда заголовок Host
находится в белом списке для пересылки.