带有 S3 源的 CloudFront 分配响应 XML ListBucketResult

car*_*iem 7 amazon-s3 amazon-web-services amazon-cloudfront amazon-iam

我的目的是让我的静态网站文件(在 React 中,如果这是一个因素)只能通过我的域而不是直接通过 S3 URL 访问。它似乎在我自己的计算机上运行(尽管这可能是存储桶公开时的 CloudFront 缓存),但其他客户端仅接收 XML 格式的 S3 消息。请求没有任何路径的域会给出响应。请求任何路径(例如/index.html,我的存储桶中的文件)都会给出代码 NoSuchKey 的响应。

我究竟做错了什么?这是当前的配置。

  • 在 Route 53 中,我使用 CNAME 记录 (xxxxxxxxxxx.cloudfront.net.) 将适当的子域指向 CloudFront 分配。
  • 在 ACM 中,我有一个涵盖子域 (*.mydomain.com) 的证书
  • 在 CloudFront 中,我有一个包含这些域名 (xxxxxxxxxxx.cloudfront.net) 和备用域名 (subdomain.mydomain.com) 的分配。- 它已启用并且已经处于部署状态几个小时了。
  • 它具有单一来源,域名为 subdomain.mydomain.com.s3.amazonaws.com
  • 我选择限制存储桶访问并选择一个现有身份进行源访问。我今天早些时候让 CloudFront 更新了存储桶策略。
  • 该发行版有一个将 HTTP 重定向到 HTTPS 的行为记录,并且只允许 GET 和 HEAD 方法
  • 我的 S3 存储桶名称与 Route 53 记录 (subdomain.mydomain.com) 匹配
  • 静态网站托管已启用,索引和错误文档均设置为 index.html
  • 存储桶策略是自动生成的。它包括一个单一的身份,并限制对资源 arn:aws:s3::subdomain.mydomain.com/* 上的 s3:GetObject 操作的使用
  • CORS 配置为空
  • 存储桶内是一个 React 应用程序,以 index.html 作为其入口点。

编辑:我的存储桶策略(我需要添加另一个操作吗?

{
    "Version": "2008-10-17",
    "Id": "PolicyForCloudFrontPrivateContent",
    "Statement": [
        {
            "Sid": "1",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity EZOBXXXXXXXXX"
            },
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::subdomain.mydomain.com/*"
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

car*_*iem 9

两个改变让这个工作顺利进行。 感谢迈克尔的帮助。

  1. ~~我修改了 S3 存储桶中各个对象的权限。我原以为存储桶策略(上面)就足够了,但事实证明并非如此。存储桶策略是指CloudFront 中的源访问身份(OAI)。现在,在AWS 命令​​行界面sync(CLI)中运行命令时,我引用了同一源访问身份的规范用户 ID 。在 package.json 脚本中:~~"deploy": "aws s3 sync build/ s3://subdomain.mydomain.com --delete --grants read=id=S3CANONICALIDOFORIGINACCESSIDENTITY"
  2. 我在 CloudFront 发行版中将默认根对象指定为 index.html 。(单击“常规”选项卡中的“编辑”按钮。)这会告诉 CloudFront 如果无法将请求路径与 S3 存储桶中的对象相匹配,则应提供哪些服务。这对于客户端路由至关重要,就像我在 React 中所做的那样。
  3. 我一直在向我的 CloudFront 发行版发出失效通知/index.html,然后当我的应用程序似乎没有更新时感到困惑。我认为这是因为,虽然index.html总是为用户提供服务,但从未明确要求。我的路线看起来像//dashboard,它们没有被无效。现在,我通过使/*.

编辑:已经过去几年了,但我认为#1 没有必要。从那时起,我已经设置了多个发行版,仅使用存储桶策略定义权限。

  • 我也遇到了同样的问题,但要解决这个问题,我所要做的就是第 2 步。感谢您的帮助! (5认同)