AWS CLI CloudFront 失效所有文件

64

我在尝试使整个静态网站失效。以下命令似乎不能使/index.html失效,并给出了一些奇怪的无法使用的输出,如下所示。这是AWS CLI的正常行为还是我漏掉了什么?谢谢!

aws cloudfront create-invalidation --distribution-id $DISTRIBUTION_ID --paths /*

输出:

{
    "Invalidation": {
    "Status": "InProgress", 
    "InvalidationBatch": {
        "Paths": {
            "Items": [
                "/lib32", 
                "/home", 
                "/vmlinuz", 
                "/core", 
                "/proc", 
                "/var", 
                "/dev", 
                "/usr", 
                "/etc", 
                "/initrd.img", 
                "/cdrom", 
                "/lost+found", 
                "/root", 
                "/tmp", 
                "/lib", 
                "/dead.letter", 
                "/lib64", 
                "/boot", 
                "/sys", 
                "/run", 
                "/bin", 
                "/sbin", 
                "/mnt", 
                "/opt", 
                "/snap", 
                "/media", 
                "/copyright", 
                "/srv"
            ], 
            "Quantity": 28
        }, 
6个回答

82

这是您的shell正在进行本地文件名扩展

这就是您所要求的,因为*没有被引用。

要么使用--paths '*',要么指定--paths '/*'¹将做到您的意图。引用通配符会将其保留为文字字符串,而不是您所看到的内容。


¹CloudFront控制台允许您指定*/*来使整个分发无效;相比之下,CLI需要/*。这是因为底层API也期望/*。当您在控制台中使用*时,控制台在向CloudFront API发出请求之前会自动添加前导斜杠。


2
这对我很有帮助。谢谢迈克尔。进一步贡献,在版本aws-cli/1.11.36 Python/2.7.12 Darwin/16.4.0 botocore/1.4.93上,使用 --paths '*' 值会出现错误:An error occurred (InvalidArgument) when calling the CreateInvalidation operation: Your request contains one or more invalid invalidation paths.应该改用 --paths '/*' 才能成功响应。 - damusix
2
@damusix 感谢您提供的前导“/”的提示。已做相应更新。 - Michael - sqlbot
这不是完整的路径规范。至少在我的Windows控制台上,使用这种路径会导致错误。这应该用双引号括起来(至少在Windows上)。您必须使用--paths "/*"。 - Vladyslav Didenko
2
我在Windows上使用gitbash时遇到了问题。我不得不在我的命令前面添加MSYS_NO_PATHCONV=1前缀。例如:MSYS_NO_PATHCONV=1 aws cloudfront create-invalidation ... - Josh Woodcock

50

通过aws cli使cloudfront分发失效的示例:

aws cloudfront create-invalidation --distribution-id <DistributionID> --paths "/*"

例子:

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

要列出或获取Cloudfront分发ID,您可以使用控制台或通过CLI:

aws cloudfront list-distributions 
aws cloudfront list-distributions | grep Id

谢谢,终于成功了! - minigeek

12

在Windows上(使用cmd)可能可以不用引号使用 路径,但在bash环境(Linux,Mac)中,字符*是一个特殊的字符。 你需要将路径放在引号内以实现跨平台工作:

aws cloudfront create-invalidation --distribution-id $DISTRIBUTION_ID --paths '/*'

3

根据以上答案,您可以使用以下命令:

aws cloudfront create-invalidation --distribution-id $(aws cloudfront list-distributions --query 'DistributionList.Items[*].Id | [0]' | tr -d '"') --paths "/*"

这基本上是获取您环境中第一个CloudFront分发的ID,去除双引号并请求无效。

您应该会看到类似以下的响应:

{
"Location": "https://cloudfront.amazonaws.com/2020-05-31/distribution/E8D4M8HG5JSRS/invalidation/I87QDOK5CWC6O4KWOWBZX75EWN",
"Invalidation": {
    "Id": "I87QDOK5CWC6O4KWOWBZX75EWN",
    "Status": "InProgress",
    "CreateTime": "2023-03-15T00:21:40.285000+00:00",
    "InvalidationBatch": {
        "Paths": {
            "Quantity": 1,
            "Items": [
                "/*"
            ]
        },
        "CallerReference": "cli-1678839700-773660"
    }
}

}


这是一个很好的答案,但假设你的账户只有一个 CloudFront 分发,在遇到问题时可能会导致困惑。 - danipenaperez

0
在我的情况下,令人惊讶的是,引用通配符并没有起作用。为了解决这个问题,我不得不暂时禁用全局匹配,创建失效并重新启用全局匹配:
set -f
aws cloudfront create-invalidation --distribution-id $DISTRIBUTION_ID --paths "/*"
set +f

这不应该是你的第一个解决方案。只在其他方法无效时使用它。


你可以使用单引号或用反斜杠转义星号。 - undefined

0
如果你正在执行一个来自你的package.json的脚本,就像我在这个教程中所遵循的那样,去掉路径的引号。 这是一个使用(并修正)教程中的示例。
"scripts": {
  "deploy:live": "npm run build && aws s3 sync dist/ s3://<YOUR_S3_BUCKET_NAME> --delete && npm run-script invalidate-cache:live",
  "invalidate-cache:live": "aws configure set preview.cloudfront true && aws cloudfront create-invalidation --distribution-id <CLOUDFRONT_DISTRIBUTION_ID> --paths /*"
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接