俺のアウトプット

調べたこと、試したことを書きます

CloudFormationクロススタック参照

クロススタック参照を使用すると、スタック間の連携が可能になります。

スタック間の連携、つまりテンプレートが複数必要になります。

  • 参照される側のテンプレート
    • OutputsセクションのExportプロパティで値をエクスポート
  • 参照する側のテンプレート
    • 組み込み関数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"

f:id:kitsugi:20180801075810p:plain

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 エクスポート名

まとめ

テンプレートを論理単位に分割すると疎結合になり、共有や管理がしやすくなります。 また、ネットワーク構築者とアプリ構築者のように責務を分担出来ます。 使える所では積極的に使っていきたいですね。

参考