为 S3 添加 CloudFront 但 EC2 不工作

Adding CloudFront for S3 but EC2 not working

我正在尝试使用 Amazon S3 静态网站和 Amazon EC2 nodejs 服务器设置 CloudFront。

我遵循了以下步骤:

  1. 设置 S3 存储桶example.com
  2. example.comapi.example.com
  3. 颁发的 ACM 中创建证书
  4. 创建 CloudFront 分配
  5. 将创建的 CloudFront 备用域名设置为:example.comapi.example.com
  6. 已添加来自 ACM 的 SSL 证书
  7. 创建来源 example.com.s3-website-AWS_REGION.amazonaws.com
  8. 在 Route 53 中,为 example.comapi.example.com 添加了别名指向 CloudFront 分配的条目。

在此之后我的 https://example.com 正在正确加载网页。现在我也尝试为我的 nodejs 服务器设置 CloudFront。

  1. 使用 ec2-IP.AWS_REGION.compute.amazonaws.com 在 CloudFront 分配中添加了新源。

  2. 添加了所有 TTL 设置为零的模式 api.example.com/* 的行为。

现在,当我尝试使用 https://api.example.com 访问 nodejs 服务器时,我无法访问并出现错误。我不确定我做错了什么。

您对 CloudFront 基于虚拟主机提供服务感到困惑,CloudFront 不这样做,而是查看 URI 路径,例如:/api/* 等,并根据路径将请求转发到源行为匹配。

在两个 https://api.example.com and https://example.com 中,它匹配默认路径行为并向 S3 发送请求。

可能的解决方案:

  1. 创建一个新的 CloudFront 并在 CNAME 中添加 api.example.com 并使用现有的证书和来源作为 EC2 实例,cloudfront 不会向您收取创建分发费用。

  2. 如果上面没有,需要使用Lambda@edge(Viewer Request/Origin Request(whitelisting HOST header))读取HOST header,根据if选择origin ec2或S3它是 api.example.com 或 example.com。

https://aws.amazon.com/blogs/networking-and-content-delivery/dynamically-route-viewer-requests-to-any-origin-using-lambdaedge/

根据您的要求,选项 1 对您来说应该很容易。