news 2026/9/15 13:55:05

AWS CLI 实战:使用 `aws cloudfront get-distribution` 查询 CloudFront 分发配置与 ETag

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
AWS CLI 实战:使用 `aws cloudfront get-distribution` 查询 CloudFront 分发配置与 ETag

AWS CLI 实战:使用aws cloudfront get-distribution查询 CloudFront 分发配置与 ETag

【免费下载链接】aws-cliUniversal Command Line Interface for Amazon Web Services项目地址: https://gitcode.com/GitHub_Trending/aw/aws-cli

get-distribution是 AWS CLI 中用于查询单个 CloudFront 分发(distribution)完整信息的核心命令,它返回分发的基础元数据(ID、ARN、状态、域名)以及完整的DistributionConfig配置结构,同时通过响应头返回用于并发更新的ETag。本篇以 AWS CLI 仓库中 get-distribution.rst 官方示例为骨架,结合 service-2.json 服务模型与仓库内配套示例,逐字段讲解命令用法、输出含义、ETag 的实战价值,以及它与create-distributionlist-distributionsupdate-distribution等命令的协作关系,读完即可在真实环境中熟练查询与审计 CloudFront 分发。

get-distribution命令的作用与适用场景

CloudFront 是 AWS 的全球内容分发网络服务,一个"分发"(distribution)对应一套完整的加速配置:源站(origin)、默认缓存行为(default cache behavior)、TTL、价格分级、证书、地理限制等。当需要对已有分发进行状态审计、配置核对、或为后续修改做准备时,就需要把该分发的当前配置完整读取出来。

get-distribution正是为此设计的只读查询操作,它有两个不可替代的价值:

  • 返回分发的完整配置快照:包括Status(是否已部署到全部边缘节点)、DomainName(分配的加速域名)、LastModifiedTime、以及完整的DistributionConfig配置对象;
  • 返回当前版本的ETag:这是后续执行update-distributiondelete-distribution等写操作时必须携带的并发控制令牌,防止基于过期配置进行覆盖式修改。

在 AWS CLI 仓库的 CloudFront 示例集中,官方给出了多条配套示例,共同构成"创建 → 查询 → 修改 → 删除"的完整操作链:

  • create-distribution.rst:创建分发,返回新分发的 ID 与 ETag;
  • list-distributions.rst:列出账号下所有分发的摘要信息;
  • get-distribution-config.rst:仅返回配置对象(不含分发级元数据);
  • update-distribution.rst:修改分发,必须携带--if-match传入最新 ETag。

命令语法与参数详解

根据 service-2.json 中GetDistribution操作的输入定义(shapeGetDistributionRequest),该命令只有一个必填参数

参数是否必填说明
--id必填分发的 ID(形如EDFDVBD6EXAMPLE)。该 ID 来自create-distributionlist-distributions的返回结果。

从服务模型看,Id字段通过"location": "uri"注入到请求 URL 路径中,因此它属于 REST 风格接口的路径参数,必须在命令行中显式给出。此外,命令还支持 AWS CLI 的通用参数,例如:

  • --output json:以 JSON 格式输出(默认);
  • --query 'Distribution.DistributionConfig.DefaultCacheBehavior.DefaultTTL':仅提取某个字段;
  • --region/--profile:指定区域或凭证配置文件。

该操作的响应结构(shapeGetDistributionResult)包含两个成员:Distribution(分发完整信息)和ETag(从 HTTP 响应头ETag解析而来,模型中标注为"location": "header")。

官方示例与完整输出解读

仓库文档 get-distribution.rst 给出的核心命令如下:

aws cloudfront get-distribution \ --id EDFDVBD6EXAMPLE

其中EDFVBD6EXAMPLE是示例分发 ID(文档中注释说明:该 ID 由create-distributionlist-distributions命令返回)。命令输出如下(原样继承官方示例):

