YAML記述のCloudFormation内でのJSON箇所の組み込み関数記入方法

2022.12.03

今回のテーマ

こんにちは、「金曜日に4時起きしてサッカー見られて良かった」AWS事業本部コンサルティング部のこーへいです。

今回のテーマはYAML記述のCFn内のJSON箇所における組み込み関数の記入方法についてです。

背景

YAMLとJSONを同時に言ってて、何を言っているのか分からない方もいらっしゃると思いますので、まずは以下のコードを見てください。

MyStateMachine:
  Type: "AWS::StepFunctions::StateMachine"
  Properties:
    DefinitionString:
      !Sub
        - |-
          {
            "Comment": "A Hello World example using an AWS Lambda function",
            "StartAt": "HelloWorld",
            "States": {
              "HelloWorld": {
                "Type": "Task",
                "Resource": "${lambdaArn}",
                "End": true
              }
            }
          }
        - {lambdaArn: !GetAtt [ MyLambdaFunction, Arn ]}
    RoleArn: !GetAtt [ StatesExecutionRole, Arn ]

上記コードは、AWS CloudFormation を使用して Step Functions 用の Lambda ステートマシンを作成する内のLambda ステートマシンを作成するにはにあるStep Functionsのコードをそのまま引っ張ってきたものです。

上記コードはYAML形式で記述されていますが、一部Step Functionsの定義はJSON形式で記述されています

JSON記述の中でLambdaのarnをハードコーディングではなく、組み込み関数を使用する方法で沼った次第です。

結論

答えは先ほど挙げた公式が用意したコード内に書かれていますが、以下の通り(見やすいように必要な箇所を抜粋)、JSON部分の全体に対して!Subの組み込み関数を適用する形で記述しています。

DefinitionString:
  !Sub
    - |-
      {
        "Resource": "${lambdaArn}",
      }

決して以下のようにJSONの中で関数毎に!Subを指定するわけではないです。

DefinitionString:
  - |-
    {
      "Resource": "!Sub ${lambdaArn}",
    }