cloudfront指向在s3上托管的旧版React

时间:2017-03-28 10:00:39

标签: amazon-web-services reactjs amazon-s3 amazon-cloudfront amazon-route53

我已在React部署了s3个应用。我正在使用Cloudfront使用证书并通过s3 bucket到达HTTPS。 在努力完成所有工作之后,我设法将其全部设置好,现在运行良好。

现在我更新了我的项目,创建了新版bundle.js,并将其上传到s3

我现在的问题是mydomain.com指向bundle.js

的V1

所以我试图挖掘更多,这就是我发现的:

  • mydomain.com指向V1
  • xxxxx.cloudfront.net指向V1
  • mydomain.com.s3-website-eu-west-1.amazonaws.com指向V2

所以我的猜测是,出于某种原因,cloudfront指向V1,但为什么呢?那里的某处有缓存吗?

这是配置,以防它有用:

  • Route53 Type A指向xxxxxx.cloudfront.net
  • cloudfront域名为xxxxxx.cloudfront.net
  • cloudfront CNAMESmydomain.comwww.mydomain.com
  • cloudfront origin domain name and pathmydomain.com.s3-website-eu-west-1.amazonaws.com
  • s3 bucketmydomain.com

PS:只是要仔细检查问题是否来自bundle.js,我从存储桶中删除了背景图片,但不知何故,在访问mydomain.com时仍然可以找到并使用它(所以显示V1)

3 个答案:

答案 0 :(得分:3)

正如@Joe Clay所证实的那样,Cloudfront正在缓解一切。

要使用AWS console强制清除缓存(我在某些文档中发现可以使用API完成),以下是我执行的步骤:

  • 登录AWS console
  • 转到Cloudfront并查看您的发布详情
  • 转到invalidations标签,然后点击Create invalidation
  • 放入对象路径*并保存
  • (花了大约5分钟完成)
  • 刷新网站mydomain.com(可能需要清理浏览器缓存)
  • 和瞧!

希望这个答案可以帮助任何坚持同样问题的人!

答案 1 :(得分:1)

我知道这是个老问题。但是我找到了一种使用部署脚本自动执行此过程的方法。这是我package.json文件中的一个条目

    HiveCompaction.initialize(table);
    Dataset<Row> dataToCompact = sparkSession.sql("select * from staging.dummy_table");
    HiveCompaction.compact(table, dataToCompact);

    sparkSession.sql("select * from staging.dummy_table_compacted").show();

    System.out.println("Compaction successful");

此后,您要做的就是运行"deploy": "npm run build && aws s3 sync --delete build/ s3://bucket-name && npm run invalidateCache", "invalidateCache": "aws cloudfront create-invalidation --distribution-id E23232323 --paths '/*'",

命令说明。

  1. 部署:这会为我的React应用创建一个新版本。然后,它将s3存储桶中的所有旧文件删除,并上传新文件。之后,它将运行我的invalidateCache命令
  2. invalidateCache :这会在我的Cloudfront发行版中创建一个新的失效。您必须提供可以在下图中找到的分发ID。最后一件事是道路。我输入了npm run deploy,以便清除所有路径的缓存。 enter image description here

希望这会有所帮助:)

答案 2 :(得分:0)

我知道这是一个老问题。也可以使用lambda fn来实现,它将使源源s3存储桶中的任何更新都使Cloudfront缓存无效。

  1. 创建一个lambda函数,该函数会在源s3存储桶文件中的任何更新时触发。
  2. 在lambda代码部分中,编写代码以使Cloudfront缓存无效。

相同的代码段在这里。

from __future__ import print_function

    import boto3
    import time

    def lambda_handler(event, context):
        path = []
        for items in event["Records"]:
            if items["s3"]["object"]["key"] == "index.html":
                path.append("/")
            else:
                path.append("/" + items["s3"]["object"]["key"])
        print(path)
        client = boto3.client('cloudfront')
        invalidation = client.create_invalidation(DistributionId='cloudfrontdistribution id',
            InvalidationBatch={
                'Paths': {
                    'Quantity': 1,
                    'Items': path
            },
            'CallerReference': str(time.time())
        })