{ "ETag": "E2QWRUHEXAMPLE", "Distribution": { "Id": "EDFVBD6EXAMPLE", "ARN": "arn:aws:cloudfront::123456789012:distribution/EDFVBD6EXAMPLE", "Status": "Deployed", "LastModifiedTime": "2019-12-04T23:35:41.433Z", "InProgressInvalidationBatches": 0, "DomainName": "d111111abcdef8.cloudfront.net", "ActiveTrustedSigners": { "Enabled": false, "Quantity": 0 }, "DistributionConfig": { "CallerReference": "cli-example", "Aliases": { "Quantity": 0 }, "DefaultRootObject": "index.html", "Origins": { "Quantity": 1, "Items": [ { "Id": "amzn-s3-demo-bucket.s3.amazonaws.com-cli-example", "DomainName": "amzn-s3-demo-bucket.s3.amazonaws.com", "OriginPath": "", "CustomHeaders": { "Quantity": 0 }, "S3OriginConfig": { "OriginAccessIdentity": "" } } ] }, "OriginGroups": { "Quantity": 0 }, "DefaultCacheBehavior": { "TargetOriginId": "amzn-s3-demo-bucket.s3.amazonaws.com-cli-example", "ForwardedValues": { "QueryString": false, "Cookies": { "Forward": "none" }, "Headers": { "Quantity": 0 }, "QueryStringCacheKeys": { "Quantity": 0 } }, "TrustedSigners": { "Enabled": false, "Quantity": 0 }, "ViewerProtocolPolicy": "allow-all", "MinTTL": 0, "AllowedMethods": { "Quantity": 2, "Items": [ "HEAD", "GET" ], "CachedMethods": { "Quantity": 2, "Items": [ "HEAD", "GET" ] } }, "SmoothStreaming": false, "DefaultTTL": 86400, "MaxTTL": 31536000, "Compress": false, "LambdaFunctionAssociations": { "Quantity": 0 }, "FieldLevelEncryptionId": "" }, "CacheBehaviors": { "Quantity": 0 }, "CustomErrorResponses": { "Quantity": 0 }, "Comment": "", "Logging": { "Enabled": false, "IncludeCookies": false, "Bucket": "", "Prefix": "" }, "PriceClass": "PriceClass_All", "Enabled": true, "ViewerCertificate": { "CloudFrontDefaultCertificate": true, "MinimumProtocolVersion": "TLSv1", "CertificateSource": "cloudfront" }, "Restrictions": { "GeoRestriction": { "RestrictionType": "none", "Quantity": 0 } }, "WebACLId": "", "HttpVersion": "http2", "IsIPV6Enabled": true } } }

分发级字段(Distribution)逐一解读

Distribution结构在 service-2.json 中被标记为必填的成员包括:IdARNStatusLastModifiedTimeInProgressInvalidationBatchesDomainNameDistributionConfig,即每次查询都保证返回这些字段。

字段含义
Id分发的唯一标识符,如EDFVBD6EXAMPLE;也是get-distribution--id输入值。
ARN分发的 Amazon 资源名称,形如arn:aws:cloudfront::123456789012:distribution/EDFVBD6EXAMPLE,用于 IAM 策略授权与资源引用。
Status分发状态。当为Deployed时,表示分发信息已完全传播到所有 CloudFront 边缘节点(edge locations);刚创建时为InProgress
LastModifiedTime分发的最后修改时间(ISO 8601 时间戳)。
InProgressInvalidationBatches当前正在进行中的失效(invalidation)批次数量。
DomainNameCloudFront 分配的加速域名,形如d111111abcdef8.cloudfront.net,这是面向终端用户的访问入口。
ActiveTrustedSigners可用于签名 URL / 签名 Cookie 校验的 AWS 账户与 CloudFront 密钥对列表(服务模型提示:官方推荐使用TrustedKeyGroups取代TrustedSigners)。
DistributionConfig分发的完整配置对象,见下一节。

核心配置对象 DistributionConfig 深度解析

DistributionConfig是查询结果中最有分析价值的部分,它完整记录了该分发"是怎么配置的"。服务模型将其CallerReferenceOriginsDefaultCacheBehaviorCommentEnabled标记为必填。结合官方示例输出,各字段要点如下:

基础标识

  • CallerReferencecli-example):创建分发时提供的唯一字符串,用于防止请求重放;若重复使用相同值创建,CloudFront 会返回DistributionAlreadyExists错误。
  • Aliases:CNAME 别名(自定义域名)列表,示例中数量为 0,表示未绑定自定义域名,直接使用 CloudFront 默认域名。
  • DefaultRootObjectindex.html):访问根路径https://<domain>/时,CloudFront 从源站请求的默认对象,可避免直接暴露源站目录结构。

