借助 StackSet 依赖关系精细掌控你的 AWS CloudFormation StackSet 部署

本文介绍了 AWS CloudFormation StackSets 的一项新功能:StackSet 依赖关系。该功能允许你通过定义依赖项来精确控制多个自动部署 StackSet 的执行顺序,确保基础架构在应用之前就绪,从而解决企业级部署中的编排挑战,并包含具体的实现场景与操作指南。

介绍

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 实现:

  1. 创建基础架构 StackSet:
    1
    2
    3
    4
    5
    6
    
    aws 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
    
  2. 创建依赖于基础架构的 App1:
    1
    2
    3
    4
    5
    6
    7
    
    aws 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
    
  3. 创建依赖于基础架构的 App2:
    1
    2
    3
    4
    5
    6
    
    aws 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 (需要网络和安全)
  • 实现

  1. 创建网络 StackSet
    1
    2
    3
    4
    5
    6
    
    aws 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
    
  2. 创建安全 StackSet
    1
    2
    3
    4
    5
    6
    
    aws 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
    
  3. 创建依赖于网络和安全的应用程序
    1
    2
    3
    4
    5
    6
    
    aws 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 (这会因为循环而失败):

1
2
3
4
aws cloudformation update-stack-set \
  --stack-set-name App1 \
  --auto-deployment Enabled=true,RetainStacksOnAccountRemoval=true,DependsOn=arn:aws:cloudformation:us-east-1:123456789012:StackSet/App2:uuid \
  --use-previous-template

此操作将导致错误:“Detected cycle(s) between auto-deployment dependencies”。如果依赖关系验证无法完成,你将收到相应的错误消息以帮助排查配置问题。

现在,让我们从 App2 中移除现有的依赖关系:

1
2
3
4
aws cloudformation update-stack-set \
  --stack-set-name App2 \
  --auto-deployment Enabled=true,RetainStacksOnAccountRemoval=true \
  --use-previous-template

现在成功地将 App1 设置为依赖于 App2:

1
2
3
4
aws cloudformation update-stack-set \
  --stack-set-name App1 \
  --auto-deployment Enabled=true,RetainStacksOnAccountRemoval=true,DependsOn=arn:aws:cloudformation:us-east-1:123456789012:StackSet/App2:uuid \
  --use-previous-template

此场景演示了循环检测以及如何解决依赖关系冲突。

开始使用

StackSet 依赖关系功能现已在所有支持 CloudFormation StackSet 的 AWS 区域推出。要开始使用:

  1. 识别依赖关系:确定在你的基础设施中哪些 StackSet 应首先部署。
  2. 配置关系:使用 CloudFormation 控制台或 AWS CLI,通过 StackSet ARN 设置依赖关系。
  3. 测试你的序列:在测试环境中验证你的依赖关系配置。
  4. 监控部署:使用 CloudFormation 事件来跟踪顺序部署。

登录到控制台中的你的账户,访问 AWS CloudFormation StackSet 控制台,或使用配置了 AWS 凭证的 AWS CLI/SDK,立即开始控制 StackSet 依赖关系。

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