AWS CloudFront 流量未到达 EC2 实例

AWS CloudFront 流量未到达 EC2 实例

我在 EC2 上有一个 API 应用,它只支持 HTTP,并且正在监听端口 8080。它的代码不会对任何请求返回 504。我需要 CloudFront 作为 SSL 终止反向代理,因为该应用只支持 HTTP。

我的 API 位于 CloudFront 后面。当我访问我的自定义域时,静态网页可以正常从 S3 返回,但 API 504(无法满足请求)的流量有时会超时。

TL/DR

CloudFront 向用户对 API 的请求(在 CloudFront 后面的 EC2 上)返回 504(无法满足请求)。对 S3 的请求正常工作。

cloudfront 反向代理 ec2 s3 图

安全组

我的 EC2 安全组配置为由 Lambda 使用最新的 CF IP 自动更新(https://aws.amazon.com/blogs/security/how-to-automatically-update-your-security-groups-for-amazon-cloudfront-and-aws-waf-by-using-aws-lambda/)。我尝试让 HTTP 和 HTTPS 入口规则打开端口 8080 和 80。但都无法解决问题。

在 CloudFront 中,备用域名 (CNAME) 列出了我的自定义域名。我有一个 SSL 证书(ACM 颁发),它看起来运行良好(S3 资产在浏览器中正常返回)。

CloudFront 分发设置

在此处输入图片描述

CloudFront 源设置

在此处输入图片描述

CloudFront 行为设置(先例 0)

CloudFront 行为设置

CloudFront 行为

在此处输入图片描述

尝试过

我假设来自 CloudFront 的流量未到达我的 API 应用程序。有人知道我需要做什么来解决这个问题吗?这是我第一次将 CloudFront 设置为 SSL 终止反向代理。

答案1

经过几天的努力,终于找到了问题的根源。

CloudFront -> 分发 -> 分发设置 -> 行为选项卡 -> 具有路径模式的行为/api/*

我需要改变根据选定的请求标头进行缓存设置为全部

最初(如问题的屏幕截图所示)我将其设置为无(改善缓存)。如果我将此单一设置切换回该设置,大约一分钟后,完全相同的问题又会出现,所以这似乎是关键所在。

有了这个新改变的设置,这意味着CloudFront 不会对 API 请求进行缓存。因此,实施网页应用防火墙用于速率限制、IP 阻止、地理阻止。此外,在 API 应用程序前面放置负载平衡器也是一种很好的做法,这样它就可以将负载分配到多个应用程序实例。甚至可能根据您的用例进行应用程序级缓存。

相关内容