我在 EC2 上有一个 API 应用,它只支持 HTTP,并且正在监听端口 8080。它的代码不会对任何请求返回 504。我需要 CloudFront 作为 SSL 终止反向代理,因为该应用只支持 HTTP。
我的 API 位于 CloudFront 后面。当我访问我的自定义域时,静态网页可以正常从 S3 返回,但 API 504(无法满足请求)的流量有时会超时。
TL/DR
CloudFront 向用户对 API 的请求(在 CloudFront 后面的 EC2 上)返回 504(无法满足请求)。对 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 行为
尝试过
如果我在安全组中为整个世界创建一个入口,并从家里卷曲 API,我确实会得到一个有效的答复,但 CloudFront 代理请求仍然是 504。
制定 HTTP 和 HTTPS 入口规则以打开端口 8080 和 80。两者都无法解决问题
我假设来自 CloudFront 的流量未到达我的 API 应用程序。有人知道我需要做什么来解决这个问题吗?这是我第一次将 CloudFront 设置为 SSL 终止反向代理。
答案1
经过几天的努力,终于找到了问题的根源。
CloudFront -> 分发 -> 分发设置 -> 行为选项卡 -> 具有路径模式的行为/api/*
我需要改变根据选定的请求标头进行缓存设置为全部。
最初(如问题的屏幕截图所示)我将其设置为无(改善缓存)。如果我将此单一设置切换回该设置,大约一分钟后,完全相同的问题又会出现,所以这似乎是关键所在。
有了这个新改变的设置,这意味着CloudFront 不会对 API 请求进行缓存。因此,实施网页应用防火墙用于速率限制、IP 阻止、地理阻止。此外,在 API 应用程序前面放置负载平衡器也是一种很好的做法,这样它就可以将负载分配到多个应用程序实例。甚至可能根据您的用例进行应用程序级缓存。