maya's blog

About programming, aws and ubuntu

AWS CloudFormation Best Practice - Cross Stack References

docs.aws.amazon.com

What's Cross Stack References

CloudFormation(以下Cfn)ではクロススタック参照という概念がある。

これはVPC IDやSecurity Group ID等のスタックのリソースIDを既存スタックから取得できる手法のこと。

複数スタックでリソースを構成したい場合にクロススタック参照を使うことでParamteresで別スタックで生成されたリソース名を指定する必要がなくなる。

Practice

今回はクロススタック参照の使い方を確認するために、簡易にVPC, Subnetの2テンプレートを用いる。

VPC stack and Subnet stack dependencies

こんな感じのスタック間依存関係になる。

VPC and Subnet templates

クロススタック参照を実現するには、

  1. 参照されるテンプレート: Outputs.Export.Nameで参照名を指定
  2. 参照するテンプレート: ParametersでExportされた参照名を渡し、Fn::ImportValueで指定

とする。

vpc.yml

AWSTemplateFormatVersion: '2010-09-09'
Resources:
  VPC:
    Type: AWS::EC2::VPC
    Properties:
      EnableDnsSupport: 'true'
      EnableDnsHostnames: 'true'
      CidrBlock: 10.0.0.0/16
Outputs:
  VPCId:
    Description: VPC ID
    Value: !Ref 'VPC'
    Export:
      Name: !Sub '${AWS::StackName}-VPCID'

subnet.yml

AWSTemplateFormatVersion: '2010-09-09'
Parameters:
  VPCStackName:
    Type: String
    Default: VPCCrossStackName

Resources:
  PublicSubnet:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !ImportValue
        Fn::Sub: ${VPCStackName}-VPCID
      CidrBlock: 10.0.0.0/24

クロススタック参照をするには、参照する側のテンプレートでCfnの組み込み関数Fn::ImportValueを用いる。

上記のテンプレートではそれに加えてFn::Subを用いて参照する・されるスタック名をFn::Sub: ${VPCStackName}-VPCIDとしている。

How to create stack

AWS CLIで生成する。

$ aws cloudformation deploy --stack-name cross-stack-vpc --template-file ./network.yml

Waiting for changeset to be created..
Waiting for stack create/update to complete
Successfully created/updated stack - cross-stack-vpc
$ aws cloudformation deploy --stack-name cross-stack-subnet --template-file ./subnet.yml --parameter-overrides VPCStackName=cross-stack-vpc

Waiting for changeset to be created..
Waiting for stack create/update to complete
Successfully created/updated stack - cross-stack-subnet
$

VPC stack VPC stack event

VPC stackがVPCを生成している。

VPC stack Outputs

VPC stackのExport Nameも確認できる。

Subnet stack Subnet stack event

Subnet StackがSubnetを生成している。

Conclusion

今回はクロススタック参照を用いて、VPC, SubnetをCfnで生成した。

クロススタック参照はそれだけでも十分使えるが、Nested stackと併用することでさらに強力な武器となる。

ただ、Nested stackを使い全リソースを管理する運用方法だと、いざスタックを更新する際に影響範囲が大きくなるというデメリットもある。 そのため、(このあたりはスタック設計に関わってくるけれど)Nested stackを用いずにクロススタック参照だけでスタックを運用するという方法もありではないかと。