やーまんぶろぐ

気が向いた時にだけ書くブログ

CloudFormationでクロススタック参照

まずCloudFormationを勉強したい場合は、「CloudFormation Getting Started with YAML」を読みましょう。とても参考になりました。

www.slideshare.net

後半では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

デフォルト値を使用した場合は展開するとvpc-stack0-VPCをImportすることになります。

最後に

整理したら全てのテンプレートを公開したいですね。