使用 terraform-provider-aws 端到端编排 AWS Resilience Hub V2:策略、系统、服务与输入源全资源实战 使用 terraform-provider-aws 端到端编排 AWS Resilience Hub V2策略、系统、服务与输入源全资源实战【免费下载链接】terraform-provider-awsThe AWS Provider enables Terraform to manage AWS resources.项目地址: https://gitcode.com/GitHub_Trending/te/terraform-provider-awsAWS Resilience Hub 是 AWS 提供的韧性Resilience评估与管理服务用于定义可用性目标、评估应用架构的容灾能力并持续跟踪改进。Resilience Hub V2下一代 Resilience Hub在原有模型之上引入了 Policy策略、System系统、Service服务、User Journey用户旅程、Service Function服务功能与 Input Source输入源等更细粒度的分层建模方式。本指南以 examples/resiliencehubv2/README.md 为骨架结合 examples/resiliencehubv2/main.tf 完整示例与internal/service/resiliencehubv2目录下的源码实现讲解如何用 terraform-provider-aws 一次性编排完整、可复用的 Resilience Hub V2 落地配置读完即可照着复制并运行属于自己的韧性评估环境。一、示例全景六类资源如何组合成完整韧性体系该示例的目标是像真实客户那样端到端组合一套 Resilience Hub V2 配置共涉及六个资源资源类型在示例中的角色aws_resiliencehubv2_policy可复用的韧性策略定义可用性 SLOAvailability SLO与多可用区容灾目标aws_resiliencehubv2_system顶层系统分组用于将服务归类组织aws_resiliencehubv2_service按上述策略接受评估的服务aws_resiliencehubv2_user_journey系统内关键端到端用户旅程aws_resiliencehubv2_service_function服务内技术工作流的子集aws_resiliencehubv2_input_source从 CloudFormation 栈发现资源的输入源从源码看这六类资源全部由 internal/service/resiliencehubv2/service_package_gen.go 注册到 Provider 的 FrameworkResources 中此外该服务包还提供aws_resiliencehubv2_policy、aws_resiliencehubv2_service、aws_resiliencehubv2_system三个数据源以及aws_resiliencehubv2_assertion断言资源说明该模块已具备完整的建模—评估—断言闭环能力。二、完整示例配置逐段拆解下面是 examples/resiliencehubv2/main.tf 的完整内容它同时声明了 Terraform 版本约束、AWS Provider 区域以及上述六个资源我们按区块逐段讲解。2.1 Provider 与版本声明terraform { required_version 0.12 } provider aws { region us-west-2 } data aws_region current {}required_version 0.12示例保持对 Terraform 0.12 及更高版本的兼容实际生产环境建议使用当前稳定版 Terraform 与最新版 AWS Provider。region us-west-2指定默认区域。Resilience Hub V2 的资源在 service_package_gen.go 中均通过inttypes.ResourceRegionDefault()注册为默认区域资源即跟随 Provider 配置的区域。data aws_region current {}读取当前区域名随后用于aws_resiliencehubv2_service的regions字段保证服务评估区域与 Provider 区域一致。2.2 策略资源定义可用性 SLO 与容灾目标# A reusable resilience policy defining availability SLO and DR targets. resource aws_resiliencehubv2_policy example { name terraform-example-policy availability_slo { target 99.9 } multi_az { disaster_recovery_approach ACTIVE_ACTIVE rpo_in_minutes 5 rto_in_minutes 10 } }结合 internal/service/resiliencehubv2/policy.go 的 Schema 实现该资源的关键约束如下name必填必须匹配^[A-Za-z0-9][A-Za-z0-9_\-]{1,59}$即 2~60 个字符、以字母或数字开头仅允许字母、数字、连字符和下划线且name与kms_key_id都带RequiresReplace()修改会触发重建。availability_slo.target必填Float 类型取值范围0~100表示可用性百分比示例中的99.9即 99.9%。availability_slo块最多 1 个。multi_az可选最多 1 个disaster_recovery_approach必填枚举类型示例使用ACTIVE_ACTIVErpo_in_minutes可选恢复点目标Recovery Point Objective整数且 0rto_in_minutes可选恢复时间目标Recovery Time Objective整数且 0。除示例用到的两个块外源码还支持data_recoverytime_between_backups_in_minutes整数 0与multi_region结构与multi_az相同但disaster_recovery_approach为多区域枚举两个可选块。通过listvalidator.AtLeastOneOf校验availability_slo、data_recovery、multi_az、multi_region四者至少要配置其中一个保证策略一定包含某种韧性目标。顶层还支持description长度 0~615、kms_key_idARN指定即强制使用客户托管 KMS 密钥、tags与tags_all。在生命周期实现上Create 阶段会调用CreatePolicy并补充ClientToken由create.UniqueId生成与TagsUpdate 阶段存在一个值得注意的细节当某个列表块从有值变为空时源码通过fwplanmodifiers.ListEmptied显式发送空结构体如awstypes.AvailabilitySlo{}而不是省略字段确保服务端能正确清空目标policy.go。2.3 系统资源顶层分组# A top-level system that groups services together. resource aws_resiliencehubv2_system example { name terraform-example-system description Example Resilience Hub system }internal/service/resiliencehubv2/system.go 显示该系统资源属性精简name必填同样适用 2~60 字符的资源名校验且RequiresReplace。description可选长度 0~615。kms_key_id可选ARNRequiresReplace。sharing_enabled可选布尔值是否允许与其他账户共享该系统。计算属性organization_id、ou_id所属 AWS Organizations 组织/OU、system_id系统 ID与arn。示例只声明了名称与描述其余均为可选或由服务端回填适合作为最轻量的分组起点。2.4 服务资源接受策略评估的核心实体# A service assessed against the policy above. resource aws_resiliencehubv2_service example { name terraform-example-service regions [data.aws_region.current.name] policy_arn aws_resiliencehubv2_policy.example.arn permission_model { invoker_role_name AWSResilienceHubAssessmentRole } }internal/service/resiliencehubv2/service.go 是六类资源中属性最丰富的一个name必填2~60 字符校验RequiresReplace。regions必填字符串集合校验SizeBetween(1, 5)且每个值必须是合法 AWS 区域名。示例通过data.aws_region.current.name引用当前区域。policy_arn可选要绑定的策略 ARN示例用aws_resiliencehubv2_policy.example.arn建立资源间依赖Terraform 会自动保证先创建策略再创建服务。permission_model必填且恰 1 个invoker_role_name必填承担评估调用角色的 IAM 角色名。示例 README 特别强调该角色必须在apply之前存在于账户中即AWSResilienceHubAssessmentRole。cross_account_role可选0~5 个跨账户角色块包含cross_account_role_arn必填ARN与external_id可选外部 ID用于跨账户评估场景。dependency_discovery可选依赖发现模式枚举Computed创建后由服务端回填Read 阶段会根据svc.DependencyDiscovery.Status映射为Enabled/Disabled见 service.go。associated_system可选0~20 个关联系统块包含system_arn必填与user_journey_ids可选1~20 个用于把服务挂到系统下并关联特定用户旅程。注意 service.go 中有一条重要注释UpdateService会把省略的associated_system视为不变化因此要删除最后一个关联块时Provider 会显式发送空列表[]awstypes.AssociatedSystem{}才能生效。此外支持description0~615、kms_key_idARNRequiresReplace、tags/tags_all。创建与更新时Provider 对CreateService/UpdateService使用tfresource.RetryWhenIsAErrorMessageContains重试匹配ValidationException且错误信息包含Ensure the role exists and its trust policy allows access重试窗口为propagationTimeout2 分钟定义在 consts.go用于容忍 IAM 角色刚创建后尚未传播完成的场景。2.5 用户旅程资源关键端到端路径# A critical user journey within the system. resource aws_resiliencehubv2_user_journey example { name terraform-example-journey system_arn aws_resiliencehubv2_system.example.arn }用户旅程代表系统内一条关键端到端用户路径。依据 internal/service/resiliencehubv2/user_journey.goname必填2~60 字符校验。system_arn必填所属系统的 ARNRequiresReplace示例引用aws_resiliencehubv2_system.example.arnTerraform 自动保证系统先于旅程创建。policy_arn可选可单独为该旅程覆盖策略。description可选长度 0~500。计算属性user_journey_id。身份标识为system_arn user_journey_id二元组Read/Delete 都通过GetUserJourney/DeleteUserJourney以两个字段联合定位导入时使用userJourneyImportID.Parse将system_arn/user_journey_id形式的分隔 ID 解析回两个字段user_journey.go。2.6 服务功能资源服务内的技术工作流# A technical workflow subset of the service. resource aws_resiliencehubv2_service_function example { name terraform-example-function service_arn aws_resiliencehubv2_service.example.arn criticality PRIMARY }服务功能是服务内部更细粒度的技术工作流。依据 internal/service/resiliencehubv2/service_function.goname必填2~60 字符校验。service_arn必填所属服务的 ARNRequiresReplace。criticality必填枚举类型ServiceFunctionCriticality示例使用PRIMARY主功能用于标记该功能在业务中的重要程度。description可选长度 0~500。计算属性service_function_id。同样以service_arn service_function_id为二元身份导入 ID 格式为service_arn/service_function_id。2.7 输入源资源从 CloudFormation 栈发现资源# A CloudFormation stack used as a resource-discovery input source. resource aws_cloudformation_stack example { name terraform-example-stack template_body jsonencode({ AWSTemplateFormatVersion 2010-09-09 Description Example stack for Resilience Hub input source Resources { WaitHandle { Type AWS::CloudFormation::WaitConditionHandle } } }) } # An input source that discovers resources from the CloudFormation stack. resource aws_resiliencehubv2_input_source example { service_arn aws_resiliencehubv2_service.example.arn resource_configuration { cfn_stack_arn aws_cloudformation_stack.example.id } }输入源用于向服务注入待评估的真实资源清单。示例先创建一个仅含WaitConditionHandle的最小 CloudFormation 栈template_body内联 JSON再把栈 ARN 作为输入源。internal/service/resiliencehubv2/input_source.go 显示该资源支持五种互斥的资源发现方式tfobjectvalidator.ExactlyOneOfChildren强制只能选一种方式字段/块适用场景CloudFormation 栈resource_configuration.cfn_stack_arn从 CFN 栈发现资源示例所用设计文件resource_configuration.design_file_s3_url从 S3 上的架构设计文件导入EKS 集群resource_configuration.eks含cluster_arn必填、namespaces必填 1~10 个、每个名称 1~63 字符从 EKS 指定命名空间发现资源资源标签resource_configuration.resource_tagkey1~128 字符values0~10 个、每个 0~256 字符按标签批量圈定资源Terraform 状态resource_configuration.tf_state_file_url从 Terraform 状态文件导入资源关键生命周期细节这是一个创建后不可更新的资源inputSourceResource内嵌framework.WithNoUpdateservice_arn与整个resource_configuration均带RequiresReplace任何变更都会重建输入源。service_arn必填input_source_id计算构成二元身份导入 ID 为service_arn/input_source_idinput_source.go。Create 使用tfresource.RetryWhenIsAErrorMessageContains重试AccessDeniedException错误信息匹配The invoker role does not have access to同样是 2 分钟传播窗口——这正是 README 提示评估角色必须预先存在的底层原因之一。Read 阶段依据is.Type枚举CfnStack、DesignFile、Eks、Tags、Terraform反填对应的resource_configuration子字段input_source.go。三、运行示例的完整流程在包含上述配置文件的目录中依次执行terraform init terraform plan terraform applyterraform init初始化工作目录并下载 AWS Provider。terraform plan生成执行计划重点确认六个资源与 CloudFormation 栈的创建顺序Terraform 会依据policy_arn、system_arn、service_arn等引用自动拓扑排序。terraform apply按依赖顺序创建资源如提示确认则输入yes。前置条件评估角色必须预先存在README 明确指出aws_resiliencehubv2_service的permission_model.invoker_role_name引用的AWSResilienceHubAssessmentRoleIAM 角色必须在apply之前已经存在于账户中否则服务创建或输入源接入时会触发ValidationExceptionEnsure the role exists and its trust policy allows access或AccessDeniedExceptionThe invoker role does not have access to。Provider 虽然会针对这两类错误做最多 2 分钟的传播重试但角色本身缺失时重试最终仍会失败。因此建议先通过 IAM 资源或控制台创建该角色并配置好信任策略再执行本示例。验证与清理验证terraform state list查看已管理的资源或terraform show查看各资源回填的arn、system_id、user_journey_id、service_function_id、input_source_id等计算属性。清理执行terraform destroy会按依赖逆序删除输入源、服务功能、用户旅程、服务、系统、策略以及 CloudFormation 栈。四、源码级要点小结综合 internal/service/resiliencehubv2 目录下的实现使用该示例时有四个值得关注的工程细节命名校验统一validResourceName定义在 policy.go规则为^[A-Za-z0-9][A-Za-z0-9_\-]{1,59}$被 policy、system、service、user_journey、service_function 五个资源复用命名不规范会在plan阶段即被拦截。传播延迟容错propagationTimeout 2 * time.Minuteconsts.go配合tfresource.RetryWhenIsAErrorMessageContains专门处理 IAM 角色/跨账户授权刚生效时的临时性错误生产环境编排角色资源时不必额外手写depends_on睡眠。列表块清空语义policy 的 SLO/DR 目标块与 service 的associated_system在从有到无时Provider 会显式发送空结构体或空列表避免未传参被服务端误解为不修改。身份与导入user_journey、service_function、input_source 都是父 ARN 子 ID的二元身份资源导入时统一使用父ARN/子ID的分隔格式policy、service、system 则直接以 ARN 为身份并可整体导入。五、进一步探索完整示例配置examples/resiliencehubv2/main.tf示例说明文档examples/resiliencehubv2/README.md服务包注册与数据源/资源清单internal/service/resiliencehubv2/service_package_gen.go各资源源码policy.go、system.go、service.go、user_journey.go、service_function.go、input_source.go资源级文档website/docs/r/resiliencehubv2_policy.html.markdown、website/docs/r/resiliencehubv2_service.html.markdown、website/docs/r/resiliencehubv2_input_source.html.markdown等位于 website/docs/r 目录通过上述六类资源你可以在 Terraform 中完整复刻策略 → 系统 → 服务 → 用户旅程 → 服务功能 → 输入源的 Resilience Hub V2 建模链路并借助 Provider 内置的校验、传播重试与导入能力把韧性治理纳入基础设施即代码的日常流程。【免费下载链接】terraform-provider-awsThe AWS Provider enables Terraform to manage AWS resources.项目地址: https://gitcode.com/GitHub_Trending/te/terraform-provider-aws创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考