如何将 AWS CloudFront 和 API Gateway 并排用于同一个域?

Posted

技术标签:

【中文标题】如何将 AWS CloudFront 和 API Gateway 并排用于同一个域?【英文标题】:How can I use AWS CloudFront and API Gateway side by side for the same domain? 【发布时间】:2017-08-10 08:13:26 【问题描述】:

我将我网站的静态资产放在 S3 上,并设置 CloudFront 来分发它们。这些基本上包含用户在我的网站上进行任何 GET 请求所需的内容,以及现有路径,即包含错误的全部内容。

我还需要处理一些 POST 请求。表单提交、发送电子邮件、通知、与数据库交互。

如何将 Lambda(或 API Gateway)与 CloudFront 设置为同一个域,以便 CloudFront 处理 GET 请求,而 API Gateway 处理带有正文或 POST 请求的请求。或者我可以通过个人网址以某种方式做到这一点吗?

【问题讨论】:

【参考方案1】:

在 CloudFront 中创建分配并使其与 S3 一起使用。

然后添加第二个源,指向在 API Gateway 中分配的主机名。

然后在 CloudFront 中创建第二个缓存行为,使用 API Gateway 源,将其设置为 API Gateway 期望的适当路径模式(例如 /api/*),并将其配置为转发所有方法(GET、POST、PUT等...默认只有 GET 和 HEAD 但有一个单选按钮可以启用所有方法)。您可能想要转发一些标头,所以选择那些...但不要转发原始的 Host 标头,因为那不起作用。您可能还想转发查询字符串或 cookie,这些都需要在同一屏幕上启用。

差不多就是这样。 CloudFront 根据路径匹配将请求发送到适当的后端。

【讨论】:

你摇滚!!!这很完美,也很直观。我喜欢技术有意义的时候:)谢谢,@Michael! 因此,为了获得最佳性能,您似乎应该为各种所需的缓存行为集创建一个单独的 API 网关。一整套后端服务(例如通过电子邮件发送联系表单提交)不需要 cookie,但一组需要身份验证的 API 调用将非常需要 cookie。在这种情况下,您需要创建两个不同的 CloudFront 行为。我明白了吗? @Costa 是的,这是真的(在一定程度上)。只有GETHEADOPTIONS 响应可以被缓存——POSTPUT 等响应实际上不会被 CloudFront 缓存,因此您是否发送 cookie 等,将不会不会对这些产生性能影响。对于GETHEADOPTIONS,CloudFront 缓存针对转发的整个请求的响应——而不仅仅是每个“页面”(资源)的一个缓存副本——所以如果(例如)发送会话 cookie,将为请求相同资源的每个不同用户创建单独的缓存条目。 请注意,默认情况下,您可以在一个发行版中创建maximum of 25 Cache Behaviors。这似乎可以通过提交带有用例理由的支持请求来增加,但是由于必须检查每个请求的每个行为的路径模式,直到找到匹配项,您可能会遇到一些阻力,因为最终可能会有需要为每个请求处理的大量比较是性能问题。 我不这么认为。 CloudFront 已经完成了 API Gateway 需要的一些事情,因此这是一种合乎逻辑的协同作用。想想 S3——你不能在 S3 上使用自定义 SSL 证书,可以说这是 S3 永远不需要重新发明的功能,因为 CloudFront 已经解决了它。 S3 Transfer Acceleration 也使用 CloudFront 网络。 Lambda@Edge 很好,但与 API-Gateway + Lambda 相比,功能非常有限......您可以修改请求和响应,但您不能(例如)使用 Lambda@Edge 连接到您的数据库来做出决策——没有网络访问,没有/tmp,没有SDK,只有Node.js。

以上是关于如何将 AWS CloudFront 和 API Gateway 并排用于同一个域?的主要内容,如果未能解决你的问题,请参考以下文章

通过 API 将域添加到 AWS Cloudfront 分发

AWS SOC 2 API 网关 / CloudFront

CloudFront 后面的 API Gateway 不支持 AWS_IAM 身份验证吗?

API 平台和 AWS CloudFront 的 HTTP 缓存失效

AWS CloudFront 如何遵循 S3 存储桶重定向规则?

如何使用 C# HttpClient 或 AWS SDK 通过 CloudFront 将视频上传到 S3