はじめに
デプロイ運用は、Blue/Greenでシームレスにサービス移行できるのも重要だが、デプロイに失敗した際のロールバックと再デプロイをスムースに行えることも重要だ。
Canaryなデプロイにおける自動ロールバックについては、過去の記事で調査を行ったので、今回は手動ロールバックと再デプロイについての動作検証を行う。
なお、最初に断っておくと、この方法は結果的に期待した動作になっているが、途中でエラーが出たりして怪しさ満点である。もう少しちゃんとした検証が必要かもしれない。
前提条件
-
Lambda+SAMテンプレートでの基本的な動作の仕様を理解している(過去の記事で紹介済み)
-
デプロイは以下の仕様とする
-
Prodのエイリアスを使用してCanaryの向き先を制御する(SAMテンプレートで
AutoPublishAlias: Prod
としている) -
API GatewayのLambda統合プロキシで、上記Prodをターゲットにしている
初回デプロイ直後の状態
以下のようになっている。初版と言いながらバージョン8なのは、この記事を書くにあたりいろいろ試行錯誤した結果なのであしからず。
初回の修正を行った状態
初回の修正を行い、パイプラインが走った後、以下の状態になる。
バージョン9が作られ、Prodのエイリアスが最新バージョンに向いている状態だ。
ここで、バージョン9に不具合があったことが分かったと仮定して、ロールバックをしてみよう。
うーん、この「デプロイの再試行」ボタンなのか?日本語的には意味が違うが……
AWSはたまに翻訳が怪しいので、とりあえず押してみると…
なんかエラーが一度出た。が、結果として最後のデプロイは成功しているようなので、確認してみる。
期待した通り、Prodのエイリアスが元通り8を指している。
curlによる正常性確認も、しっかりバージョン8の動作をした。
では、ここで再度バージョン9の不具合修正を行い、デプロイを行う。
すると、バージョン9を飛ばしてしっかりバージョン10を向くようになった。
では、仮にここで、さらにバージョン10にも不具合があってロールバックしたらどうなるだろうか?
ここでバージョン9に戻ってしまうと、瑕疵のあるバージョンがデプロイされてしまう。
では、再び「デプロイの再試行」ボタンを押してみよう。
しっかりと、バージョン9ではなくてバージョン8に戻ってくれた。
この後、バージョン11をデプロイして、これはデプロイ成功したと仮定して、さらにバージョン12をデプロイ→ロールバックとしてみた。
うむ、デプロイ成功したバージョンについてはしっかり覚えてくれて、そこまでロールバックしてくれるという仕様のようだ。
これ、エラーの謎さえ解けて、これが仕様通りの動作なのだとしたら、完璧に期待通りの動作なのだけど。
エラー内容をGoogleで確認しても分からなかったので、迷宮入りしてしまいそうである……。