【トラブル】【AWS】CloudFormationで変数を参照したら、エラー「Unresolved resource dependencies」が表示

■ はじめに

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)」を通すと、意味合いが異なる。
 => 正確には、「${変数}」が変わる。詳細は以下。

https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html

より抜粋
~~~~~~
実行時に、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