Serverless Frameworkを用いてAWSにデプロイ・運用していたサービスについて久々に更新を掛けたところデプロイに使用していたIAMユーザーが必要なアクションの権限を持っていなかったことが原因でUPDATE_ROLLBACK_FAILED
に陥ってしまいました。
このときの対応方針について調査、修正したときのメモになります。
1. エラーの原因を調査
- まずはServerless Frameworkによって呼び出されるCloudFormationの更新処理(UpdateStack)が何由来で失敗に至ったかを調べるのにAWSのマネジメントコンソールにアクセス
- CloudFormationのスタック一覧から該当のスタックを選択
- イベントタブのログをさかのぼりエラー内容(状況の理由)を確認
- 「根本原因を検出」というボタンを押すと直近のイベントログのうち一番古いエラーにジャンプできる
- 最新のステータスがエラー状態のときのみ押下可能かも
今回はデプロイに使用しているIAMユーザーに必要なアクションの権限が不足していました。
エラーによってはServerless Frameworkのデプロイを行っている側のログにも同じ内容が出ることもあるかも。
2. エラーの原因を解決しロールバックを再実行
参考サイト内の情報によるとUPDATE_ROLLBACK_FAILED
状態に陥った状況で取れる対応は ContinueUpdateRollback または DeleteStack のオペレーションのみ
とのこと。
DeleteStackは行えないのでまずはロールバックを完了させることにしました
- まずはエラーの原因について解決(IAMユーザーのポリシーに必要なアクションを追加)
- CloudFormationのスタック詳細画面で「スタックアクション > 更新ロールバックを続ける」を選択
- ステータスが
UPDATE_ROLLBACK_COMPLETE
になれば正常にロールバックできたといえる?×アイコン出てるけどこれが正常な「更新ロールバックを完了させた状態」のステータスだと思います
ちなみにUPDATE_ROLLBACK_FAILED
状態に陥ったあと、ロールバックを完了させない状態のまま再度Serverless Frameworkからの再度のデプロイ操作を行ったところ以下のようなエラーが出ました。
$ npx serverless deploy --verbose
~~~いろいろ~~~
Error:
Stack:arn:aws:cloudformation:ap-northeast-1:@@@@@@@@@@@@:stack/@@@@@@@@@@@@@@/@@@@@@@@@@@@@@@@@@@@@@@@@@ is in UPDATE_ROLLBACK_FAILED state and can not be updated.
3. 再度デプロイ
最新のステータスはUPDATE_ROLLBACK_COMPLETE
のためスタックのステータスは赤い状態ですが、再度のデプロイ操作が可能となりました。
$ npx serverless deploy --verbose
~~~いろいろ~~~
✔ Service deployed to stack @@@@@@@@@@@@@@@@
~~~いろいろ~~~
エラーの先にまた別のエラーが隠れていることもあり、実際には何度かロールバックと再デプロイをやりなおす必要があることも