#背景
AWS CloudFormationでスタックの更新(update-stack)を実行するとき、各リソースのコードに変更がなければ、そのリソースは変更されません。
ただ、Lambda-backed カスタムリソース(CloudFormationテンプレート内でLambdaを実行し、その戻り値を別リソースのパラメータとして使用する)のように、スタックを更新する度に毎回更新(実行)されないと困るものがあります。
そこで、超簡単に特定のリソースを毎回更新扱いにする方法を思いつきました。
#実現方法
実現方法は以下の通りです。
任意にパラメータを定義し、パラメータをDescriptionに含めるだけです。
万が一Descriptionがない場合は、そのリソースを説明する任意文字列を意味する代替パラメータに含めます。(そもそもDescriptionがないリソースがあるかは、途方も無いので調べていません。。。)
ものすごく地味な方法ですが、簡単に特定のリソースだけに更新フラグを付けることができます。
Parametersの例
Parameters:
ModifyStackDate:
Type: String
Default: '201901010000'
Description: Enter Date of Modify Stack.
変更を加えるリソース
以下のようにDescriptionにパラメータを含めます。
!Refでパラメータを指定するだけで、簡単にできます。
他の文字列と結合したい場合は、以下のように!Joinを使うだけです。
HogeHoge:
Type: "AWS::Lambda::リソースの種類"
Properties:
Description: !Join [ ":", [ 'リソースの説明', !Ref ModifyStackDate ] ]
(以下略)
update-stack
以下のように--parametersを含め、ParameterKeyとParameterValueでパラメータ名と値の組合せを指定するだけです。
aws cloudformation update-stack --stack-name Hoge-Stack --template-body file://hoge.yaml --capabilities CAPABILITY_NAMED_IAM --parameters ParameterKey=ModifyStackDate,ParameterValue=201906030600
実行結果
「Lambda-backed カスタムリソースでLambdaのBoto3を自動で最新化する」で書いた、毎回最新化したいLambda Layerで試してみました。
以下のように、説明文に毎回任意のパラメータ値を付加することで、変更扱いとなります。
超簡単にCloudFormationのスタック内にある特定のリソースだけを変更扱いにできました。
超地味な方法ですが、Lambda-backed カスタムリソースで毎回実行させたい処理がある場合に、超簡単に威力を発揮します。