使用AWS CloudFormation StackSets和AWS CDK简化多账户基础设施管理

本文详细介绍了如何利用AWS CloudFormation StackSets和AWS CDK在多账户和多区域环境中实现基础设施的集中管理,包括构建CI/CD流水线实现自动化部署,确保安全性和合规性的一致执行。

使用AWS CloudFormation StackSets和AWS CDK简化多账户基础设施管理

引言

在AWS上大规模运营的组织通常需要跨多个账户和区域管理资源。无论是部署安全控制、合规配置还是共享服务,保持一致性都颇具挑战性。

AWS CloudFormation StackSets自推出以来一直帮助组织跨多个账户和区域部署资源。虽然该服务本身功能强大,但将其与基础设施即代码工具结合使用并实施自动化部署可以显著增强其能力。

在本文中,我们将展示如何使用AWS CDK大规模利用AWS CloudFormation StackSets,并使用AWS CodePipeline实施稳健的CI/CD流水线以实现自动化部署。

StackSets核心概念

AWS CloudFormation StackSets允许您通过单个操作跨多个AWS账户和区域创建、更新或删除CloudFormation堆栈。这本质上是一种跨AWS组织大规模管理基础设施的方式。使用管理员账户,您可以定义和管理CloudFormation模板,并将该模板作为在指定AWS区域中向选定目标账户配置堆栈的基础:

图1. StackSets概述。

  • 管理员账户:创建和管理StackSets的AWS账户
  • 目标账户:部署堆栈实例的AWS账户
  • 堆栈实例:从StackSet模板创建的单个堆栈,部署到特定的账户-区域组合

您可以使用StackSets执行以下操作:对堆栈实例执行创建、更新和删除操作。这些操作可以并发或顺序应用。

顺序部署

  • 逐个账户部署
  • 账户内逐个区域部署
  • 可配置的故障阈值

并行部署

  • 并发账户部署
  • 最大并发账户设置
  • 区域优先级配置

混合部署

  • 结合顺序和并行
  • 基于账户组的部署
  • 区域部署策略

StackSets的强大功能

使用StackSets使我们能够在几个重要方面扩展AWS CloudFormation的功能:

治理

  • 集中管理:提供单一控制点
  • 包含一致的部署模式
  • 跨AWS账户和区域的自动化堆栈实例管理

通过漂移检测功能,您可以识别StackSet中的任何堆栈实例是否根据其预期配置存在配置差异。您可以检测在CloudFormation之外所做的更改,以及不通过StackSet直接通过CloudFormation对实例堆栈所做的更改。

灵活部署 您还具有灵活的部署选项和受控的推出。例如,通过并发部署,您可以在每个区域内同时部署到多个账户,同时控制部署顺序。它还包括故障容错和自动重试失败操作。

运营效率

  • 减少管理多账户和多区域环境的手动工作
  • 最大限度地减少部署中的人为错误

成本管理 通过集中管理,简化资源跟踪和组织,使您能够:

  • 统一可见性:从单个StackSet控制台查看所有相关堆栈(及其部署状态)
  • 一致标记:对所有堆栈实例应用标准化标记,用于成本分配和资源分组
  • 漂移检测:同时对所有堆栈实例运行漂移检测
  • 操作跟踪:从一个位置跟踪跨账户/区域的所有操作(创建、更新和删除)

内置安全 您可以建立最大并发操作限制、故障容错阈值和自动重试机制。您还具有通过更新操作的恢复能力。所有这些功能构成了防止广泛故障的内置安全机制。

假设您有100个目标账户,通过最大并发限制,您可以例如仅将更改部署到10个账户。此外,通过故障阈值,您可以设置在自动停止过程之前允许多少次故障(例如,如果超过5个账户失败则停止)。这样,您可以逐步部署和测试模板,使用小群体建立故障阈值,而不是影响堆栈防止大规模故障。

当操作失败时,AWS CloudFormation会在堆栈实例中执行回滚,部署先前的工作模板。您仍然需要更正模板并再次将其应用到所有堆栈实例。使用StackSets,您可以修复模板中的问题,并再次在所有堆栈上运行更新,包括前面提到的并发限制和故障阈值,以安全地测试修复。

安全与合规管理 使用StackSets的这种以安全为中心的方法有助于组织在其AWS环境中保持强大的安全态势,同时减少大规模管理安全的运营开销。

您可以使用StackSets跨账户部署标准化安全策略,自动执行安全基线并在整个组织范围内实施安全防护栏。例如,您可以在所有账户中部署检测控制资源及其配置,如Amazon GuardDuty或Amazon Macie。您还可以部署预防性控制,如SCP、AWS Firewall Manager或AWS Shield Advanced。例如,您可以通过StackSets在每个目标账户中部署以下CloudFormation模板以阻止区域中的某些操作:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
AWSTemplateFormatVersion: '2010-09-09'
Description: 'Service Control Policy to block access to specific AWS regions'

