terraform-provider-aws 6.42.0 版本发布详解:MQ 配置删除行为变更、PromQL 告警支持与大批量 List Resource 上线
【免费下载链接】terraform-provider-awsThe AWS Provider enables Terraform to manage AWS resources.项目地址: https://gitcode.com/GitHub_Trending/te/terraform-provider-aws
本篇围绕 terraform-provider-aws 6.42.0 版本发布说明展开,逐一拆解该版本中的破坏性变更、全新资源/数据源、关键增强与缺陷修复,并结合仓库源码(如internal/service/mq/configuration.go、internal/service/cloudwatch/metric_alarm.go、internal/service/ec2/)验证底层实现。读完本文,你将掌握aws_mq_configuration新增的skip_destroy用法、CloudWatch 指标告警的 PromQL 配置方式、aws_eip在隔离区域的行为兜底,以及 13 个新增 List Resource 的落地场景。
版本概览
6.42.0(2026-04-22)是 AWS Provider 在 6.x 系列中的一个功能密集版本,变更类型覆盖四个方面:
- 破坏性变更(BREAKING CHANGES):
aws_mq_configuration资源销毁行为从 no-op 变为真实删除; - 新功能(FEATURES):新增 2 个数据源、13 个 List Resource、2 个常规 Resource;
- 增强(ENHANCEMENTS):涉及 EKS 资源身份、CloudWatch PromQL 告警、ODB 跨区域恢复、S3 目录桶 Inventory、Storage Lens 导出等;
- 缺陷修复(BUG FIXES):覆盖 Bedrock Guardrail、MSK 集群、Security Hub 成员漂移、ECS 服务列举等十余项。
对应发布说明原文见仓库中的 .changes/6.x/6.42.0.md,完整变更历史可在 CHANGELOG.md 中追溯。
破坏性变更:aws_mq_configuration 删除行为落地
6.42.0 最值得关注的破坏性变更来自aws_mq_configuration:销毁该资源时现在会真正调用 AWS API 删除配置,而此前由于 MQ 服务缺少对应的删除 API 操作,delete 一直是一个 no-op,导致资源在 Terraform 状态中被移除后,云端配置仍残留、处于无人管理(unmanaged)状态。正因为旧行为会造成资源泄漏,维护者认为在 minor 版本中引入该破坏性变更是可接受的。
源码实现:从 no-op 到真实删除
在 internal/service/mq/configuration.go 的resourceConfigurationDelete中可以看到完整实现:
func resourceConfigurationDelete(ctx context.Context, d *schema.ResourceData, meta any) diag.Diagnostics { var diags diag.Diagnostics conn := meta.(*conns.AWSClient).MQClient(ctx) if v, ok := d.GetOk(names.AttrSkipDestroy); ok && v.(bool) { log.Printf("[DEBUG] Retaining MQ Configuration: %s", d.Id()) return diags } log.Printf("[INFO] Deleting MQ Configuration: %s", d.Id()) input := mq.DeleteConfigurationInput{ ConfigurationId: aws.String(d.Id()), } const ( timeout = 1 * time.Minute ) _, err := tfresource.RetryWhenIsAany, *types.ConflictException (any, error) { return conn.DeleteConfiguration(ctx, &input) }) if errs.IsA*types.NotFoundException { return diags } if err != nil { return sdkdiag.AppendErrorf(diags, "deleting MQ Configuration (%s): %s", d.Id(), err) } return diags }实现要点:
- 重试机制:删除调用被
tfresource.RetryWhenIsA包裹,遇到ConflictException会在 1 分钟超时内自动重试,适用于配置仍被 broker 引用等并发冲突场景; - 幂等处理:若 AWS 侧返回
NotFoundException,说明配置已不存在,直接静默返回,保证terraform destroy的幂等性; skip_destroy逃生口:删除逻辑的第一行即检查skip_destroy,为 true 时仅记录日志并保留云端资源,用于恢复旧版 no-op 行为。
skip_destroy 参数与升级指引
该破坏性变更随附新增的skip_destroy参数(默认false)。升级到 6.42.0 前,建议评估现有aws_mq_configuration的删除预期:
- 默认行为(推荐):保持
skip_destroy = false,让terraform destroy同步清理 MQ 配置,避免孤儿资源; - 恢复旧行为:若你的工作流依赖"状态删除、云端保留"的旧语义,请在配置中显式设置:
resource "aws_mq_configuration" "example" { name = "example-config" engine_type = "ActiveMQ" engine_version = "5.18.0" data = file("config.xml") skip_destroy = true }需要注意,真实删除需要mq:DeleteConfigurationIAM 权限。若执行删除的凭证缺少该权限,terraform destroy将报错失败;此前 no-op 行为下该权限并不必要。仓库测试 internal/service/mq/configuration_test.go 中的用例即验证了skip_destroy = true时资源被保留的场景,而 internal/service/mq/broker_test.go 中 broker 相关测试也覆盖了该参数组合。
新数据源:EC2 Service Link Virtual Interface
本版本新增了两个 EC2 相关数据源:
aws_ec2_service_link_virtual_interface(单接口查询)aws_ec2_service_link_virtual_interfaces(批量列举)
它们基于 EC2 的DescribeServiceLinkVirtualInterfacesAPI。以批量数据源为例,internal/service/ec2/service_link_virtual_interfaces_data_source.go 中的 Schema 包含ids(计算属性,返回接口 ID 列表)、tags(标签过滤)以及filter块(自定义过滤器),Read方法通过 findServiceLinkVirtualInterfaces 调用 SDK 并将结果扁平化为 ID 列表:
data "aws_ec2_service_link_virtual_interfaces" "all" { filter { name = "status" values = ["available"] } }配套测试见 internal/service/ec2/service_link_virtual_interfaces_data_source_test.go,单接口版本位于 service_link_virtual_interface_data_source.go。
新资源:cloudwatch_otel_enrichment 与 ebs_volume_copy
aws_cloudwatch_otel_enrichment
新增的 CloudWatch OTel Enrichment 资源(PR #47275)用于配置 OpenTelemetry 指标/日志富化处理,可在 CloudWatch 观测管道中对接 OTel 数据流。
aws_ebs_volume_copy
新增的 EBS 卷复制资源(PR #47311)允许通过 Terraform 管理"卷复制"这一有状态对象。相比直接依赖aws_ebs_volume+ 数据拷贝命令,该资源将复制关系纳入状态管理,支持后续查询与清理。它与同期新增的aws_ebs_volume、aws_ebs_volume_attachmentList Resource 形成了 EBS 资源族的完整覆盖。
批量落地:13 个新 List Resource
6.42.0 集中引入了一批新的List Resource(基于框架的列表型资源,见 internal/framework/with_list.go 及相关生成模板,设计规范可参考 docs/design-decisions/relationship-resource-design-standards.md):
| List Resource | 说明 | 关联 PR |
|---|---|---|
aws_apigatewayv2_api | API Gateway V2 API | #47472 |
aws_cloudwatch_log_metric_filter | 日志指标过滤器(同步获得 Resource Identity 支持) | #47495 |
aws_config_remediation_configuration | Config 修复配置 | #47514 |
aws_ebs_volume | EBS 卷 | #47551 |
aws_ebs_volume_attachment | EBS 卷挂载 | #47561 |
aws_eip | 弹性 IP(同步获得 Resource Identity 支持) | #47557 |
aws_iam_user_policy_attachment | IAM 用户策略挂载 | #47467 |
aws_internet_gateway | 互联网网关 | #47529 |
aws_lambda_layer_version | Lambda 层版本(同步获得 Resource Identity 支持) | #47496 |
aws_launch_template | 启动模板(同步获得 Resource Identity 支持) | #47540 |
aws_route53_zone | Route 53 托管区 | #47494 |
aws_sagemaker_hyper_parameter_tuning_job | SageMaker 超参调优作业 | #47138 |
aws_sqs_queue_policy | SQS 队列策略 | #47489 |
List Resource 遵循"一个逻辑资源对象对应多个云侧条目"的建模方式,方便将原本散落的子条目作为整体进行管理。多个资源同时声明获得Resource Identity 支持(aws_eip、aws_launch_template、aws_lambda_layer_version、aws_ebs_volume_attachment、aws_cloudwatch_log_metric_filter),意味着这些资源可以在 plan 阶段通过 identity 而非 ID 进行匹配,相关机制见 docs/resource-identity.md 与 internal/framework/with_identity.go。
其中aws_sagemaker_hyper_parameter_tuning_job同时以常规 Resource 和 List Resource 两种形态提供(分别对应 #47138 的实现),允许用户按需选择管理粒度。
关键增强逐项解读
CloudWatch 指标告警支持 PromQL 查询
aws_cloudwatch_metric_alarm新增evaluation_criteria与evaluation_interval参数,以支持 CloudWatch 的 PromQL 告警能力;同时comparison_operator、evaluation_periods由必填改为 Optional(PR #47449)。
从 internal/service/cloudwatch/metric_alarm.go 的 Schema 可以看到约束关系:
evaluation_criteria与metric_name、metric_query构成ExactlyOneOf,即三种告警定义方式互斥;evaluation_criteria.promql_criteria为必填块,含query(必填,长度 1~10000 字符)、pending_period与recovery_period(可选,0~86400 秒);evaluation_interval仅允许10、20、30或 60 的倍数(validation.Any(validation.IntInSlice([]int{10, 20, 30}), validation.IntDivisibleBy(60))),且必须与evaluation_criteria同时出现(RequiredWith)。
一个完整的 PromQL 告警配置示例(取自仓库测试 internal/service/cloudwatch/metric_alarm_test.go):
resource "aws_cloudwatch_metric_alarm" "example" { alarm_name = "promql-alarm" evaluation_criteria { promql_criteria { query = "histogram_quantile(0.99, CPUUtilization) > 0.5" pending_period = 120 recovery_period = 300 } } evaluation_interval = 600 }对应测试断言(metric_alarm_test.go)验证了evaluation_criteria.0.promql_criteria.0.query、pending_period、recovery_period与evaluation_interval的读写一致性。
aws_eip:Resource Identity 与隔离区域兜底
aws_eip在 6.42.0 中获得 Resource Identity 支持,同时修复了隔离区域(isolated regions)中的UnsupportedOperation报错问题(PR #47091)。
从 internal/service/ec2/ec2_eip.go 可以看到,读取 EIP 的 domain name 属性(ptr_record)时,对以下两类错误做了降级处理而非直接失败:
// Fallback for ISO regions case tfawserr.ErrMessageContains(err, "InvalidAction", "not valid for this web service"), tfawserr.ErrMessageContains(err, errCodeUnsupportedOperation, "not available in this region"): d.Set("ptr_record", nil)即:当某区域不支持该操作时,ptr_record被置空并继续正常读取其余属性。错误码常量errCodeUnsupportedOperation = "UnsupportedOperation"定义于 internal/service/ec2/errors.go。
需要注意发布说明中的提示:由于无法在隔离区域中轻易测试该行为,此修复为"尽力而为"(best effort),维护者呼吁社区在隔离区域帮助验证。如果你部署在 AWS 中国区或 GovCloud 等隔离分区,升级后请重点回归aws_eip的读取流程。
EKS 资源族批量获得 Resource Identity
aws_eks_access_entry、aws_eks_access_policy_association、aws_eks_addon、aws_eks_capability、aws_eks_identity_provider_config、aws_eks_node_group、aws_eks_pod_identity_association、aws_fargate_profile八个资源统一获得 Resource Identity 支持(PR #47428)。同时:
aws_eks_addon新增namespace_config参数(#44087);aws_eks_identity_provider_config新增identity_provider_config_name属性(#47428)。
其余增强速览
aws_network_interface:新增ena_srd_specification参数以支持 ENA Express 高吞吐特性(数据源aws_network_interface同步新增同名属性,PR #46669);aws_identitystore_user/ 数据源:新增user_status属性(#47323);aws_odb_network:增强以支持跨区域恢复(cross-region restore,#46317),并在修复部分解决了创建期间statusManagedService()与statusNetwork()的空指针 panic(#47159);aws_mq_configuration:除破坏性变更外还新增skip_destroy参数(#47273);aws_networkmanager_site_to_site_vpn_attachment:routing_policy_label支持就地更新,需要networkmanager:PutAttachmentRoutingPolicyLabel与networkmanager:RemoveAttachmentRoutingPolicyLabel权限(#47541);aws_rds_integration:新增integration_identifier属性,data_filter与integration_name支持就地更新(#45632);aws_s3_bucket_inventory:支持目录桶(directory buckets)的 Inventory(#47555);aws_s3control_storage_lens_configuration:新增storage_lens_configuration.expanded_prefixes_data_export与storage_lens_configuration.prefix_delimiter参数(#47205);aws_s3files_file_system:新增accept_bucket_warning参数(#47510);- 网络对等连接:通过
peer_network_cidrs参数管理对端 CIDR(#46207)。
缺陷修复要点
本版本修复了多个影响面较大的问题:
aws_bedrock_guardrail:topic_policy_config.topics_config.definition最大长度从 200 提升到 1000,以支持标准层级(#47574);aws_cloudwatch_alarm_mute_rule:修复mute_targets.alarm_names排序不一致导致的 "Provider produced inconsistent result after apply" 报错(#47507);aws_ecs_service:列举时排除 Express-Mode 服务(#47533);aws_msk_cluster:修复更新broker_node_group_info.vpc_connectivity配置块时的请求参数错误,该问题由 v6.40.0 引入(#47515);aws_odb_network:修复创建期间 finder 返回 nil 时statusManagedService()/statusNetwork()的空指针 panic(#47159);aws_securityhub_member:仅在 AWS API 返回时才设置email,且不再根据member_status反推invite,消除组织成员场景下的状态漂移(#47106);aws_appintegrations_data_integration:修复source_uri的正则校验(#47498)。
其他注意事项
- CDKTF 文档移除:从本版本起,Provider 内不再附带 CDKTF 相关文档(#47484),如需 CDKTF 使用说明请以 CDKTF 官方渠道为准;
- 破坏性变更评估:升级前务必结合"破坏性变更"一节评估
aws_mq_configuration的删除语义与 IAM 权限,必要时先设置skip_destroy = true过渡; - 验证途径:Provider 的安装与验证方式与常规 Terraform Provider 一致,可参考仓库 README.md 与 docs/development-environment.md;针对本版本涉及的各项变更,仓库内已有对应的单元与验收测试(如
internal/service/cloudwatch/metric_alarm_test.go、internal/service/ec2/service_link_virtual_interface_data_source_test.go、internal/service/mq/configuration_test.go)可供参考。
【免费下载链接】terraform-provider-awsThe AWS Provider enables Terraform to manage AWS resources.项目地址: https://gitcode.com/GitHub_Trending/te/terraform-provider-aws
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考