具有S3来源的CloudFront分发通过XML ListBucketResult进行响应

时间:2018-10-25 08:46:28

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

我的目的是让我的静态网站文件(在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配置为空
  • 存储桶中有一个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 个答案:

答案 0 :(得分: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 (在 General中单击 Edit 按钮标签。)它告诉CloudFront如果请求路径与S3存储桶中的对象不匹配,该提供什么服务。这对客户端路由至关重要,就像我在React中一样。
  3. 我一直在针对/index.html向我的CloudFront发行版发出无效消息,然后在我的应用程序似乎未更新时感到困惑。我认为这是因为尽管index.html始终为用户服务,但从未明确请求它。我的路线看起来像//dashboard,但并未失效。 现在,我通过使/*无效来清除CloudFront缓存。