亚马逊AWS官方博客

如何在中国区使用 Amazon CloudFormation 堆栈集批量管理多账号 Amazon Backup备份计划

摘要:本篇文章主要介绍了如何结合Amazon CloudFormation的堆栈集功能实现Amazon Backup计划的统一部署及后续管理。用户可以创建一份通用的备份计划模板,然后通过Amazon CloudFormation控制台为特定账号列表或整个组织、特定OU批量部署相同的备份计划。如后续备份计划有调整,也可通过在堆栈集中更换模板的方式更新所有账户下的备份计划。


一、引言

Amazon Backup 是一项完全托管的服务,可以轻松地跨 Amazon 服务、云端和本地集中并自动执行数据保护。使用此服务,您可以一站式配置备份策略并监控 Amazon 资源活动。但目前Amazon Backup在中国区暂未上线跨账户管理功能,也未与Amazon Organizations 集成以提供备份策略功能,因此,当用户需要为大量Amazon账户添加统一的备份计划时,必须每个账户逐一创建,这不仅存在大量重复操作,且难于统一管理。

本篇文章主要介绍了如何结合Amazon CloudFormation的堆栈集功能实现Amazon Backup计划的统一部署及后续管理。用户可以创建一份通用的备份计划模板,然后通过Amazon CloudFormation控制台为特定账号列表、整个组织或特定组织单位(OU)批量部署相同的备份计划。如后续备份计划有调整,也可通过在堆栈集中更换模板的方式更新所有账户下的备份计划。

二、方案架构设计

[图1]

本方案中使用的模板仅涉及了Amazon Backup备份计划、备份保管库的创建。备份资源选择中指定的Amazon Identity and Access Management(IAM)角色使用了Amazon Backup默认角色 “AWSBackupDefaultServiceRole”; 备份保管库未指定Amazon Key Management Service(KMS)密钥,使用Amazon Backup服务在每个区域创建的托管密钥加密。用户可以根据业务需要决定是否单独创建Amazon IAM角色或Amazon KMS密钥。

三、方案部署

示例模板:

AWSTemplateFormatVersion: "2010-09-09"
Description: "Example Backup Template for EC2/EBS"

Parameters:
  BackupVaultName:
    Type: String
    Default: "centralized-backup-vault"
    Description: "Backup Vault Name"
  BackupPlanName:
    Type: String
    Default: "DailyEC2EBSBackupPlan"
    Description: "Backup Plan Name"
  BackupSelectionName:
    Type: String
    Default: "EC2EBSSelection"
    Description: "Resources Selection Name"

Resources:
  BackupVault:
    Type: AWS::Backup::BackupVault
    Properties:
      BackupVaultName: !Ref BackupVaultName
  BackupPlan:
    Type: AWS::Backup::BackupPlan
    Properties:
      BackupPlan:
        BackupPlanName: !Ref BackupPlanName
        BackupPlanRule:
          - RuleName: "DailyBackupRule"
            TargetBackupVault: !Ref BackupVault
            ScheduleExpression: "cron(0 2 * * ? *)"   # 02:00 UTC
            StartWindowMinutes: 60
            CompletionWindowMinutes: 120
            Lifecycle:
              MoveToColdStorageAfterDays: 30
              DeleteAfterDays: 120
            EnableContinuousBackup: false
  BackupSelection:
    Type: AWS::Backup::BackupSelection
    Properties:
      BackupPlanId: !Ref BackupPlan
      BackupSelection:
        SelectionName: !Ref BackupSelectionName
        IamRoleArn: !Sub 'arn:aws-cn:iam::${AWS::AccountId}:role/service-role/AWSBackupDefaultServiceRole'
        Resources:
          - "arn:aws-cn:ec2:*:*:instance/*"
          - "arn:aws-cn:ec2:*:*:volume/*"
        ListOfTags:
          - ConditionType: STRINGEQUALS
            ConditionKey: "backupplan"
            ConditionValue: "true"

四、服务管理权限

