具有 S3 源的 CloudFront 分配响应 XML ListBucketResult
CloudFront Distribution with S3 Origin Responds with XML ListBucketResult
我的意图是让我的静态网站文件(在 React 中,如果这是一个因素)只能通过我的域访问,而不是直接通过 S3 URL 访问。它似乎在我自己的计算机上工作(虽然这可能是存储桶 public 时的 CloudFront 缓存),但其他客户端仅在 XML 中接收 S3 消息。请求没有任何路径的域会给出响应。请求任何路径(例如 /index.html,我存储桶中的一个文件)会给出代码 NoSuchKey 的响应。
我做错了什么?这是当前配置。
- 在 Route 53 中,我将适当的子域指向具有 CNAME 记录的 CloudFront 分配 (xxxxxxxxxxx.cloudfront.net.)
- 在 ACM 中,我有一个涵盖子域 (*.mydomain.com)
的证书
- 在 CloudFront 中,我有一个包含这些域名 (xxxxxxxxxxx.cloudfront.net) 和备用域名 (subdomain.mydomain.com) 的分配。 - 它已启用并已处于部署状态数小时。
- 来源单一,域名子域名。mydomain.com.s3.amazonaws.com
- 我选择限制存储桶访问并选择现有身份进行源访问。我今天早些时候让 CloudFront 更新了存储桶策略。
- 该发行版有一个行为记录,它将 HTTP 重定向到 HTTPS,并且只允许 GET 和 HEAD 方法
- 我的 S3 存储桶名称与 Route 53 记录匹配(子域。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/*"
}
]
}
两项更改使此功能运行良好。 感谢 Michael 的帮助。
- ~~我修改了 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"
~~
- 我在 CloudFront 分配中将 默认根对象指定为 index.html。(单击 General 选项卡中的 Edit 按钮。)这会告诉 CloudFront 在请求路径与 S3 存储桶中的对象不匹配时要提供什么服务。这对于客户端路由至关重要,就像我在 React 中所做的那样。
- 我一直在针对
/index.html
对我的 CloudFront 发行版发出无效通知,然后当我的应用程序似乎没有更新时感到困惑。我认为这是因为,尽管 index.html
始终提供给用户,但从未明确请求过。我的路线看起来像 /
或 /dashboard
,它们没有失效。 现在,我通过使 /*
无效来清除 CloudFront 缓存。
编辑:已经好几年了,但我认为#1 没有必要。从那时起,我已经设置了几个发行版,只有存储桶策略定义权限。
我的意图是让我的静态网站文件(在 React 中,如果这是一个因素)只能通过我的域访问,而不是直接通过 S3 URL 访问。它似乎在我自己的计算机上工作(虽然这可能是存储桶 public 时的 CloudFront 缓存),但其他客户端仅在 XML 中接收 S3 消息。请求没有任何路径的域会给出响应。请求任何路径(例如 /index.html,我存储桶中的一个文件)会给出代码 NoSuchKey 的响应。
我做错了什么?这是当前配置。
- 在 Route 53 中,我将适当的子域指向具有 CNAME 记录的 CloudFront 分配 (xxxxxxxxxxx.cloudfront.net.)
- 在 ACM 中,我有一个涵盖子域 (*.mydomain.com) 的证书
- 在 CloudFront 中,我有一个包含这些域名 (xxxxxxxxxxx.cloudfront.net) 和备用域名 (subdomain.mydomain.com) 的分配。 - 它已启用并已处于部署状态数小时。
- 来源单一,域名子域名。mydomain.com.s3.amazonaws.com
- 我选择限制存储桶访问并选择现有身份进行源访问。我今天早些时候让 CloudFront 更新了存储桶策略。
- 该发行版有一个行为记录,它将 HTTP 重定向到 HTTPS,并且只允许 GET 和 HEAD 方法
- 我的 S3 存储桶名称与 Route 53 记录匹配(子域。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/*"
}
]
}
两项更改使此功能运行良好。 感谢 Michael 的帮助。
- ~~我修改了 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"
~~ - 我在 CloudFront 分配中将 默认根对象指定为 index.html。(单击 General 选项卡中的 Edit 按钮。)这会告诉 CloudFront 在请求路径与 S3 存储桶中的对象不匹配时要提供什么服务。这对于客户端路由至关重要,就像我在 React 中所做的那样。
- 我一直在针对
/index.html
对我的 CloudFront 发行版发出无效通知,然后当我的应用程序似乎没有更新时感到困惑。我认为这是因为,尽管index.html
始终提供给用户,但从未明确请求过。我的路线看起来像/
或/dashboard
,它们没有失效。 现在,我通过使/*
无效来清除 CloudFront 缓存。
编辑:已经好几年了,但我认为#1 没有必要。从那时起,我已经设置了几个发行版,只有存储桶策略定义权限。