🌟

[CloudFormation] ネストスタック構成で子スタックのスタック名を取得する方法

2021/08/05に公開

構成

親テンプレート
 - 子テンプレート1 (ChildStack1)
 - 子テンプレート2 (ChildStack2)

やりたいこと

子テンプレート2 のパラメータで子テンプレート1 のスタック名を使用したい

実装方法

1.子テンプレート1 の Outputs セクションで Ref 組み込み関数を使用し出力したものを親テンプレートから子テンプレート2 へ渡す

実装例:下記のように Ref 組み込み関数と疑似パラメータを使用することで子テンプレート1 のスタック名を出力することができます

Outputs:
  ChildStack1Name:
    Value: !Ref AWS::StackName

2. 親テンプレートから子テンプレート2 へプロパティで渡す際に組み込み関数を駆使する

実装例:下記のように組み込み関数を複数使用することで子テンプレート1 のスタック名を取得することができます

ChildStack1Name: 
  Fn::Select:
    - 1
    - Fn::Split:
      - /
      - !Ref ChildStack1

しかし、自分が管理していない子テンプレートのスタック名がパラメータで必要になった場合、
2 の方法でも実装することが可能です

2 の詳細について

親テンプレート上で子テンプレートのスタック名を取得しようと思った場合、
まず最初に思いつくのは 子スタックに対して !Ref か !GetAtt を使用して取得する方法です
しかし、AWS::CloudFormation::Stack では !Ref のみ対応かつ、
出力はスタック ID となっています
参考:https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-properties-stack.html
そのため、下記組み込み関数を利用しスタック名を取得しにいきます。
・Ref
・Fn::Select
・Fn::Split

各組み込み関数の簡単な説明

・Ref
 → 指定したパラメータまたはリソースの値を返します
・Fn::Select
 → リスト形式のオブジェクトからインデックスを使用して該当のオブジェクトを返します
・Fn::Split
 → 文字列をリスト形式に分割し、オブジェクトを選択できるようにします
参考:https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference.html

実装の説明

ChildStack1Name: 
  Fn::Select:
    - 1
    - Fn::Split:
      - /
      - !Ref ChildStack1

上記コードの処理を順番に一つ一つ見ていきます(下から見ます)

1.!Ref を使用し、子テンプレート1 のスタック ID を取得します

2.Fn::Split を使用し、1. で取得したスタック ID を分割しリストにします
 この時、一つ目のパラメータで区切り記号 (今回は '/' ) を指定し、
 二つ目のパラメータで分割する文字列を指定します
※スタック ID のフォーマットは下記になっています
arn:aws:cloudformation:<region>:<accountId>:stack/<StackName>/<ランダム文字列>

3.Fn::Select を使用し、2. で分割した文字列リストからスタック名を選択し、取得します
 この時、一つ目のパラメータでインデックス (今回は '1' ) を指定し、
 二つ目のパラメータで選択するオブジェクトが含まれているリストを指定します

Discussion