Parameters:
  PolicyName:
    Type: String
    Default: 'RegionDenyPolicy'
    Description: 'Name for the Service Control Policy'
    
  PolicyDescription:
    Type: String
    Default: 'Blocks access to Singapore region (ap-southeast-1) while allowing global services'
    Description: 'Description for the Service Control Policy'
    
  BlockedRegion:
    Type: String
    Default: 'ap-southeast-1'
    Description: 'AWS Region to block access to'
    AllowedValues:
      - 'ap-southeast-1'
      - 'ap-southeast-2'
      - 'eu-west-3'
      - 'us-west-1'
      - 'ca-central-1'
    
  TargetOUId:
    Type: String
    Description: 'Organizational Unit ID to attach the policy to (e.g., ou-root-xxxxxxxxxx)'

Resources:
  RegionDenySCP:
    Type: AWS::Organizations::Policy
    Properties:
      Name: !Ref PolicyName
      Description: !Ref PolicyDescription
      Type: SERVICE_CONTROL_POLICY
      Content:
        Version: '2012-10-17'
        Statement:
          - Sid: DenyAccessToSpecificRegion
            Effect: Deny
            NotAction:
              - 'route53:*'
              - 'cloudfront:*'
              - 'sts:*'
            Resource: '*'
            Condition:
              StringEquals:
                'aws:RequestedRegion':
                  - !Ref BlockedRegion
      TargetIds:
        - !Ref TargetOUId
      Tags:
        - Key: Purpose
          Value: RegionCompliance
        - Key: ManagedBy
          Value: CloudFormation

Outputs:
  PolicyId:
    Description: 'ID of the created Service Control Policy'
    Value: !Ref RegionDenySCP
    Export:
      Name: !Sub '${AWS::StackName}-PolicyId'
      
  PolicyArn:
    Description: 'ARN of the created Service Control Policy'
    Value: !GetAtt RegionDenySCP.Arn
    Export:
      Name: !Sub '${AWS::StackName}-PolicyArn'

其他功能包括一致地部署合规相关资源,维护安全配置的审计跟踪,并确保所有账户都满足监管要求。例如,您可以在StackSet管理的所有实例堆栈中启用CloudTrail并部署AWS Config规则。

对于安全和合规事件,您可以使用StackSets部署自动化响应工作流,配置事件通知并在您的账户和区域中实施修复操作。

将现有堆栈导入StackSets

堆栈导入操作可以将现有堆栈导入新的或现有的StackSets,以便您可以在一个操作中将现有堆栈迁移到StackSet。

解决方案概述

该解决方案包括一个AWS CodePipeline堆栈,该堆栈创建一个CI/CD流水线来部署我们的StackSet。此流水线部署一个应用程序堆栈,其中包含带有AWS CloudWatch中监控仪表板的AWS CloudFormation StackSet。

图2. 解决方案概述

在StackSet部署后,您将在目标账户中看到以下Amazon CloudWatch仪表板示例:

图3. 仪表板示例

该解决方案包括在AWS CDK应用程序中定义的2个AWS CloudFormation堆栈和一个用于StackSet的模板,该模板将部署在目标账户和区域中。此堆栈包含监控仪表板,它将作为单个单元部署在每个目标账户的目标区域中。

使用带有IaC的AWS CodePipeline的理念是,开发团队可以定义和共享"流水线即代码"模式来部署其应用程序,从而轻松添加阶段。这样,只要更改源代码,就可以运行安全性和代码质量测试。

图4. 流水线概述

最佳实践是确保左移:将这些检查添加到SDLC的早期阶段。您可以通过使用githooks或IDE插件来补充CI/CD流水线来实现这一点。例如,使用Amazon Q Developer IDE扩展,您可以使用审查功能在本地分析代码的安全性。

演练

如果您想亲自尝试此解决方案,请访问相应GitHub存储库中的演练:https://github.com/aws-cloudformation/aws-cloudformation-templates/tree/main/CloudFormation/StackSets-CDK

结论

在本文中,我们展示了如何使用AWS CDK部署AWS CloudFormation StackSets,以减少运营开销并确保跨多个区域和账户的一致性、合规性和安全性。我们还学习了如何创建CI/CD流水线以为我们的基础设施即代码保证稳健的DevSecOps周期。

现在我们已经一起探索了主要概念,您可以从演练部分克隆示例存储库,按照设置说明进行操作,并自定义实现以增强跨账户和区域的AWS资源管理。无论您是管理单个账户还是多个组织,这些实践都可以适应您的特定需求。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计