源站(Origins)

  • Quantity/Items:源站数量与列表。示例为一个 S3 源站,IdDomainNameamzn-s3-demo-bucket.s3.amazonaws.com
  • OriginPath:空字符串表示未设置源路径前缀。
  • S3OriginConfig.OriginAccessIdentity:空字符串表示未配置源访问身份(OAI);在较新的 API 版本中,还可能出现OriginAccessControlId(OAC)字段,见 list-distributions.rst 示例输出。
  • OriginGroups:源站组(用于故障转移),示例为 0。

默认缓存行为(DefaultCacheBehavior)

  • TargetOriginId:指向Origins.Items中某个源站的 Id。
  • ForwardedValues:转发给源站的查询字符串(QueryString: false)、Cookie(Forward: "none")、请求头(Headers.Quantity: 0)与缓存键查询参数(QueryStringCacheKeys.Quantity: 0)。
  • ViewerProtocolPolicyallow-all表示允许 HTTP 与 HTTPS 访问;可选值还有redirect-to-httpshttps-only
  • MinTTL(0 秒)、DefaultTTL(86400 秒)、MaxTTL(31536000 秒):对象在边缘节点的缓存时长范围。
  • AllowedMethods:允许的请求方法,示例为HEADGET,其中CachedMethods同样为HEADGET(表示这两个方法的结果会被缓存)。
  • SmoothStreamingCompress:是否启用平滑流式处理与自动压缩,示例均为false
  • LambdaFunctionAssociationsFieldLevelEncryptionId:边缘函数(Lambda@Edge)关联与字段级加密 ID,示例为空/0。

安全与合规

  • ViewerCertificate:示例使用CloudFrontDefaultCertificate: true(默认证书),MinimumProtocolVersionTLSv1CertificateSourcecloudfront;若绑定了 ACM 证书,该结构会变为ACMCertificateArnSSLSupportMethodCertificateSource: "acm"等形式(参见 create-distribution.rst 示例 3)。
  • Restrictions.GeoRestriction:地理限制,示例RestrictionType: "none"、数量 0,表示不限制访问地区。
  • WebACLId:关联的 AWS WAF Web ACL ID,空字符串表示未关联。
  • HttpVersionhttp2)、IsIPV6Enabledtrue):协议版本与 IPv6 支持。
  • PriceClassPriceClass_All):价格分级,决定使用全部还是部分边缘节点,影响成本。
  • Logging:访问日志配置,示例为关闭状态。
  • Enabledtrue):分发是否启用;设为false即停用分发(参考 update-distribution.rst 中的禁用示例)。

分发 ID 从哪来:与 create-distribution、list-distributions 的协作

原文档明确指出:分发 ID 由create-distributionlist-distributions命令返回。在实战中:

  • 新创建分发后,从create-distribution的返回结果中取Distribution.Id(如 create-distribution.rst 示例 1 中的EMLARXS9EXAMPLE);
  • 管理存量分发时,直接执行aws cloudfront list-distributions,从DistributionList.Items[].Id中筛选目标 ID,再将该 ID 传给get-distribution

两命令示例均收录于仓库 awscli/examples/cloudfront 目录下,可对照阅读完整输出。

ETag 的实战价值:并发控制与安全更新

响应中的ETag(示例为E2QWRUHEXAMPLE)是该分发配置当前版本的标识,来自 HTTP 响应头(服务模型中标注"location": "header")。它的核心用途是乐观并发控制(optimistic concurrency)

  • 更新分发前,先用get-distribution(或get-distribution-config)拿到最新 ETag;
  • update-distribution时通过--if-match传入该 ETag;
  • CloudFront 会比较传入值与服务端当前版本,若不一致则拒绝更新,避免多人操作时"后写覆盖先写"。

update-distribution.rst 第 141–142 行的说明与之一致:"To update a distribution, you must use the--if-matchoption to provide the distribution'sETag. To get theETag, use theget-distributionorget-distribution-configcommand."(更新分发必须使用--if-match提供 ETag,而获取 ETag 正是get-distributionget-distribution-config的职责。)

