CloudFormationでテンプレートを分割する場合、ネストとこのクロススタックという方法があります。クロススタックは他のスタックで出力した情報を別のスタックで取得させることができます。
例えば、VPCIDをスタックAで出力させ、スタックBでサブネットを作るときにスタックAで出力させたVPCIDを取得できる、といったような感じです。
CloudFormation上、一番上のレイヤーを分割できるので、設計段階でまず最初に考えるべきはネストよりもクロススタックで良いかと思います
概要図
ネストとかスタックとかなんやねんて...なる人もいると思うので例を書いてみました。図内に記載されている通り、大きい枠がスタックで、小さい枠がネストです。
クロススタックしてみる
テンプレート作成
実際にスタックするコードを作成します。コードは別記事から拝借しました。Outputs/Exportでエクスポート、{Fn::ImportValue: XXX} でインポートという形です。
Resources:
MainVpc:
Type: AWS::EC2::VPC
Properties:
CidrBlock: 172.16.0.0/16
Outputs:
MainVpc:
Value: !Ref MainVpc
Export:
Name: main-vpc-id
Resources:
MainSubnet:
Type: AWS::EC2::Subnet
Properties:
CidrBlock: 172.16.1.0/24
VpcId: {Fn::ImportValue: main-vpc-id}
スタック作成
CLIでスタックを作成します。
aws cloudformation deploy --stack-name vpc-stack --template-file vpc.yaml
同様に次のスタックを作成し、サブネットが該当VPCで作成できていればOKです。
aws cloudformation deploy --stack-name subnet-stack --template-file subnet.yaml
補足(必要性に疑問がわいたとき)
クロススタックやネストうんぬんは、 そもそも必要なのか(テンプレート1つでやれ派) という疑問わきがちです。そんな時のために、参考になりそうな記事を記載しておきます。何事もやってみるは大事ですが、無駄にやるとまさに無駄にしかならないので、この辺りの見極めはなかなか難しいところですね。わりと永遠のテーマな気がしてます