大家好,我是程序员柏风,AI 最全的 Vibecoding 学习地图 http://coderoadmap.cn 作者。
嵌套 Stack
大型模板可拆成 Nested Stack:父 Stack 通过 AWS::CloudFormation::Stack 引用子模板(S3 URL 或同账户模板)。模块化方式类似 Terraform Module,但子 Stack 在控制台显示为 独立 Stack 树。
学习目标
- 用 Nested Stack 拆分 network / database 层
- 理解
TemplateURL与参数传递 - 对照 tf-modules
父 Stack 引用子 Stack
Resources:
NetworkStack:
Type: AWS::CloudFormation::Stack
Properties:
TemplateURL: https://s3.amazonaws.com/my-bucket/cfn/network.yaml
Parameters:
VpcCidr: 10.0.0.0/16
Environment: !Ref Environment
DatabaseStack:
Type: AWS::CloudFormation::Stack
DependsOn: NetworkStack
Properties:
TemplateURL: https://s3.amazonaws.com/my-bucket/cfn/database.yaml
Parameters:
VpcId: !GetAtt NetworkStack.Outputs.VpcId
PrivateSubnetIds: !GetAtt NetworkStack.Outputs.PrivateSubnetIds
DbPassword: !Ref DbPassword
子模板 Outputs 暴露 VpcId 等,父 Stack 用 !GetAtt ChildStack.Outputs.Xxx 读取——类似 module.network.vpc_id。
子模板 network.yaml 片段
Outputs:
VpcId:
Value: !Ref LabVpc
Export:
Name: !Sub '${AWS::StackName}-VpcId'
PrivateSubnetIds:
Value: !Join [',', [!Ref PrivateSubnet1, !Ref PrivateSubnet2]]
| 模式 | CloudFormation | Terraform |
|---|---|---|
| 拆分 | Nested Stack + S3 模板 | module "network" |
| 传参 | Parameters 映射 | module 的 input variables |
| 输出 | Outputs + !GetAtt | output + module.xxx |
StackSets(了解)
StackSets 在 Organizations 多账号/多 Region 批量 部署同一模板——企业合规基线场景。CodeRoadMap 单账号实验 Nested Stack 足够;多云仍选 terraform-essentials。
练习
- 将 cf-resources 中的 VPC 段抽成
network.yaml子模板 - 父 Stack 只保留 Parameters 与两个 Nested Stack 资源
- 对比 tf-practice 的
modules/network目录结构
小结
Nested Stack = 可复用的子模板 + 父 Stack 编排。 下一课 Drift 检测。