繁体   English   中英

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

[英]CloudFront Distribution with S3 Origin Responds with XML ListBucketResult

我的意图是让我的 static 网站文件(在 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) 的分配。 - 它已经启用并且已经在部署的 state 中存在了几个小时。
  • 它具有单一来源,域名为 subdomain.mydomain.com.s3.amazonaws.com
  • 我选择限制存储桶访问并选择一个现有身份进行源访问。 我今天早些时候让 CloudFront 更新了存储桶策略。
  • 该分布有一个单一的行为记录,它将 HTTP 重定向到 HTTPS,并且只允许 GET 和 HEAD 方法
  • 我的 S3 存储桶名称与 Route 53 记录匹配 (subdomain.mydomain.com)
  • Static 网站托管已启用,索引和错误文档均设置为 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/*"
        }
    ]
}

两个变化使这个工作得很好。 感谢迈克尔的帮助。

  1. ~~我修改了 S3 存储桶中各个对象的权限。 我原以为存储桶策略(上图)就足够了,但事实证明并非如此。 存储桶策略是指 CloudFront 中的源访问身份(OAI)。 现在,在AWS 命令​​行界面(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 存储桶中的对象匹配,应提供什么服务。 这对于客户端路由至关重要,就像我在 React 中所做的那样。
  3. 我一直在针对/index.html对我的 CloudFront 分配发出无效通知,然后当我的应用程序似乎没有更新时感到困惑。 我认为这是因为尽管index.html总是提供给用户,但它从未明确请求。 我的路线看起来像//dashboard ,它们没有失效。 现在,我通过使/*无效来清除 CloudFront 缓存。

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

除了其他答案提到的解决方案之外,如果其他答案无法解决,还有另一种解决方案肯定可以解决此错误。 在为存储桶创建分配时,您不应从列出存储桶名称的下拉列表中选择源域,而应为自定义域选择 go(通过自己填写),您可以在存储桶的属性选项卡中找到Bucket 网站端点的标题。 您可以在这个问题的已接受答案中找到有关此解决方案的更多详细信息: CloudFront + S3 网站:“指定的键不存在”,当应显示隐式索引文档时

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM