CloudFormationクロススタック参照
クロススタック参照を使用すると、スタック間の連携が可能になります。
スタック間の連携、つまりテンプレートが複数必要になります。
- 参照される側のテンプレート
- Outputsセクションの
Export
プロパティで値をエクスポート
- Outputsセクションの
- 参照する側のテンプレート
- 組み込み関数
Fn::ImportValue
で値をインポート
- 組み込み関数
値をスタック間で受け渡しすることによって、IAMロールやVPC情報、セキュリティグループなどを共有することができます。
参照される側のテンプレート
web-sg.template.yaml
AWSTemplateFormatVersion: "2010-09-09" Parameters: MyVPC: Type: AWS::EC2::VPC::Id Resources: WebSG: Type: AWS::EC2::SecurityGroup Properties: GroupName: "web-sg" GroupDescription: "web security group" SecurityGroupIngress: - IpProtocol: "tcp" FromPort: "80" ToPort: "80" CidrIp: "0.0.0.0/0" SecurityGroupEgress: - IpProtocol: "-1" CidrIp: "0.0.0.0/0" VpcId: !Ref MyVPC Outputs: WebSG: Description: The ID of the web security group Value: !Ref WebSG Export: Name: "stack-web-sg"
Export
OutputsセクションのExportプロパティで値をエクスポートします。
Outputs:
<論理ID>:
Description: 出力の説明
Value: 出力値
Export:
Name: エクスポート名
注意点として、エクスポート名はリージョン内で一意にする必要があります。リージョン内のグローバル変数と言った方がわかりやすいかもしれません。
サンプルでは固定文字列ですが、組み込み関数Fn::Sub
を使って動的に設定することも出来ます。
!Sub "${AWS::StackName}-SGID"
参照する側のテンプレート
ec2.template.yaml
AWSTemplateFormatVersion: "2010-09-09" Parameters: KeyPair: Type: AWS::EC2::KeyPair::KeyName Description: "KeyPair Name" Resources: MyEC2: Type: AWS::EC2::Instance Properties: ImageId: ami-e99f4896 InstanceType: "t2.micro" SecurityGroupIds: [!ImportValue "stack-web-sg"] KeyName: !Ref KeyPair Outputs: MyEC2: Value: !Ref MyEC2
Fn::ImportValue
組み込み関数Fn::ImportValue
を使用してエクスポートした値を受け取ります。
!ImportValue エクスポート名
まとめ
テンプレートを論理単位に分割すると疎結合になり、共有や管理がしやすくなります。 また、ネットワーク構築者とアプリ構築者のように責務を分担出来ます。 使える所では積極的に使っていきたいですね。