使用 Terraform AWS Provider 手动初始化 AWS Elastic Disaster Recovery(DRS):DRS Initialize 示例解析

发布时间:2026/9/17 1:27:24
使用 Terraform AWS Provider 手动初始化 AWS Elastic Disaster Recovery(DRS):DRS Initialize 示例解析 使用 Terraform AWS Provider 手动初始化 AWS Elastic Disaster RecoveryDRSDRS Initialize 示例解析【免费下载链接】terraform-provider-awsThe AWS Provider enables Terraform to manage AWS resources.项目地址: https://gitcode.com/GitHub_Trending/te/terraform-provider-awsAWS Elastic Disaster RecoveryDRS是 AWS 提供的灾难恢复服务可以将源服务器上的数据持续复制到 AWS并在灾备演练或真实灾难发生时快速拉起恢复实例。在使用 DRS 之前账户必须完成一次性的服务初始化initialize-service该过程会创建 DRS 服务运行所需的默认角色、服务相关角色Service-Linked Role与复制配置等基础设施。terraform-provider-aws仓库中的 DRS Initialize 示例 展示了如何用 Terraform 以声明式方式完成这一初始化——它不直接调用 DRS API而是先把 DRS 依赖的全部 IAM 角色与权限策略准备妥当再交由用户以初始化角色身份执行一条aws drs initialize-service命令。阅读完本文你将掌握该示例的完整配置逻辑、每一个 IAM 角色与策略的用途、初始化三步操作以及初始化完成后如何继续用 Provider 管理 DRS 复制配置模板。一、为什么 DRS 需要手动初始化DRS 服务在账户中正式启用前需要具备一套完整的权限体系负责在源服务器上安装并运行复制代理的角色、负责在目标端拉起 EC2 实例的角色、复制服务器与恢复实例使用的角色以及执行初始化动作本身所需的临时权限。AWS 官方推荐的初始化路径是先用 Terraform 把全部角色和策略创建好再扮演初始化角色执行初始化命令。这正是 examples/drs-initialize 目录的设计意图。该目录仅包含两个文件README.md初始化步骤说明main.tf完整的 IAM 角色与策略定义共约 290 行。整个初始化不依赖任何 DRS 专属 Terraform 资源main.tf完全由 IAM 相关的 data source 与资源构成这也是该示例可以反复运行、幂等复用的原因。二、运行前置条件与目录结构main.tf开头声明了 Terraform 版本要求terraform { required_version 0.12 }即该示例要求 Terraform 0.12 及以上版本即可运行当前仓库基于现代 Terraform Plugin Framework 开发实际使用时建议使用与 Provider 兼容的新版本。示例没有声明provider块运行时需按 docs/development-environment.md 描述的常规方式配置 AWS Provider 的凭据与区域。执行前需确认执行terraform apply的账号具备创建 IAM 角色、附加策略、查询账号信息的权限该账号能够通过AssumeRole扮演新创建的角色示例已通过Principal.AWS 当前 user_id放行详见下文目标区域为 DRS 服务已开放的区域。三、main.tf 详解DRS 的角色体系示例共创建7 个 IAM 角色其中 6 个是 DRS 服务运行所需的服务角色1 个是专门用于执行初始化动作的初始化角色。下面逐一拆解。3.1 复制代理相关角色AWSElasticDisasterRecoveryAgentRolemain.tf由 DRS 服务代为扮演用于在源服务器侧运行复制代理。其信任策略的关键点Principal { Service drs.amazonaws.com } Action [ sts:AssumeRole, sts:SetSourceIdentity ] Condition { StringLike { sts:SourceIdentity s-*, aws:SourceAccount data.aws_caller_identity.current.account_id } }它通过sts:SourceIdentity条件将来源身份限定为s-*源服务器 ID 前缀并通过aws:SourceAccount限制为本账户防止其他账户滥用该信任关系。data aws_caller_identity currentmain.tf动态取得当前账号 ID无需硬编码。AWSElasticDisasterRecoveryFailbackRolemain.tf结构与之相同但SourceIdentity条件为i-*恢复实例 ID 前缀用于 Failback从 AWS 回迁到源环境场景。3.2 EC2 侧服务角色以下四个角色由 EC2 服务代为扮演信任方为ec2.amazonaws.com仅包含sts:AssumeRole动作角色用途源码位置AWSElasticDisasterRecoveryConversionServerRole转换服务器镜像转换main.tfAWSElasticDisasterRecoveryRecoveryInstanceRole恢复实例main.tfAWSElasticDisasterRecoveryReplicationServerRole复制服务器main.tfAWSElasticDisasterRecoveryRecoveryInstanceWithLaunchActionsRole带启动操作Launch Actions的恢复实例main.tf它们的信任策略形如resource aws_iam_role AWSElasticDisasterRecoveryConversionServerRole { name AWSElasticDisasterRecoveryConversionServerRole path /service-role/ assume_role_policy jsonencode({ Version 2012-10-17 Statement [ { Effect Allow Principal { Service ec2.amazonaws.com } Action sts:AssumeRole } ] }) }除AWSElasticDisasterRecoveryInitializerRole使用path /外其余角色统一使用path /service-role/与 AWS 控制台创建的服务角色路径一致。3.3 AWS 托管策略的引用与附加角色本身只定义信任关系实际权限来自 AWS 托管的 DRS 策略。示例通过 data source 按名称引用六条 AWS 托管策略main.tfdata aws_iam_policy AWSElasticDisasterRecoveryAgentPolicy { name AWSElasticDisasterRecoveryAgentPolicy } # ... Failback / ConversionServer / RecoveryInstance / ReplicationServer data aws_iam_policy AmazonSSMManagedInstanceCore { name AmazonSSMManagedInstanceCore }随后用 7 个aws_iam_role_policy_attachment资源完成角色与策略的绑定main.tf。其中AWSElasticDisasterRecoveryRecoveryInstanceWithLaunchActionsRole同时附加两条策略AWSElasticDisasterRecoveryRecoveryInstancePolicyDRS 恢复实例基础权限AmazonSSMManagedInstanceCore允许恢复实例被 Systems Manager 托管SSM 是 DRS 恢复实例常用运维通道。由于 AWS 托管策略由 AWS 维护使用 data source 引用可以保证策略内容始终跟随 AWS 侧更新避免手工复制策略文本造成漂移。四、初始化角色与 InitializePolicy执行初始化动作的主角是AWSElasticDisasterRecoveryInitializerRolemain.tfresource aws_iam_role AWSElasticDisasterRecoveryInitializerRole { name AWSElasticDisasterRecoveryInitializerRole path / assume_role_policy jsonencode({ Version 2012-10-17 Statement [ { Effect Allow Principal { AWS data.aws_caller_identity.current.user_id } Action sts:AssumeRole } ] }) }信任主体被限定为当前执行者的user_idIAM 用户或角色的唯一 ID这意味着只有当初执行terraform apply的身份才能扮演该角色属于最小化的临时提升设计。InitializePolicymain.tf是内联策略为初始化过程提供五组权限其设计意图可以归纳为给 DRS 服务角色附加托管策略允许iam:AttachRolePolicy并通过ForAnyValue:ArnEquals条件把可附加的 PolicyARN 白名单限定为上述五条 DRS 托管策略——即使拥有该角色也不能用它随意给任意角色附加任意策略传递角色给 EC2/DRS允许iam:PassRole目标为arn:aws:iam::*:role/*并通过iam:PassedToService条件限制只能传递给ec2.amazonaws.com与drs.amazonaws.comDRS 与 IAM 核心动作包括drs:InitializeService、drs:CreateReplicationConfigurationTemplate、drs:CreateLaunchConfigurationTemplate、drs:GetReplicationConfiguration、drs:ListTagsForResource、drs:*ReplicationConfigurationTemplate*以及ec2:*等初始化过程中 DRS 会调用 EC2 创建复制/转换/恢复相关基础设施创建 DRS 服务相关角色仅允许在arn:aws:iam::*:role/aws-service-role/drs.amazonaws.com/AWSServiceRoleForElasticDisasterRecovery这一个资源上执行iam:CreateServiceLinkedRole实例配置文件管理允许iam:CreateInstanceProfile、iam:AddRoleToInstanceProfile等用于初始化时把角色与实例配置文件关联起来。最终通过aws_iam_role_policy_attachmentmain.tf把InitializePolicy挂到AWSElasticDisasterRecoveryInitializerRole上。五、初始化三步曲按照 README 的说明整个初始化过程只有三步第 1 步应用 Terraform 配置terraform apply执行后Terraform 会依次创建上述 7 个角色、InitializePolicy策略并完成所有附加关系。此时 DRS 的权限底座已就绪但服务尚未真正初始化。第 2 步扮演初始化角色在 CLI 会话中切换到AWSElasticDisasterRecoveryInitializerRoleaws sts assume-role \ --role-arn arn:aws:iam::ACCOUNT_ID:role/AWSElasticDisasterRecoveryInitializerRole \ --role-session-name drs-initialize将返回的AccessKeyId、SecretAccessKey、SessionToken导出为环境变量AWS_ACCESS_KEY_ID、AWS_SECRET_ACCESS_KEY、AWS_SESSION_TOKEN或使用 AWS CLI 的 profile 机制完成切换。由于角色只信任当前执行者的user_id这一步必须在同一身份下完成。第 3 步执行初始化命令aws drs initialize-service该命令由 DRS 服务执行创建AWSServiceRoleForElasticDisasterRecovery服务相关角色、建立默认的复制配置模板与启动配置模板等。命令执行期间依赖第 1 步创建的全部角色与InitializePolicy中的权限因此顺序不可颠倒。初始化完成后DRS 控制台会显示服务已就绪可以开始添加源服务器安装复制代理并配置复制。六、初始化之后用 Provider 管理 DRS 资源初始化只是 DRS 使用的起点。初始化成功后即可用terraform-provider-aws的 DRS 资源继续编排后续配置。从仓库源码看当前 Provider 在 DRS 服务包internal/service/drs中注册了框架型资源aws_drs_replication_configuration_templateservice_package_gen.go对应 AWS 的 Replication Configuration Template 管理。该资源的字段定义在 replication_configuration_template.go核心参数包括associate_default_security_group必填布尔是否关联默认安全组bandwidth_throttling必填整数复制带宽限制create_public_ip必填布尔复制服务器是否分配公网 IPdata_plane_routing必填枚举数据面路由方式如PRIVATE_IPdefault_large_staging_disk_type必填枚举大容量中转磁盘类型如GP2ebs_encryption/ebs_encryption_key_arnEBS 加密方式与 CMK ARNreplication_server_instance_type复制服务器实例类型replication_servers_security_groups_ids复制服务器安全组列表staging_area_subnet_id与staging_area_tags中转区子网与标签use_dedicated_replication_server是否使用专用复制服务器pit_policy至少 1 个时间点恢复策略块含enabled、interval、retention_duration、rule_id、unitsMINUTE/HOUR/DAY等。仓库自带的验收测试模板 replication_configuration_template_basic.gtpl 给出了一个完整可参考的用法resource aws_drs_replication_configuration_template test { associate_default_security_group false bandwidth_throttling 12 create_public_ip false data_plane_routing PRIVATE_IP default_large_staging_disk_type GP2 ebs_encryption NONE use_dedicated_replication_server false replication_server_instance_type t3.small replication_servers_security_groups_ids [aws_security_group.test.id] staging_area_subnet_id aws_subnet.test[0].id pit_policy { enabled true interval 10 retention_duration 60 units MINUTE rule_id 1 } staging_area_tags { Name var.rName } }从源码实现看该资源的增删改查分别映射到 DRS 的CreateReplicationConfigurationTemplate、DescribeReplicationConfigurationTemplates、UpdateReplicationConfigurationTemplate、DeleteReplicationConfigurationTemplateAPIreplication_configuration_template.go创建/更新/删除的默认超时均为 20 分钟删除时对DependencyViolation错误还会自动重试最长 5 分钟避免资源仍被引用时删除失败replication_configuration_template.go。由于 DRS 复制配置模板的账户配额通常较小测试中以串行方式执行参见 replication_configuration_template_test.go生产环境应谨慎规划模板数量。七、总结examples/drs-initialize是 DRS 账户初始化的一个教科书式示例它体现了三层设计思想职责分离DRS 服务运行角色Agent/Failback/Conversion/Recovery/Replication与临时初始化角色彼此独立初始化完成后可安全收拢初始化角色的使用最小权限InitializePolicy通过ForAnyValue:ArnEquals、iam:PassedToService、指定 SLR 资源 ARN 等条件把高危 IAM 动作限制在 DRS 初始化必需的最小范围内可重复执行全部资源使用 AWS 托管策略 data source 与当前账号身份动态注入不依赖手工复制策略或硬编码账号 ID。整个流程可以概括为terraform apply构建权限底座 → 扮演初始化角色 →aws drs initialize-service完成服务激活 → 之后使用aws_drs_replication_configuration_template等 Provider 资源持续管理 DRS 复制配置。这一模式同样适用于其他需要在账户内预置服务角色体系的 AWS 服务值得作为灾难恢复基础设施自动化的起点。【免费下载链接】terraform-provider-awsThe AWS Provider enables Terraform to manage AWS resources.项目地址: https://gitcode.com/GitHub_Trending/te/terraform-provider-aws创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考