■ はじめに
CloudFormation の変数に関する扱いで、 結構ハマったので、メモしておく これ以外のトラブルについては、以下の関連記事を参照のこと。
CloudFormation でのトラブル
https://dk521123.hatenablog.com/entry/2022/05/30/191507
【1】現象概要
CloudFormationでEC2を構築する際に、 以下「NG.yml」のように変数
NG.yml (一部抜粋)
Properties: AvailabilityZone: us-west-2 UserData: Fn::Base64: !Sub - | #!/bin/bash -x DEMO_VALUE="Hello, World" echo ${DEMO_VALUE} # ★ここでエラー
【2】エラー内容
Template format error: Unresolved resource dependencies [DEMO_VALUE] in the Resources block of the template
【3】原因
CloudFormation ~ 組み込み関数 ~
https://dk521123.hatenablog.com/entry/2021/12/04/202519
でも触れていることだが、、、 Bashでは、「${変数}」と「$変数」は同じ意味だが 組み込み関数「!Sub (Fn::Sub)」を通すと、意味合いが異なる。 => 正確には、「${変数}」が変わる。詳細は以下。
より抜粋 ~~~~~~ 実行時に、AWS CloudFormation が関連する値と置き換わる変数のある文字列。 変数を ${MyVarName} として書き込みます。 ・・・略・・・ USD 記号と中括弧 (${}) をそのまま書き込むには、 最初の中括弧の後に感嘆符 (!) を追加します (${!Literal} など)。 CloudFormation は、このテキストを ${Literal} として解決します。 ~~~~~~
NG.yml (一部抜粋)
UserData: Fn::Base64: !Sub # ★←この「!Sub」★ - |
【4】解決案
* 解決案は以下の2通り。 + Case1:${!変数} で指定する + Case2:$変数 で指定する
Case1:${!変数} で指定する
echo ${!DEMO_VALUE} # ★OK★
Case2:$変数 で指定する
echo $DEMO_VALUE # ★OK★
参考文献
https://qiita.com/ohsawa0515/items/766785118c3f1457e0bc
https://stackoverflow.com/questions/44458304/how-to-escape-in-cloudformations-fnsub
関連記事
CloudFormation でのトラブル
https://dk521123.hatenablog.com/entry/2022/05/30/191507
CloudFormation ~ 基礎知識編 ~
https://dk521123.hatenablog.com/entry/2024/02/10/231900
CloudFormation ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2021/10/26/224812
CloudFormation ~ 基本編 ~
https://dk521123.hatenablog.com/entry/2021/12/01/170326
CloudFormation ~ 組み込み関数 ~
https://dk521123.hatenablog.com/entry/2021/12/04/202519
CloudFormation ~ Parameters ~
https://dk521123.hatenablog.com/entry/2024/02/29/220042