Zenn
😅

CloudFormation の拡張機能利用スタックを更新しようとしたら、変更セットが作成できなくてハマった

2025/03/21に公開

はじめに

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 で編集」を選択してテンプレートを準備すると無事に変更セットが作成されました。

スタック更新_解決策_Infrastracture_Composerで編集
スタック更新_解決策_結果

おわりに

表示されたエラーメッセージだけでは何に関するエラーかが分からずにハマりましたが、あれこれパラメータを変えてみたりテンプレートを差し替えたりする中で解決策にたどり着きました。

思わぬハマりポイントがあったので、LanguageExtensionsについてその他の考慮事項についても確認していこうと思います。

BABY JOB  テックブログ

Discussion

ログインするとコメントできます