amazon-web-services – 带有S3 Origin的CloudFront分配响应XML ListBucketResult

我的目的是让我的静态网站文件(在React中,如果这是一个因素)只能通过我的域访问,而不是直接通过S3 URL访问.它似乎在我自己的计算机上工作(尽管可能是存储桶公开时的CloudFront缓存),但其他客户端只接收
XML中的S3消息.请求没有任何路径的域会给出响应.请求任何路径(例如/index.html,我的存储桶中的文件)会给出代码为NoSuchKey的响应.

我究竟做错了什么?这是当前的配置.

>在Route 53中,我指向具有CNAME记录的CloudFront分配中的相应子域(xxxxxxxxxxx.cloudfront.net.)
>在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上的s3:GetObject操作的使用:aws:s3 ::: subdomain.mydomain.com/*
> 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存储桶中各个对象的权限.我曾经认为存储桶政策(上图)已经足够,但结果并非如此.存储桶策略是指CloudFront中的origin access identity(OAI).现在,在AWS command line interface(CLI)中运行sync命令时,我引用了同一原始访问标识的规范用户标识.在package.json脚本中:“deploy”:“aws s3 sync build / s3://subdomain.mydomain.com –delete –grants read = id = S3CANONICALIDOFORIGINACCESSIDENTITY”
>我在我的CLoudFront分配中将默认根对象指定为index.html. (单击“常规”选项卡中的“编辑”按钮.)如果无法将请求路径与S3存储桶中的对象匹配,则会告知CloudFront要提供的服务.这对于客户端路由至关重要,就像我在React中所做的那样.
>我一直在针对/index.html向我的CloudFront发行版发布失效,然后当我的应用程序似乎没有更新时感到困惑.我认为这是因为,虽然index.html总是提供给用户,但它从未明确要求.我的路线看起来像/或/仪表板,没有被无效.现在,我通过使/ *无效来清除CloudFront缓存.

点赞