この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
今回のテーマ
こんにちは、「金曜日に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}",
}