介绍
AWS CloudFormation StackSets 使你能够通过单次操作在多个 AWS 账户和区域部署 CloudFormation 堆栈,通过与 AWS Organizations 集成提供大规模的集中式基础设施管理。在企业环境中,多个 StackSet 通常需要按特定顺序部署。例如,网络基础设施必须在应用能够成功部署之前准备就绪。
图 1:包含管理账户和目标账户的多区域 AWS CloudFormation StackSet 架构示例
此前,当多个 StackSet 启用自动部署时,它们独立运行而无需协调。当依赖的基础设施未就绪时,这可能导致部署失败,迫使客户实施复杂的变通方案或完全禁用自动部署。
我们宣布推出 StackSet 依赖关系,这是一项新功能,可让你精细控制自动部署 StackSet 的部署顺序,优雅地解决这些编排挑战。
功能概述
这项新功能引入了使用 AutoDeployment 配置中的新 DependsOn 参数来定义 StackSet 之间依赖关系的能力。当账户在组织单元之间移动或添加到你的组织时,StackSet 会根据你定义的序列自动编排部署,确保基础架构在依赖的应用程序之前部署。
关键能力包括:
- 依赖关系管理:每个 StackSet 最多可定义 10 个依赖项,每个账户最多 100 个依赖项。例如,如果你有 5 个 StackSet,每个有 5 个依赖项,则你有 25 个依赖项计入 100 个依赖项限制。你可以通过服务配额控制台请求提高限制。
- 循环检测:内置验证功能通过错误消息防止循环依赖。
- 跨区域支持:依赖关系可在不同区域间工作。
- 自动清理:当 StackSet 被删除或组织被停用时,依赖关系会被移除。
工作原理
让我们通过一个实际示例来了解此功能。考虑以下基础设施设置:一个创建 IAM 角色和网络组件的中央基础架构 StackSet,以及多个依赖这些基础资源的应用程序 StackSet。
借助 StackSet 依赖关系,你可以确保基础架构 StackSet 在任何应用程序 StackSet 开始之前完成部署,从而防止因缺少依赖项而导致的部署失败。
实施场景
让我们探讨三个常见场景,其中 StackSet 依赖关系能提供价值:
场景 1:基础先行部署
- 使用案例:你有一个创建 IAM 角色和网络组件的基础架构 StackSet,以及多个依赖这些资源的应用程序 StackSet。
- 设置:
- 基础架构 StackSet ARNs (创建 IAM 角色、VPC、安全组)
- App1 StackSet (需要 IAM 角色的 Web 应用程序)
- App2 StackSet (需要网络组件的 API 服务)
- 使用此功能无需额外权限。
控制台体验 CloudFormation 控制台提供了一个直观的界面来管理 StackSet 依赖关系。使用你的凭证(IAM 用户或管理用户)登录 AWS 控制台。导航到 CloudFormation 服务并创建新的 StackSet 或添加 YAML/JSON 模板,你将在其中配置依赖关系。在创建 StackSet 向导的第 4 步,你将在自动部署选项部分找到一个新的 “StackSet 依赖关系” 表单字段。你可以使用属性编辑器添加依赖项的 StackSet ARN。控制台包含 ARN 格式的输入验证和有关依赖关系行为的帮助性提示。
图 2:CloudFormation StackSet 控制台 – 自动部署选项视图
AWS CLI 实现:
- 创建基础架构 StackSet:
1 2 3 4 5 6aws cloudformation create-stack-set \ --stack-set-name Infrastructure \ --permission-model SERVICE_MANAGED \ --auto-deployment Enabled=true,RetainStacksOnAccountRemoval=true \ --template-body file://infrastructure-template.yaml \ --region us-east-1 - 创建依赖于基础架构的 App1:
1 2 3 4 5 6 7aws cloudformation create-stack-set \ --stack-set-name App1 \ --permission-model SERVICE_MANAGED \ --auto-deployment Enabled=true,RetainStacksOnAccountRemoval=true,\ DependsOn=arn:aws:cloudformation:us-east-1:123456789012:StackSet/Infrastructure:uuid \ --template-body file://app1-template.yaml \ --region us-east-1 - 创建依赖于基础架构的 App2:
1 2 3 4 5 6aws cloudformation create-stack-set \ --stack-set-name App2 \ --permission-model SERVICE_MANAGED \ --auto-deployment Enabled=true,RetainStacksOnAccountRemoval=true,DependsOn=arn:aws:cloudformation:us-east-1:123456789012:StackSet/Infrastructure:uuid \ --template-body file://app2-template.yaml \ --region us-west-2
现在,当账户添加到你的组织时,基础架构首先部署,然后 App1 和 App2 在基础架构完成后并行部署。
场景 2:多依赖项应用程序
-
使用案例:你的应用程序在部署前需要网络和安全组件都准备就绪。
-
设置:
- 网络 StackSet (VPC、子网、路由表)
- 安全 StackSet (安全组、NACL、IAM 策略)
- 应用程序 StackSet (需要网络和安全)
-
实现:
- 创建网络 StackSet
1 2 3 4 5 6aws cloudformation create-stack-set \ --stack-set-name Networking \ --permission-model SERVICE_MANAGED \ --auto-deployment Enabled=true,RetainStacksOnAccountRemoval=true \ --template-body file://networking-template.yaml \ --region us-east-1 - 创建安全 StackSet
1 2 3 4 5 6aws cloudformation create-stack-set \ --stack-set-name Security \ --permission-model SERVICE_MANAGED \ --auto-deployment Enabled=true,RetainStacksOnAccountRemoval=true \ --template-body file://security-template.yaml \ --region us-east-1 - 创建依赖于网络和安全的应用程序
1 2 3 4 5 6aws cloudformation create-stack-set \ --stack-set-name Application \ --permission-model SERVICE_MANAGED \ --auto-deployment Enabled=true,RetainStacksOnAccountRemoval=true,DependsOn=arn:aws:cloudformation:us-east-1:123456789012:StackSet/Networking:uuid,arn:aws:cloudformation:us-east-1:123456789012:Stackset/Security:uuid \ --template-body file://application-template.yaml \ --region us-east-1
因此,网络和安全 StackSet 并行部署,应用程序等待两者都完成后才开始。
场景 3:解决依赖关系冲突
-
使用案例:你需要更新现有的 StackSet 以修复不正确的依赖关系。
-
问题:你有 App1 和 App2 StackSet。存在一个现有依赖关系,即 App2 依赖于 App1,但你意识到应该是 App1 依赖于 App2,而不是反过来。
-
实现: 首先,尝试将 App1 设置为依赖于 App2 (这会因为循环而失败):
|
|
此操作将导致错误:“Detected cycle(s) between auto-deployment dependencies”。如果依赖关系验证无法完成,你将收到相应的错误消息以帮助排查配置问题。
现在,让我们从 App2 中移除现有的依赖关系:
|
|
现在成功地将 App1 设置为依赖于 App2:
|
|
此场景演示了循环检测以及如何解决依赖关系冲突。
开始使用
StackSet 依赖关系功能现已在所有支持 CloudFormation StackSet 的 AWS 区域推出。要开始使用:
- 识别依赖关系:确定在你的基础设施中哪些 StackSet 应首先部署。
- 配置关系:使用 CloudFormation 控制台或 AWS CLI,通过 StackSet ARN 设置依赖关系。
- 测试你的序列:在测试环境中验证你的依赖关系配置。
- 监控部署:使用 CloudFormation 事件来跟踪顺序部署。
登录到控制台中的你的账户,访问 AWS CloudFormation StackSet 控制台,或使用配置了 AWS 凭证的 AWS CLI/SDK,立即开始控制 StackSet 依赖关系。