はじめに
Serverless Framework の serverless.yml
で定義していた複数の EventBridge のルールで、一部のルールを削除してデプロイしたところ、エラーが発生してデプロイに失敗しました。
そのことに関して調べたことのメモです。
エラー内容
具体的には、下記のような 5 個あるルール(設定値は適当)のうちの、3つ目を削除するため serverless.yml
から削除してデプロイしたところ、元々 4つ目と5つ目に定義されていたルールで、CloudFormation で内部的に定義されているであろう ID が 3, 4 へと繰り上がろうとし、一時的に同名のリソースが出来上がろうとしたと思われる形でエラーとなります。
- before
functions: hello: handler: hello events: - schedule: rate(1 hours) - schedule: cron(0 9 * * ? *) - schedule: cron(30 0 * * ? *) - schedule: rate: - cron(0 0/4 ? * MON-FRI *) - cron(0 2 ? * SAT-SUN *) - schedule: cron(0 13 * * ? *)
- after
functions: hello: handler: hello events: - schedule: rate(1 hours) - schedule: cron(0 9 * * ? *) #- schedule: cron(30 0 * * ? *) # これを削除した - schedule: rate: - cron(0 0/4 ? * MON-FRI *) - cron(0 2 ? * SAT-SUN *) - schedule: cron(0 13 * * ? *)
serverless deploy
でデプロイすると以下のようなエラーになりました。
: CloudFormation - UPDATE_IN_PROGRESS - AWS::Events::Rule - helloEventsRuleSchedule3 CloudFormation - UPDATE_IN_PROGRESS - AWS::Events::Rule - helloEventsRuleSchedule4 CloudFormation - UPDATE_FAILED - AWS::Events::Rule - helloEventsRuleSchedule3 CloudFormation - UPDATE_FAILED - AWS::Events::Rule - helloEventsRuleSchedule4 :
ワークアラウンド
Issueやフォーラムを見ると、現状だとそういう動きになってしまうようです。
- Problem to deploy when removing a schedule from a lambda function - Serverless Framework - Serverless Forums
- Problem to deploy when removing a schedule from a lambda function · Issue #3255 · serverless/serverless · GitHub
回避策としては serverless remove
で一旦 CloudFormation スタックごと削除して再作成するか、該当の EventBridge のルール以下を全て削除して一度デプロイし、その後必要なルールを定義した状態にしてもう一度デプロイして再作成する形しかないようでした。
まとめ
Serverless Framework で定義していた、複数ある Amazon EventBridge のルールの一部のみの削除に失敗する時のワークアラウンドについてまとめました。 やや面倒ではありますがデプロイのタイミングを見計らって、一度ルールを一度削除して再作成するような形を取るしかなさそうです。