【发布时间】: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 都返回
AccessDenied。https://region-code.amazonaws.com/my.bucket.name做同样的事情。 -
有什么想法可以帮助我进一步缩小问题范围吗?
-
我相信您的问题不止一个。如果时间允许,我会在几个小时内再次查看您的问题。
-
我还通过编辑我的 CloudFront 分配的“常规”选项卡将 默认根对象 设置为
/index.html,因此现在域根也可以处理NoSuchKey错误。
标签: amazon-web-services amazon-s3 amazon-cloudfront amazon-iam