同样地,执行delete-distribution时通常也需要携带 ETag 以确认删除的是预期版本。因此可以说:每次安全的配置变更,都始于一次get-distribution

源码级支撑:服务模型与 Waiter 机制

从当前仓库的服务定义文件 awscli/botocore/data/cloudfront/2020-05-31/service-2.json 可以确认:

  • GetDistribution操作(内部名称GetDistribution2020_05_31)文档描述为 "Get the information about a distribution",输入 shapeGetDistributionRequest(必填Id),输出 shapeGetDistributionResultDistribution+ETag),可能抛出的错误为NoSuchDistributionAccessDenied
  • 该操作不参与分页(无paginated标记),因为它面向单个分发的完整读取。

更有意思的是,get-distribution还是 CloudFrontWaiter 机制的底层轮询操作。仓库 waiters-2.json 中定义的DistributionDeployedwaiter 配置为:

{ "description": "Wait until a distribution is deployed.", "delay": 60, "maxAttempts": 35, "operation": "GetDistribution", "acceptors": [ { "matcher": "path", "argument": "Distribution.Status", "state": "success", "expected": "Deployed" } ] }

即在 CLI 中使用aws cloudfront wait distribution-deployed --id <ID>时,SDK 会每 60 秒调用一次GetDistribution,最多尝试 35 次,直到返回结果中Distribution.Status变为Deployed。这印证了get-distribution不仅是查询工具,也是自动化部署流程中的"就绪探测"原语——创建或更新分发后,可以用它驱动轮询等待部署完成。

常见错误与排查建议

  • NoSuchDistribution--id指定的分发不存在(ID 拼写错误,或属于其他 AWS 账户/区域),请用list-distributions核对 ID;
  • AccessDenied:当前凭证没有cloudfront:GetDistribution权限,需要在 IAM 策略中授予该操作(可结合返回的ARN字段对单个分发做资源级授权);
  • 输出中没有ETagETag来自响应头,使用--output json时会显示为顶层字段;若自定义了--query提取表达式,请勿遗漏该字段名。

延伸阅读

  • 查询仅配置对象(不含分发级元数据):get-distribution-config.rst
  • 创建分发(命令行参数 / JSON 文件两种方式):create-distribution.rst
  • 列出账号下全部分发:aws cloudfront list-distributions(示例见 list-distributions.rst)
  • 使用 ETag 安全更新分发:aws cloudfront update-distribution --if-match <ETag> ...(示例见 update-distribution.rst)
  • 等待分发部署完成:aws cloudfront wait distribution-deployed --id <ID>
  • 服务与 Waiter 模型定义:service-2.json、waiters-2.json

【免费下载链接】aws-cliUniversal Command Line Interface for Amazon Web Services项目地址: https://gitcode.com/GitHub_Trending/aw/aws-cli

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/15 13:54:32

Go并发本质:CSP模型与channel正确使用指南

1. 为什么Go的并发模型不是“多线程升级版”&#xff0c;而是彻底换了一套操作系统思维&#xff1f;很多人刚学Go并发时&#xff0c;第一反应是&#xff1a;“哦&#xff0c;goroutine就是轻量级线程&#xff0c;channel就是带缓冲的队列&#xff0c;和Java的ExecutorServiceBl…

作者头像 李华
网站建设 2026/9/15 13:53:49

Loop 窗口管理工具:3 分钟上手的完整指南

Loop 窗口管理工具&#xff1a;3 分钟上手的完整指南 【免费下载链接】Loop Window management made elegant. 项目地址: https://gitcode.com/GitHub_Trending/lo/Loop Loop 是一款免费开源的 macOS 窗口管理工具。它用径向菜单、操作前预览和窗口暂存替代窗口拖拽&…

作者头像 李华
网站建设 2026/9/15 13:53:01

良品铺子网站规划和建设:避开域名服务器3大深坑

良品铺子网站规划和建设:避开域名服务器3大深坑 很多独立站长盯着“良品铺子网站规划和建设”这几个字,心里其实虚得很。别装懂,咱们直说:域名选错后缀、服务器带宽没算对、备案卡在第一步,这三件事能坑掉你一半的预算。这份 避坑指南 不是讲大道理,而是把你当刚入行的新手,手把手拆解那些容易踩雷的细节。…

作者头像 李华