AWS CLI CloudFront delete-distribution 完整指南禁用、ETag 校验与安全删除【免费下载链接】aws-cliUniversal Command Line Interface for Amazon Web Services项目地址: https://gitcode.com/GitHub_Trending/aw/aws-cli本指南以 aws-cli 仓库中的官方示例 delete-distribution.rst 为主体系统讲解如何通过 AWS CLI 安全删除 CloudFront 分发Distribution包括必须先禁用再删除的前置条件、如何通过update-distribution禁用、如何用get-distribution/get-distribution-config获取 ETag以及delete-distribution命令的参数、底层 HTTP 语义与常见错误排查。读完本文你将掌握一条可复现、可排错的 CloudFront 删除实战流程。删除 CloudFront 分发的前置条件必须先禁用在 aws-cli 仓库的示例文档中明确指出删除分发不是一步到位的操作Before you can delete a distribution, you must disable it.CloudFront 出于安全设计不允许直接删除一个处于启用状态Enabled: true的分发。官方底层 API 文档服务模型也给出了同样的强调说明Before you can delete a distribution, you must disable it, which requires permission to update the distribution. Once deleted, a distribution cannot be recovered.这段说明出自仓库内的服务模型文件 service-2.jsonDeleteDistribution操作的documentation字段同时提醒了两个关键点禁用操作本身需要cloudfront:UpdateDistribution权限没有该权限将无法完成删除链路删除操作不可逆分发一旦删除无法恢复请务必在删除前确认该分发已不再承担流量。禁用分发需要用到update-distribution命令官方示例见 update-distribution.rst。完整删除链路从禁用、取 ETag 到删除服务模型 service-2.json 中DeleteDistributionRequest的文档部分给出了官方推荐的 8 步 API 级删除流程用 CLI 视角可以归纳为三个阶段禁用分发Disable将分发的Enabled字段改为false并提交更新等待传播完成Status变为Deployed获取 ETagGet通过get-distribution或get-distribution-config拿到当前分发的ETag删除分发Delete携带 ETag 调用delete-distribution确认删除成功。下面按阶段给出完整可运行的 CLI 操作。第一阶段用 update-distribution 禁用分发官方示例中禁用分发需要同时提供--id、--if-match和--distribution-config。其中--distribution-config通过 JSON 文件传入完整配置核心是把 JSON 中的Enabled字段改为falseaws cloudfront update-distribution \ --id EMLARXS9EXAMPLE \ --if-match E2QWRUHEXAMPLE \ --distribution-config file://dist-config-disable.jsondist-config-disable.json的关键片段完整文件见 update-distribution.rst 示例 2{ CallerReference: cli-1574382155-496510, Origins: { Quantity: 1, Items: [ { Id: amzn-s3-demo-bucket.s3.amazonaws.com-1574382155-273939, DomainName: amzn-s3-demo-bucket.s3.amazonaws.com, S3OriginConfig: { OriginAccessIdentity: } } ] }, DefaultCacheBehavior: { TargetOriginId: amzn-s3-demo-bucket.s3.amazonaws.com-1574382155-273939, ForwardedValues: { QueryString: false, Cookies: { Forward: none } }, ViewerProtocolPolicy: allow-all }, Comment: , PriceClass: PriceClass_All, Enabled: false, HttpVersion: http2, IsIPV6Enabled: true }注意--distribution-config要求的是完整的 DistributionConfig而非仅Enabled字段。实践中可以从get-distribution-config的输出中提取当前完整配置修改Enabled后再回传避免因缺少必填字段导致校验失败。update-distribution成功后会返回新的ETag例如E9LHASXEXAMPLE与分发对象此时Distribution.Status为InProgress需要等待 CloudFront 完成全局传播直到再次查询时Status变为Deployed才能执行删除。第二阶段用 get-distribution / get-distribution-config 获取 ETag删除分发必须提供分发的ETag。官方示例文档给出的获取方式是To get the ETag, use theget-distributionorget-distribution-configcommand.两个命令的用法一致示例见 get-distribution.rst 与 get-distribution-config.rstaws cloudfront get-distribution \ --id EDFDVBD6EXAMPLEaws cloudfront get-distribution-config \ --id EDFDVBD6EXAMPLE两者都会在响应中返回顶层ETag字段。例如{ ETag: E2QWRUHEXAMPLE, Distribution: { Id: EDFDVBD6EXAMPLE, Status: Deployed, DomainName: d111111abcdef8.cloudfront.net } }两者的区别在于get-distribution返回ETag 完整的Distribution对象含运行时状态如Status、LastModifiedTimeget-distribution-config返回ETag 纯DistributionConfig适合直接作为--distribution-config的修改底稿。关于分发 ID示例文档说明分发 ID 来自create-distribution或list-distributions命令的返回结果这一点在 get-distribution.rst 中有明确记载。delete-distribution 命令实战官方示例 delete-distribution.rst 给出的删除命令如下aws cloudfront delete-distribution \ --id EDFDVBD6EXAMPLE \ --if-match E2QWRUHEXAMPLE参数说明参数必填说明--id是要删除的 CloudFront 分发 ID例如EDFDVBD6EXAMPLE--if-match建议必填分发的ETag值例如E2QWRUHEXAMPLE取自禁用后get-distribution/get-distribution-config的返回官方文档对--if-match的取值有精确描述它是禁用分发时收到的那份ETag。服务模型中IfMatch成员的说明为The value of theETagheader that you received when you disabled the distribution.即正确姿势是禁用 → 重新获取 ETag → 用新 ETag 删除而不是复用创建时的旧值。命令成功时没有任何输出原文档原文When successful, this command has no output。这与服务模型中的 HTTP 语义完全吻合——见下文底层实现。底层实现HTTP DELETE 与 204 No Content在仓库的 CloudFront 服务模型 service-2.json 中DeleteDistribution操作的定义如下{ name: DeleteDistribution2020_05_31, http: { method: DELETE, requestUri: /2020-05-31/distribution/{Id}, responseCode: 204 } }从源码结构可以确认三个关键事实请求方式CLI 内部将该命令映射为一次HTTP DELETE请求目标 URI 为/2020-05-31/distribution/{Id}分发 ID 直接嵌入 URL 路径无输出原因成功的响应码是204 No Content响应体为空这正是命令成功时没有输出的底层依据参数落点Id是 URI 路径参数location: urilocationName: IdIfMatch是 HTTP 请求头参数location: headerlocationName: If-MatchCLI 的--if-match最终以If-Match请求头发送给 CloudFront用于服务端做乐观并发控制Precondition。另外仓库的 cloudfront/data 目录下保留了从2014-05-31到2020-05-31共 19 个 API 版本的服务模型当前 CLI 默认采用2020-05-31版本。不同版本的DeleteDistribution请求语义一致均为 DELETE 204这也保证了脚本跨版本升级的兼容性。错误码与排查指引服务模型为DeleteDistribution定义了 6 个异常 shapeexception: trueCLI 遇到失败时会抛出对应的客户端异常。逐一说明触发场景错误含义来自服务模型排查建议DistributionNotDisabled指定的分发未禁用必须先禁用才能删除先执行update-distribution将Enabled置为false并等待Status变为DeployedPreconditionFailed请求字段中的前置条件求值为 false检查--if-match提供的 ETag 是否为最新值ETag 过期/不匹配会触发该错误InvalidIfMatchVersionIf-Match版本缺失或无效确认 ETag 来自get-distribution/get-distribution-config的合法返回NoSuchDistribution指定的分发不存在核对--id是否正确可用list-distributions确认ResourceInUse资源正在使用中无法删除检查该分发是否仍被引用例如仍有关联配置或资源在占用AccessDenied访问被拒绝确认 IAM 权限需要包含cloudfront:DeleteDistribution且禁用步骤还需要cloudfront:UpdateDistribution最常见的失败场景是遗漏--if-match。虽然服务模型中仅Id是必填项、IfMatch为可选但官方示例与文档都强调删除时必须携带--if-match——不携带或携带过期 ETag 会导致前置条件校验失败CloudFront 出于并发安全考虑拒绝删除。完整操作清单一条可复现的删除流程综合以上所有步骤给出一次完整的端到端操作序列# 1. 查看分发 ID或从 create-distribution 输出中获取 aws cloudfront list-distributions # 2. 获取当前配置与 ETag作为禁用修改的底稿 aws cloudfront get-distribution-config --id EDFDVBD6EXAMPLE # 3. 将 Enabled 改为 false写入 dist-config-disable.json 后禁用分发 aws cloudfront update-distribution \ --id EDFDVBD6EXAMPLE \ --if-match E2QWRUHEXAMPLE \ --distribution-config file://dist-config-disable.json # 4. 等待传播完成Status 变为 Deployed aws cloudfront get-distribution --id EDFDVBD6EXAMPLE # 5. 重新获取最新 ETag禁用后返回的新 ETag aws cloudfront get-distribution --id EDFDVBD6EXAMPLE # 6. 携带最新 ETag 删除分发成功时无输出 aws cloudfront delete-distribution \ --id EDFDVBD6EXAMPLE \ --if-match E9LHASXEXAMPLE需要强调的最后一点删除不可逆。DeleteDistribution的服务模型文档service-2.json明确标注 Once deleted, a distribution cannot be recovered.因此生产环境中建议在删除前先记录分发配置get-distribution-config输出留档并确认域名流量已切换或终止。【免费下载链接】aws-cliUniversal Command Line Interface for Amazon Web Services项目地址: https://gitcode.com/GitHub_Trending/aw/aws-cli创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
