CloudFormation の拡張機能利用スタックを更新しようとしたら、変更セットが作成できなくてハマった
はじめに
AWS CloudFormation でAWS::LanguageExtensions
を利用して言語機能を拡張すると、Fn::ForEach
による繰り返し処理等、素の CloudFormation だけでは実施できない処理が可能となります。
AWS::LanguageExtensions
は便利な拡張ではありますが、Condition
でリソース作成の有無を切り替えようとした際に中々うまくいかなかったので、遭遇したエラーとその解決策について紹介します。
先に解決策
AWS::LanguageExtensions 変換 - 考慮事項に記載の通り、
AWS::LanguageExtensions
を利用している際は「既存のテンプレート使用」以外を選択してスタックを更新しましょう。
詳細
CloudFormation スタックの更新について
既存の CloudFormation スタックを更新する際には、更新に利用するテンプレートとして次の 3 種類が選択可能です。
- 既存のテンプレートを使用
- 既存のテンプレートを置換
- Infrastructure Composer で編集
対象テンプレートの中身を変更した際には「既存のテンプレートを置換」や「Infrastructure Composer で編集」を選択します。
しかし、テンプレート自体の変更はなくパラメータを切り替えるだけであれば、いちいちテンプレートを上げ直すのも手間なので「既存のテンプレートを使用」を選択するかなと思います。
発生した問題
今回は「既存のテンプレートを使用」選択した際に問題が発生しました。
初回のスタック作成は問題なく実施できますが、スタックを更新しようとした際に下記のエラーがでました。
問題の CloudFormation テンプレートは下記です。
AWSTemplateFormatVersion: "2010-09-09"
Description: "Create a Custom Event Bus"
Transform: AWS::LanguageExtensions
Parameters:
DisableEventBus:
Type: String
Default: false
AllowedValues:
- true
- false
Conditions:
NeedsEventBus: !Equals [!Ref DisableEventBus, false]
Resources:
CustomEventBus:
Type: AWS::Events::EventBus
Condition: NeedsEventBus
Properties:
Name: custom-event-bus
パラメータの指定で変化する条件によって EventBus を作成するシンプルなものです。
ここで問題なのはAWS::LanguageExtensions
の部分です。
改めて AWS CloudFormation のドキュメントを確認してみるとAWS::LanguageExtensions
の考慮事項について下記のように記載がありました。
別のパラメータ値を使用してスタックを更新する際、CloudFormation コンソールで [既存のテンプレートを使用する] オプションを使用しないでください。または、元のテンプレートに変換が含まれている場合、同等のコマンドラインオプション --use-previous-template を使用しないでください。代わりに、スタックを更新する際に、元の変換されていないテンプレートを使用します。スタックが新しいパラメータ値で更新されるようになります。
最初はCondition
の条件が原因かなどと考えておりましたが関係なかったようです。
実際にCondition
の無い、もっとシンプルな下記のテンプレートでも試してみましたが同様のエラーが発生しました。
AWSTemplateFormatVersion: "2010-09-09"
Description: "Create a Custom Event Bus"
Transform: AWS::LanguageExtensions
Parameters:
EventBusName:
Type: String
Resources:
CustomEventBus:
Type: AWS::Events::EventBus
Properties:
Name: !Ref EventBusName
問題への対処
スタック更新時に「既存のテンプレートを置換」か「Infrastructure Composer で編集」を選択しましょう。
実際に「Infrastructure Composer で編集」を選択してテンプレートを準備すると無事に変更セットが作成されました。
おわりに
表示されたエラーメッセージだけでは何に関するエラーかが分からずにハマりましたが、あれこれパラメータを変えてみたりテンプレートを差し替えたりする中で解決策にたどり着きました。
思わぬハマりポイントがあったので、LanguageExtensions
についてその他の考慮事項についても確認していこうと思います。

私たち BABY JOB は、子育てを取り巻く社会のあり方を変え、「すべての人が子育てを楽しいと思える社会」の実現を目指すスタートアップ企業です。圧倒的なぬくもりと当事者意識をもって、子どもと向き合う時間、そして心のゆとりが生まれるサービスを創出します。baby-job.co.jp/
Discussion