嵌套 Stack
模块化、NestedStack 引用。
25 分钟
嵌套 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 段抽成 子模板