前提条件:Amazon Organizations服务启用完整功能,并确保在该服务中启用Amazon CloudFormation Stacksets的可信访问。

[图2]

注:使用服务管理权限时,Amazon CloudFormation会在每个目标(成员)账号下创建必要的服务关联角色和名为“stacksets-exec-*”的服务角色。

1. 登录管理员账号,并打开Amazon CloudFormation控制台,在StackSets页面点击“创建堆栈集”;

2. 选择“服务管理权限”,选择上传示例模板,或使用Amazon S3 URL提供模板。

[图3]

3. 填写堆栈集名称,指定示例模板需要的参数。在“配置堆栈集选项”页面根据需求自行添加标签,托管执行同样根据需求选择即可。

[图4]

4. 部署目标为“部署到组织”时,将会为组织内所有账号部署堆栈,部署目标为“部署到组织单位(OU)”时,则需要提供OU ID,也可以同时提供账户列表,并选择“账户筛选条件类型”(交集、差异、联合);自动部署选项可根据需求设置,

[图5]

[图6]

5. 根据需要选择部署的区域以及部署选项。

[图7]

6. 审核确认所填写的值是否均为预期信息。

[图8]

[图9]

7. 确认一切无误后,点击“提交”,创建堆栈,并等待堆栈执行即可。

五、自行管理权限

适用场景:当Amazon账号为独立账号、Amazon Organizations未启用完整功能或未启用Amazon CloudFormation StackSets集成时可使用此方式。

1. 创建Amazon IAM管理员角色,示例中命名:TestForCloudFormation,可根据公司要求命名。

信任策略:

{
	"Version": "2012-10-17",
	"Statement": [
		{
			"Sid": "",
			"Effect": "Allow",
			"Principal": {
				"Service": "cloudformation.amazonaws.com"
			},
			"Action": "sts:AssumeRole"
		}
	]
}

权限策略为:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": "sts:AssumeRole",
            "Resource": "arn:aws-cn:iam::*:role/AWSCloudFormationStackSetExecutionRole"
        }
    ]
}

2. 在需要部署模板的每个账号内创建Amazon IAM执行角色。示例中命名为 AWSCloudFormationStackSetExecutionRole,可根据公司要求命名。在该名称确定后,需同步修改步骤1中权限策略的Resource值。

信任策略(该策略中的Principal值需要与步骤1中管理员角色ARN一致):

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws-cn:iam::012345678912:role/TestForCloudFormation"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}

权限策略(示例模板成功运行所需的最小权限,若模板进行了调整,应按照模板资源进行调整):

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "BackupPermission",
            "Effect": "Allow",
            "Action": [
                "backup:CreateBackupSelection",
                "backup:CreateBackupPlan",
                "backup:CreateBackupVault",
                "backup:GetBackupPlan",
                "backup:GetBackupSelection",
                "backup:DescribeBackupVault",
                "backup:DeleteBackupSelection",
                "backup:DeleteBackupPlan",
                "backup:DeleteBackupVault"
            ],
            "Resource": [
                "arn:aws-cn:backup:*:*:backup-vault:centralized-backup-*",
                "arn:aws-cn:backup:*:*:backup-plan:*"
            ]
        },
        {
            "Sid": "CloudFormationPermissionForStackSet",
            "Effect": "Allow",
            "Action": [
                "cloudformation:CreateStack",
                "cloudformation:UpdateStack",
                "cloudformation:DeleteStack"
            ],
            "Resource": [
                "arn:aws-cn:cloudformation:*:*:stack/StackSet-*/*"
            ]
        },
        {
            "Sid": "AllowAssociateKMSToVault",
            "Effect": "Allow",
            "Action": "backup-storage:MountCapsule",
            "Resource": "*"
        },
        {
            "Sid": "PassRoleToBackup",
            "Effect": "Allow",
            "Action": "iam:PassRole",
			"Resource":"arn:aws-cn:iam::*:role/service-role/AWSBackupDefaultServiceRole"
        },
        {
            "Sid": "KMSPermissonForDefaultKey",
            "Effect": "Allow",
            "Action": [
                "kms:DescribeKey",
                "kms:GenerateDataKey",
                "kms:CreateGrant",
                "kms:RetireGrant"
            ],
            "Resource": [
                "arn:aws-cn:kms:*:*:alias/aws/backup"
            ]
        },
        {
            "Sid": "KMSPermissonForDescribe",
            "Effect": "Allow",
            "Action": [
                "kms:DescribeKey"
            ],
            "Resource": [
                "*"
            ]
        },
        {
            "Sid": "CloudFormationDescribePermission",
            "Effect": "Allow",
            "Action": "cloudformation:DescribeStacks",
            "Resource": "*"
        }
    ]
}

