我们有一个通配符(*)子域指向CloudFront发行版。origin是API Gateway.
我们需要知道API网关内的原始Host
标头,以便我们可以路由请求。
当通过HTTP访问CloudFront分发时,简单地将Host
标头列入白名单会返回一个错误-大概是因为API网关需要Host
标头来知道调用哪个API。
如果是这种情况,是否有可能通过X-Forwarded-Host
从CloudFront转发Host
头到API网关?还是……是否有另一种方法来使用通配符子域与API网关?
我在今天晚些时候回答这个问题,尽管它有一个公认的答案,因为这个问题出现在这个问题的搜索顶部:
现在完全有可能通过X-Forwarded-Host
从CloudFront动态转发原始Host
头到API网关,而不必像建议的那样硬编码自定义源头。
这可以通过创建一个查看器请求边缘函数(Lambda@Edge或CloudFront函数)来完成,该函数在请求到达CloudFront之前拦截请求,将传入的Host
标头映射到X-Forwarded-Host
,然后在传递它之前将新的X-Forwarded-Host
附加到请求的标头。
然后将API网关源的X-Forwarded-Host
报头加入白名单。
在Node.js中,边缘函数看起来像:
export function 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);
}
这不是你最初问题的答案,但它可能是实现你的目标的另一种方式。
首先,在所有环境(包括prod)之间共享CF发行版会带来风险——当您需要测试CF配置的更改时,您将必须使用未经测试的更改修改prod CF dist,这可能会产生重大后果。
其次,如果你能在CI/CD管道的所有阶段测试整个环境是很棒的,但这并不总是可能的(CF尤其不适合)——所以它是关于在短反馈周期和测试的彻彻性之间找到平衡。
解决方案通常是在您的管道中引入额外的阶段,其中早期阶段对最常见的问题提供快速反馈,而后期阶段对不太常见的问题提供较慢的反馈。
根据你的情况,我建议:
- 分支部署不部署CF -测试直接针对API网关
- 主/默认部署DO部署CF -到"登台"环境-测试目标登台CF发行
- 成功测试到"登台"环境的版本被提升到生产环境
通过引入暂存环境,您可以获得分支构建的快速反馈,但是您仍然有机会在进入prod之前测试缓存后面的东西。
如果您正在对CF配置进行更改,您可以让部署脚本动态地决定在某个触发器(可能是在分支名称中存在"cloudfront"一词-尽管这对某些人来说可能有点"神奇"!)下将CF包含在分支部署中,并且您可以在合并到master以在staging中进行测试之前在分支上测试这些更改。