使用 AWS CLI `update-connection-group` 更新 CloudFront 连接组:参数、ETag 乐观锁与完整生命周期实战
2026/9/15 10:20:17 网站建设 项目流程

使用 AWS CLIupdate-connection-group更新 CloudFront 连接组:参数、ETag 乐观锁与完整生命周期实战

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

导读

本文围绕 AWS CLI 官方示例文档 update-connection-group.rst,深入讲解如何通过aws cloudfront update-connection-group命令修改 CloudFront 连接组(Connection Group)——包括启用/禁用连接组、切换 IPv6 开关等核心能力。你将掌握该命令的完整参数语义、If-Match(ETag)乐观锁的用法、返回字段的逐项含义,以及连接组从创建到删除的完整生命周期操作,并对照 AWS CLI 仓库中的服务模型源码理解其底层 HTTP 行为。

什么是 CloudFront 连接组

连接组(Connection Group)是 CloudFront 为**分布租户(distribution tenant)**提供的一种网络资源分组机制。从当前仓库的服务模型 service-2.json 中的ConnectionGroup结构定义可以看出,一个连接组包含以下属性:

字段类型含义
Idstring连接组的 ID
Namestring连接组名称
Arnstring连接组的 Amazon 资源名称(ARN)
CreatedTime/LastModifiedTimetimestamp创建时间 / 最后更新时间
Tagsmap标签集合
Ipv6Enabledboolean是否启用 IPv6
RoutingEndpointstring分配给连接组的路由端点(即 DNS 名称,形如d111111abcdef8.cloudfront.net
AnycastIpListIdstringAnycast 静态 IP 列表的 ID
Statusstring连接组状态(如InProgressDeployed
Enabledboolean连接组是否处于启用状态
IsDefaultboolean是否为分布租户的默认连接组

根据模型中的文档说明:当你首次创建分布租户且未显式指定连接组时,CloudFront 会自动创建一个默认连接组并与该租户关联;而自定义连接组则允许你按需配置网络的连接模式(包括 IPv6 开关、Anycast 静态 IP 列表等)。update-connection-group正是用于在创建之后对这类连接组做就地修改的命令。

update-connection-group 命令参数详解

命令签名与必选/可选参数

从服务模型UpdateConnectionGroupRequest(service-2.json 中定义)可以看到,该操作对应的底层 API 为:

PUT /2020-05-31/connection-group/{Id}

其中Id位于 URI 路径,IfMatch位于If-Match请求头。转换到 AWS CLI 后,update-connection-group支持的参数如下:

CLI 参数对应 API 字段必填说明
--idId(URI 路径)✅ 必填要更新的连接组 ID,形如cg_2yHsDkcPKeUlVkk3aEgLKcjABC
--if-matchIfMatchIf-Match头)✅ 必填你在读取(get)该连接组时收到的ETag值,用于并发保护
--enabled/--no-enabledEnabled可选是否启用连接组;默认由布尔值开关控制
--ipv6-enabled/--no-ipv6-enabledIpv6Enabled可选是否为连接组启用 IPv6
--anycast-ip-list-idAnycastIpListId可选要绑定的 Anycast 静态 IP 列表 ID

需要特别注意的是:--enabled--ipv6-enabled这类布尔参数在 AWS CLI 中使用--xxx-enabled/--no-xxx-enabled的成对开关形式传入。未指定的布尔字段在更新请求中不会被提交,这与其他某些 CloudFront 资源(如分发配置的“整体替换”语义)不同——更新连接组时只需携带你要修改的字段即可。

典型用法示例

下面这条命令来自官方示例文档 update-connection-group.rst,演示了如何禁用连接组并同时关闭 IPv6

aws cloudfront update-connection-group \ --id cg_2yHsDkcPKeUlVkk3aEgLKcjABC \ --no-ipv6-enabled \ --no-enabled \ --if-match E3UN6WX5RRO2ABC

执行成功后的输出如下:

{ "ETag": "E1F83G8C2ARABC", "ConnectionGroup": { "Id": "cg_2yHsDkcPKeUlVkk3aEgLKcjABC", "Name": "cg-example", "Arn": "arn:aws:cloudfront::123456789012:connection-group/cg_2yHsDkcPKeUlVkk3aEgLKcjABC", "CreatedTime": "2025-06-09T20:58:35.481000+00:00", "LastModifiedTime": "2025-06-11T16:25:54.280000+00:00", "Ipv6Enabled": false, "RoutingEndpoint": "du9xp1elo1abc.cloudfront.net", "Status": "InProgress", "Enabled": false, "IsDefault": false } }

返回结果逐字段解读

根据UpdateConnectionGroupResultConnectionGroup的定义,响应体中包含:

  • ETag(顶层):更新后连接组的最新版本标识。每次更新都会生成新的 ETag,后续再执行更新时必须使用这个新值作为--if-match的输入。
  • ConnectionGroup.Id:连接组 ID,与请求中的--id一致,格式为cg_前缀的字符串。
  • ConnectionGroup.Name:连接组名称(本示例为cg-example)。
  • ConnectionGroup.Arn:连接组的 ARN,形如arn:aws:cloudfront::123456789012:connection-group/cg_2yHsDkcPKeUlVkk3aEgLKcjABC,可用于资源级权限管理与标签操作。
  • ConnectionGroup.CreatedTime/LastModifiedTime:创建时间与本次修改后的更新时间(ISO 8601 格式)。在本示例中可以看到两者相差约两天,说明该连接组并非新建,而是被更新的既有资源。
  • ConnectionGroup.Ipv6Enabled:本次更新后为false,与--no-ipv6-enabled对应。
  • ConnectionGroup.RoutingEndpoint:连接组被分配的路由端点 DNS 名称(du9xp1elo1abc.cloudfront.net),由 CloudFront 分配,创建后不可修改。
  • ConnectionGroup.StatusInProgress表示本次更新正在生效中;连接组配置会在后台传播,最终变为Deployed状态(可参见 get-connection-group.rst 中已部署连接组的输出示例)。
  • ConnectionGroup.Enabled:本次更新后为false,与--no-enabled对应。
  • ConnectionGroup.IsDefaultfalse表示这是一个自定义连接组,而非系统自动创建的默认连接组。

理解If-Match与 ETag 乐观锁机制

update-connection-group的请求模型中,IfMatch被标记为必填参数,其文档明确说明:“这是你在读取要更新的连接组时收到的ETag头值”。这意味着更新操作采用乐观并发控制

  1. 先通过aws cloudfront get-connection-group --identifier <id>读取当前连接组,从响应中拿到ETag(参见 get-connection-group.rst);
  2. 修改需要变更的字段,并携带该ETag作为--if-match提交更新;
  3. 服务端校验If-Match头与连接组当前版本是否一致:一致则应用更新并返回新的 ETag;不一致则拒绝请求,防止覆盖他人/其他流程的并发修改。

在 service-2.json 中,UpdateConnectionGroup操作声明的错误列表也印证了这一点:

  • PreconditionFailedIf-Match头携带的 ETag 与当前版本不匹配(典型并发冲突,需重新get后再试);
  • InvalidIfMatchVersion:传入的If-Match值格式/版本非法;
  • EntityNotFound:目标连接组不存在(可能已被删除);
  • EntityAlreadyExists:更新导致与已存在实体冲突;
  • EntityLimitExceeded:超出实体数量限制;
  • ResourceInUse:连接组当前正被其他资源(如分布租户)使用,无法执行该更新;
  • AccessDenied:当前凭证无权修改该连接组;
  • InvalidArgument:请求参数不合法。

因此,每次更新成功后,务必从响应中读取新的ETag(如示例中的E1F83G8C2ARABC)并妥善保存,作为下一次更新的--if-match值。

连接组完整生命周期:从创建到删除

update-connection-group只是连接组生命周期中的一环。在当前仓库的 cloudfront 示例目录(awscli/examples/cloudfront/)中,可以看到围绕连接组的完整命令族,服务模型中对应操作均可在 service-2.json 找到:

阶段命令底层 API说明
创建create-connection-groupPOST /2020-05-31/connection-group新建连接组,可指定名称、Anycast IP 列表、IPv6 开关与标签
查询get-connection-groupGET /2020-05-31/connection-group/{Id}获取单个连接组详情及当前 ETag
查询list-connection-groupsGET /2020-05-31/connection-group列出所有连接组摘要(ConnectionGroupSummary
更新update-connection-groupPUT /2020-05-31/connection-group/{Id}修改启用状态、IPv6 开关、Anycast IP 列表
删除delete-connection-groupDELETE /2020-05-31/connection-group/{Id}删除不再需要的连接组

以 create-connection-group.rst 为例,创建命令为:

aws cloudfront create-connection-group \ --name cg-with-anycast-ip-list \ --no-ipv6-enabled \ --enabled \ --anycast-ip-list-id aip_CCkW6gKrDiBD4n78123ABC \ --tags "Items=[{Key=abc,Value=123}]"

创建成功后会返回与更新命令同构的ConnectionGroup结构(同样包含ETagRoutingEndpointStatus: InProgress等字段),其中的ETag即为后续首次update-connection-group--if-match的来源。

一个典型的运维流程是:

# 1. 读取当前状态,拿到 ETag aws cloudfront get-connection-group --identifier cg_2yHsDkcPKeUlVkk3aEgLKcjABC # 2. 基于返回的 ETag 做条件更新(例如仅关闭 IPv6,保持 Enabled 不变) aws cloudfront update-connection-group \ --id cg_2yHsDkcPKeUlVkk3aEgLKcjABC \ --no-ipv6-enabled \ --if-match E3UN6WX5RRO2ABC # 3. 如不再需要,删除该连接组 aws cloudfront delete-connection-group --id cg_2yHsDkcPKeUlVkk3aEgLKcjABC

注意:由于update-connection-group属于 PUT 类操作,服务模型中的错误列表还包含EntityNotFound(目标不存在)与ResourceInUse(资源使用中)等状态,实际自动化脚本中应针对这些错误做相应的重试或告警处理。

源码级依据与进一步探索

本文涉及的参数定义、必填约束、HTTP 方法与错误列表均来自当前仓库的服务模型 awscli/botocore/data/cloudfront/2020-05-31/service-2.json:

  • UpdateConnectionGroup操作定义(PUT /2020-05-31/connection-group/{Id}、200 响应码)以及PreconditionFailedResourceInUseAccessDeniedEntityNotFoundEntityAlreadyExistsEntityLimitExceededInvalidArgumentInvalidIfMatchVersion八种错误;
  • UpdateConnectionGroupRequest/UpdateConnectionGroupResult结构的字段与必填项;
  • ConnectionGroup/ConnectionGroupSummary结构及其字段文档说明。

该 JSON 模型是 AWS CLI 为 CloudFront 服务生成命令、参数校验与序列化逻辑的数据基础,也是理解update-connection-group各参数底层映射关系的权威依据。

如果你想继续深入其他连接组操作,可以对比阅读同一目录下的 create-connection-group.rst、get-connection-group.rst、list-connection-groups.rst、delete-connection-group.rst 以及 get-connection-group-by-routing-endpoint.rst 等官方示例,从而形成对 CloudFront 连接组管理能力的完整认识。

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

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

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询