【问题标题】:CloudFront Distribution with S3 Origin Responds with XML ListBucketResult具有 S3 源的 CloudFront 分配使用 XML ListBucketResult 响应
【发布时间】:2019-03-29 19:38:00
【问题描述】:

我的目的是让我的静态网站文件(在 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 配置为空
  • bucket 内部是一个 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/*"
        }
    ]
}

【问题讨论】:

  • 这里有很多信息。它非常彻底——我们真的很感激——但其中大部分是无关的。因此,需要进行一些检查:如果您直接访问http://your.bucket.name.s3.amazonaws.com,您会获得对象的 XML 列表,还是获得带有 <Code>AccessDenied</Code> 的 XML?如果你去http://your.bucket.name.s3.amazonaws.com/index.html呢?
  • 是的,我认为大部分是无关的;我似乎无法弄清楚什么是重要的。正如我所料,您建议的两个 URL 都返回 AccessDeniedhttps://region-code.amazonaws.com/my.bucket.name 做同样的事情。
  • 有什么想法可以帮助我进一步缩小问题范围吗?
  • 我相信您的问题不止一个。如果时间允许,我会在几个小时内再次查看您的问题。
  • 我还通过编辑我的 CloudFront 分配的“常规”选项卡将 默认根对象 设置为 /index.html,因此现在域根也可以处理 NoSuchKey 错误。

标签: amazon-web-services amazon-s3 amazon-cloudfront amazon-iam


【解决方案1】:

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

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

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

【讨论】:

  • 我遇到了同样的问题,但要解决它,我所要做的就是第二个问题。感谢您的帮助!!!
猜你喜欢
  • 2020-08-13
  • 2018-11-26
  • 1970-01-01
  • 1970-01-01
  • 2021-06-28
  • 2016-06-21
  • 1970-01-01
  • 2021-10-01
  • 1970-01-01
相关资源
最近更新 更多