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

CloudFront Distribution with S3 Origin Responds with XML ListBucketResult

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

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

编辑:我的存储桶策略(我需要添加其他操作吗?

{
    "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/*"
        }
    ]
}

两项更改使此功能运行良好。 感谢 Michael 的帮助。

  1. ~~我修改了 S3 存储桶中单个对象的权限。 我原以为存储桶策略(上述)就足够了,但事实并非如此.存储桶策略是指 origin access identity (OAI) in CloudFront. Now I reference the canonical user ID of that same origin access identity when running the sync command in the AWS command line interface (CLI)。 在 package.json 脚本中: "deploy": "aws s3 sync build/ s3://subdomain.mydomain.com --delete --grants read=id=S3CANONICALIDOFORIGINACCESSIDENTITY"~~
  2. 我在 CloudFront 分配中将 默认根对象指定为 index.html(单击 General 选项卡中的 Edit 按钮。)这会告诉 CloudFront 在请求路径与 S3 存储桶中的对象不匹配时要提供什么服务。这对于客户端路由至关重要,就像我在 React 中所做的那样。
  3. 我一直在针对 /index.html 对我的 CloudFront 发行版发出无效通知,然后当我的应用程序似乎没有更新时感到困惑。我认为这是因为,尽管 index.html 始终提供给用户,但从未明确请求过。我的路线看起来像 //dashboard,它们没有失效。 现在,我通过使 /* 无效来清除 CloudFront 缓存。

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