是否可以通过AWS CLI从Origin找到cloudfront分布



我有多个Cloudfront发行版指向一个S3 Bucket来创建不同的URL。现在,当我部署时,很难逐个手动清除所有存储桶的缓存。所以我想应该有一个选项,从那里我可以找到所有的ID并清除缓存,但我能找到的只是

aws cloudfront  get-distribution-config
--id <value>
[--cli-input-json <value>]
[--generate-cli-skeleton <value>] 

其中id取cloudfront分布本身的id,我想找出它。

我不能使用这个,因为我不想清除所有分发的缓存

aws cloudfront list-distributions
[--max-items <value>]
[--cli-input-json <value>]
[--starting-token <value>]
[--page-size <value>]
[--generate-cli-skeleton <value>]

我正试图找到类似的东西,但到目前为止,这似乎不是的正确方法

aws cloudfront --origing <value>

https://stackoverflow.com/a/64264887/5773416

虽然这个解决方案并不是我想要的,但它帮助我找到了确切的答案。我发布了我的答案,它最终帮助我实现了这一点。

aws cloudfront list-distributions --query "DistributionList.Items[*].{id:Id,origin:Origins.Items[0].Id}[?origin=='S3-BUCKET_NAME'].id" --output text

这将给出这样的结果

EXXXXXXXXXXX1 EXXXXXXXXXXX2

并且为了清除多个分布的高速缓存

for id in $(aws cloudfront list-distributions --query "DistributionList.Items[*].{id:Id,origin:Origins.Items[0].Id}[?origin=='S3-BUCKET_NAME'].id" --output text);do aws cloudfront create-invalidation --distribution-id $id --paths "/*";done;

您可以使用查询参数仅获取Ids

aws cloudfront list-distributions --query "DistributionList.Items[*].Origins.Items[*].Id" --output text
S3-test1.example.com
S3-Website-test2.example.com.s3-website-us-west-1.amazonaws.com

然后你可以使用grep 过滤列表

aws cloudfront list-distributions --query "DistributionList.Items[*].Origins.Items[*].Id" --output text | grep test2
S3-test1.example.com

您可以使用查询参数返回多个值

aws cloudfront list-distributions --query "DistributionList.Items[*].Origins.Items[*].{id:Id,name:DomainName}" --output text
S3-test1.example.com  test1.example.com.s3.amazonaws.com
S3-Website-test2.example.com.s3-website-us-west-1.amazonaws.com test2.example.com.s3-website-us-west-1.amazonaws.com

虽然Ritik Patni的答案最接近我的需求,但我将以下内容解释为我可以替换bucket名称并过滤掉我想要的CF分布:

[?origin=='S3-BUCKET_NAME']

我没有发现这种情况,因为当我在TF中创建资源时,我使用了与bucket名称不同的名称来区分变量。在我的例子中,Origins.Items[0].Idstaticsite_s3_bucket,它与s3 bucket的名称dev-it-static-site-mvp不同。因此,返回了一个空集。

我在Jenkins内部做这件事,控制台输出看起来像是误解了引号,所以我在这里发布了从管道中取出的sh脚本,以防实际实现可以帮助任何人。请注意,詹金斯可能没有表现出开箱即用的样子。该解决方案在Cloudbees Jenkins Enterprise 2.249.3.1-rolling中起作用。

还有一个有趣的地方是,我引用了s3 bucket的域名来匹配bucket名称。AFAIK,这是一个安全的假设,桶没有配置静态网站托管。但你的里程数可能会有所不同。

sh '''#!/bin/sh
set -e
set -x
bucket_name="${ENVIRONMENT}-it-${APP_NAME}"
aws s3 ls ${bucket_name}
aws cloudfront list-distributions
echo "Getting CF distributions matching ${bucket_name} ?"
distributions=$(aws cloudfront list-distributions --query "DistributionList.Items[*].{id:Id,origin_domain:Origins.Items[0].DomainName}[?starts_with(origin_domain,'${bucket_name}.')].id" --output text)
echo ${distributions}
for id in "${distributions}"; do aws cloudfront create-invalidation --distribution-id $id --paths "/*";done;
'''

最后,我还想指出,这个URL对我来说非常有用,可以很方便地找出我做错了什么:https://jmespath.org/.我能够粘贴aws cloudfront list-distributions的原始内容,并四处查看,直到我弄清楚为什么我得到了空退货。

您可以使用此python脚本获得CloudFront发行版id、域、证书源和来源的列表

#!/usr/bin/env python
import boto3
cf = boto3.client('cloudfront') # Create CloudFront client
print("nCloudFront Distributions:n")  # List distributions
distributions=cf.list_distributions()
if distributions['DistributionList']['Quantity'] > 0:
for distribution in distributions['DistributionList']['Items']:
print("Domain: " + distribution['DomainName'])
print("Distribution Id: " + distribution['Id'])
print("Certificate Source: " + distribution['ViewerCertificate']['CertificateSource'])
for name in distribution['Origins']['Items']:
print ("origin:" + name['DomainName'])
if (distribution['ViewerCertificate']['CertificateSource'] == "acm"):
print("Certificate: " + distribution['ViewerCertificate']['Certificate'])
print("")
else:    
print("Error - No CloudFront Distributions Detected.")

相关内容

  • 没有找到相关文章

最新更新