CloudFormationでクロススタック参照
まずCloudFormationを勉強したい場合は、「CloudFormation Getting Started with YAML」を読みましょう。とても参考になりました。
後半ではWeb3階層アーキテクチャのテンプレート分割例が記載されています。
テンプレート自体は記載されていなかったので、これを参考にWeb3階層アーキテクチャのテンプレートをクロススタック参照で以下のテンプレートに分割して作成してみました。
- vpc.template
- bastion.template
- app.template
- db.template
- lb.template
- sg.template
- route53.template
ここではvpc.templateでExportして、bastion.templateでImportするという例でメモしておきたいと思います。
Exportの仕方
vpc.templateでは、VPCやSubnetなど後続のテンプレートで呼び出したい値をOutputsでExportしておきます。
Export Nameは固定値でも良いのですが、同じリージョンで複数作成することを考慮すると変数などを付けてバッティングを避けたほうが良さそうです。
ここではStackNameという事前に定義されている擬似パラメーターを使用することにしました。擬似パラメーター参照 - AWS CloudFormation
!Subという組み込み関数を使用することで変数を展開しています。Fn::Sub - AWS CloudFormation
Outputs: VPC: Value: Ref: VPC Export: Name: !Sub "${AWS::StackName}-VPC" # 展開するとvpc-stack0-VPC
CloudFormation実行時のスタック名をvpc-stack0として実行したので、vpc-stack0-VPCという名前がExportされました。
Importの仕方
次にbastion.templateをbastion-stack0というスタック名で実行します。
さきほどのVPCの値をImportするときに、vpc-stack0という名前を教えなくてはなりません。
ここではParametersを使って、実行時に値を直接入力することにしてます。VPCStackNameというパラメータを定義し、デフォルトではvpc-stack0が返るようにしています。
Parameters - AWS CloudFormation
あとは値を呼び出したいところでImportします。Exportした値と同じ値を指定すれば呼び出し可能です。
Parameters: VPCStackName: Type: String Default: vpc-stack0 Resources: BastionSG: Type: "AWS::EC2::SecurityGroup" Properties: VpcId: Fn::ImportValue: !Sub ${VPCStackName}-VPC # 展開するとvpc-stack0-VPC
最後に
整理したら全てのテンプレートを公開したいですね。