3. 登录管理员账号,并打开Amazon CloudFormation控制台,在StackSets页面点击“创建堆栈集”;

4. IAM管理员角色ARN,选择步骤1中创建的Amazon IAM角色,“IAM执行角色名称”填写步骤2中创建的Amazon IAM角色名称,选择上传示例模板,或使用Amazon S3 URL提供模板。

[图10]

5. 填写堆栈集名称,指定示例模板需要的参数,如果BackupVaultName有修改,需要对应调整步骤2中的权限策略。

[图11]

6. 在“配置堆栈集选项”页面根据需求自行添加标签,托管执行同样根据需求选择即可。

7. 若选择“在组织部门中部署堆栈”,则需要特定的组织部门编号OU;若选择“在账户中部署堆栈”,则需提供所有账号ID,以后者为例。根据需要选择部署的区域以及部署选项。

[图12]

8.审核确认所填写的值是否均为预期信息。

[图13]

[图14]

9. 确认一切无误后,点击“提交”,创建堆栈,并等待堆栈执行即可。

六、使用与维护

日常增加账号:

1. 如果使用了“服务管理权限”,并且自动部署选项已激活,组织/特定OU内增加新账号后会自动部署,无需额外操作。

2. 如果使用了“自行管理权限”,新建账号后,在堆栈集中选择操作 “向堆栈集添加堆栈”,然后选择“在账户中部署堆栈”,添加新账号部署即可。

规则变更:修改模板 → 堆栈集中选择操作“编辑堆栈集详细信息” → 选择“替换当前模板” → 全账号滚动更新。

七、小结

面对 Amazon Backup 目前在中国区暂未完全支持跨账号管理的现状,结合 Amazon CloudFormation 堆栈集无疑是一种高效且优雅的替代方案。本方案不仅为已深度使用 Amazon Organizations 的用户提供了便捷的“服务管理权限”自动化部署路径,同时也兼顾了独立账号或未启用组织集成环境下的“自行管理权限”需求。

借助基础设施即代码(IaC)的理念,用户只需维护一份核心的备份计划模板,即可大幅度地减少多账号备份管理的运维时间成本,并有效避免人工重复配置可能带来的疏漏。无论是前期的批量创建,还是后期的规则更新与新账号的自动接入,该方案都真正实现了组织内及大量 Amazon 账号下备份计划的集中定义、一键下发和统一管控,进而帮助企业更轻松、合规地达成整体的备份治理目标。

➡️ 下一步行动:

相关产品:

相关文章:

*前述特定亚马逊云科技生成式人工智能相关的服务目前在亚马逊云科技海外区域可用。亚马逊云科技中国区域相关云服务由西云数据和光环新网运营,具体信息以中国区域官网为准。

本篇作者

张新宇

西云数据技术支持工程师。亚马逊云科技S3、IAM等核心产品专家。他深耕云端存储架构、权限与访问控制等技术领域,具备丰富的复杂故障排查与企业级架构优化经验。在日常服务客户的过程中,他始终秉持极高的技术标准与严苛的自我要求,能够精准洞悉并满足客户在多样化业务场景下的诉求,致力于为客户提供安全、稳定、高效的云端解决方案与最佳实践指导。


AWS 架构师中心:云端创新的引领者

探索 AWS 架构师中心,获取经实战验证的最佳实践与架构指南,助您高效构建安全、可靠的云上应用