rain deployだとAWS::Scheduler::Scheduleがエラーになる
はじめに
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