用于部署的Reaction、S3和CloudFront版本控制

人气:212 发布:2022-10-16 标签: amazon-web-services amazon-s3 amazon-cloudfront

问题描述

第一个问题:

我有一个托管在S3上的静态网页,一个指向这个S3存储桶的CloudFront发行版,以及一个在我的域上指向这个CloudFront发行版的A记录。我还有一些API Gateway、Lambda和DynamoDB方面的工作正在进行。

此网页是遵循create-react-app模板的Reaction应用程序。因此,当我yarn build时,所有的js和css片段都会被这些随机的main.d74fc389.chunk.js名称很好地缓存。然而,重要的是,index.html(和其他静态文件)不是。

当我aws s3 sync build/ s3://xxxx时,所有内容都可以很好地上载,但CloudFront根目录仍然指向旧的缓存index.html

我可以为此做些什么,以便我的自动部署脚本(基本上只是yarn build && aws s3 sync build/ s3://xxxxxx正常工作?

我将我的域指向CloudFront,而不是指向Straight S3网站,因为我需要TLS证书。因此,我已在我的策略中拒绝除CloudFront OAI之外的任何人访问S3存储桶。

第二个问题:

我已通过在CloudFront中设置默认对象解决了此问题。

由于某些原因,我的`https://cloudfront.xxxxxx.xxx`(因此,在我的`https://mydomain.xxx`,上,但访问`https://mydomain.xxx/index.html`和任何其他项目,包括新上传的项目,由更新的Java脚本证明!)上不断收到‘拒绝访问’错误。绝对没有问题。什么鬼东西?以下是我的S3策略:
{
    "Version": "2012-10-17",
    "Id": "Policy1631694343564",
    "Statement": [
        {
            "Sid": "1",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity XXXXXXXXXXXXX"
            },
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::xxxxxxx/*"
        }
    ]
}
这实际上是由CloudFront自动生成的,所以我不知道它怎么会不正确。

我确实设置了为静态网站提供服务的存储桶,但拒绝向一般公众访问S3:GetObject,因此此URL什么也不做。我为我的CloudFront设置的源是S3的REST API(即xxxxxx.s3.us-west-1.amazonaws.xxx),而不是存储桶的网站URL(http://xxxxxxx.s3-website-us-west-1.amazonaws.xxx/)。

URL中的.com已替换为.xxx,因为StackOverflow规则

推荐答案

等待ttl或使缓存无效。

aws cloudfront create-invalidation --distribution-id E2FXXXXXX4N0MS --paths "/*"

如果您要进行大量部署,则这可能不适合,因为存在一些限制和成本。

AWS Documentation

589