😥

rain deployだとAWS::Scheduler::Scheduleがエラーになる

2024/12/13に公開

はじめに

rainコマンドでAWS EventBridge Scheduleをデプロイしようとしたところ、FlexibleTimeWindow.Mode に関するエラーに直面しました。この記事では、そのエラーの解決方法を共有します。

rainとは?

rainは、CloudFormationテンプレートを扱うための便利なCLIツールです。フォーマット整形、リソースの差分確認、テンプレートのデプロイや削除など、多機能なCLIツールとして、AWSリソース管理を効率化します。詳しくは、下記のURLを参照してください。

使用した CloudFormation テンプレート

以下は、EventBridge Scheduleを設定するためのCloudFormationテンプレートの例です。このテンプレートでは、1時間ごとに特定のLambda関数を実行するスケジュールを作成します。

  EventBridgeSchedule:
    Type: AWS::Scheduler::Schedule
    Properties:
      Name: !Ref "AWS::StackName"
      Description: test
      ScheduleExpression: rate(1 hour)
      ScheduleExpressionTimezone: Asia/Tokyo
      FlexibleTimeWindow:
        Mode: "OFF"
      State: ENABLED
      Target:
        Arn: arn:aws:lambda:ap-northeast-1:000000000000:function:lambda-schedule-test
        RoleArn: arn:aws:iam::000000000000:role/lambda-schedule

デプロイ時に発生したエラー

rain コマンドで以下のようにデプロイを試みたところ、エラーが発生しました。

rain deploy cfn-schedule.yml TestStack

エラー内容は以下の通りです。

Properties validation failed for resource EventBridgeSchedule with message:
[#/FlexibleTimeWindow/Mode: false is not a valid enum value]

このエラーの原因として、FlexibleTimeWindow.Mode の値が不正であると指摘されています。しかし、ドキュメントによれば、OFF は正しい値のはずです。

解決方法

エラーを回避するため、rain コマンドに --node-style オプションを追加しました。このオプションは、テンプレート内の値の扱いを明確化するためのものです。

rain deploy cfn-schedule.yml TestStack --node-style quotescalars

これにより、テンプレートが正常にデプロイされました。

なぜ --node-style quotescalars が必要だったのか?

以下は、いつもお世話になってるChatGPTさんの見解です。

YAML形式では、値の型が曖昧になる場合があります。特に OFF のような値は、YAMLの仕様によりブール値(false)として解釈される可能性があります。この結果、CFNテンプレート内のプロパティ検証に失敗していたと考えられます。

--node-style quotescalars オプションを使うと、YAMLファイルの中で書かれた値に自動的に "(ダブルクォート)をつけてくれます。たとえば、OFF をそのまま書くとシステムが「これは 何か特別な意味 のある言葉かも?」と勘違いしてしまうことがあります。でも、"OFF" とダブルクォートで囲むと、「これはただの文字」と正しく認識されます。

このオプションを使うことで、そういった勘違いを防いでエラーが出なくなるのです。

あとで気づいたのですが、rain fmtコマンドでテンプレートを表示してみると、"OFF"のダブルクォーテションが削除されていることがわかります。

      FlexibleTimeWindow:
        Mode: OFF

--node-style quotescalars オプションをつけてrain fmtコマンドを実行すると、"OFF"のダブルクォーテションは削除されませんでした。ちなみに、--node-style doublequoted オプションをつけても同様です。

      "FlexibleTimeWindow":
        "Mode": "OFF"

Discussion