AWS CodeDeploy のデプロイ戦略 - EC2 ・ ECS ・ Lambda へのブルーグリーンデプロイ

EC2・ECS・Lambda の 3 プラットフォームに対応するデプロイ戦略を統一的に管理する。ECS ブルーグリーンデプロイと CloudWatch アラーム連動の自動ロールバックを紹介します。

CodeDeploy の対応プラットフォームとデプロイタイプ

CodeDeployEC2/オンプレミス、ECSLambda の 3 つのプラットフォームに対応するデプロイサービスです。EC2/オンプレミスではインプレースデプロイ (既存インスタンスを順次更新) とブルーグリーンデプロイ (新しいインスタンスグループを作成して切り替え) を選択できます。ECS ではブルーグリーンデプロイのみをサポートし、新しいタスクセットを起動してターゲットグループを切り替えます。Lambda ではトラフィックシフトによる段階的なデプロイを提供します。CodeDeploy 自体の利用料金は EC2/Lambda へのデプロイでは無料で、ECS へのデプロイのみ更新ごとに課金されます。

ECS ブルーグリーンデプロイの設計

ECS のブルーグリーンデプロイでは、ALB に 2 つのターゲットグループ (本番用とテスト用) を設定します。デプロイ開始時に新しいタスクセット (Green) が起動し、テスト用ターゲットグループに登録されます。テストリスナーポートで Green 環境の動作確認を行い、問題がなければ本番リスナーのトラフィックを Green に切り替えます。切り替え後も旧タスクセット (Blue) は指定した待機時間 (デフォルト 1 時間) 保持されるため、問題が発生した場合は即座にロールバックできます。AppSpec ファイルの AfterAllowTestTraffic フックで自動テストを実行し、テスト失敗時に自動ロールバックする構成が推奨されます。

自動ロールバックとアラーム連携

CodeDeploy の自動ロールバックは、デプロイ失敗時と CloudWatch アラーム発火時の 2 つのトリガーで動作します。 CloudWatch アラームとの連携では、デプロイ後のエラー率 (5xx レスポンスの割合)、レイテンシ (p99 応答時間)、ビジネスメトリクス (注文成功率など) を監視し、閾値を超えた場合に自動的に前バージョンにロールバックします。 Lambda のトラフィックシフトでは、 Canary デプロイで最初に 10% のトラフィックを新バージョンに流し、指定した時間 (例: 10 分) アラームが発火しなければ残りの 90% を切り替えます。 Linear デプロイでは 10% ずつ段階的にトラフィックを移行し、各ステップでアラームを監視します。 CodeDeploy のパイプライン設計を網羅的に学ぶなら、技術書 (Amazon)を参照してください。

CodeDeploy の料金

CodeDeploy は EC2、ECS、Lambda へのデプロイがすべて無料です。ブルーグリーンデプロイで一時的に 2 倍のリソースが稼働する期間のコンピューティング料金は発生しますが、CodeDeploy 自体の追加料金はありません。ECS のブルーグリーンデプロイでは、Green タスクセットの起動からトラフィック切り替えまでの間、Blue と Green の両方のタスクが稼働するため、その期間分の Fargate または EC2 料金が追加されます。切り替え後の Blue タスクセットの保持時間を短く設定することでコストを抑えられます。

デプロイ設定とトラフィックシフト

CodeDeploy では、新しいバージョンへ切り替える際のトラフィックの移し方を設定で選べます。一度に全切り替えする方式は速いものの、問題があれば全利用者に影響します。ごく一部から徐々に増やすカナリア方式や、一定割合ずつ段階的に移す線形方式なら、異常を早期に検知して被害を抑えられます。Lambda では、エイリアスを使ってバージョン間でトラフィックの割合を調整し、なめらかに切り替えます。リスクの許容度に応じて切り替え方を選ぶことで、ダウンタイムや障害の影響を最小化しながら、新バージョンを安全にリリースできます。

EC2 デプロイの方式

EC2 やオンプレミスのサーバーへのデプロイでは、稼働中のインスタンスを順次更新するインプレース方式と、新しいインスタンス群を立ててから切り替えるブルーグリーン方式を選べます。ブルーグリーンは、問題があれば即座に元の環境へ戻せるため、安全性が高い一方、一時的にリソースが二重に必要です。デプロイの対象は、デプロイグループとしてタグなどで定義します。デプロイの各段階で任意の処理を差し込めるため、起動前後の準備や検証を組み込めます。アプリケーションの特性とダウンタイムの許容度に応じて、適切な方式を選びます。

CI/CD パイプライン統合

CodeDeploy は、CI/CD パイプラインの一部として組み込むことで真価を発揮します。ビルドとテストを経た成果物を、パイプラインの最終段で自動的にデプロイする流れを構築できます。デプロイの手順や、各段階で実行する検証処理は、定義ファイルに宣言的に記述します。これにより、デプロイの内容がコードとして管理され、再現性が保たれます。手動の作業を介さず、コミットからデプロイまでを自動化することで、リリースの頻度を上げつつ、人為的なミスを減らせます。パイプラインに組み込んだデプロイが、安定した継続的デリバリーを支えます。

安全なリリースのベストプラクティス

安全なデプロイの鍵は、問題を早期に検知し、自動で元に戻せる仕組みを整えることです。デプロイの途中で検証処理を実行し、新バージョンが正常に動作するかを確認します。リリース後の指標を監視し、エラー率の上昇などの異常を検知したら、自動でロールバックする設定にしておけば、被害を最小限に抑えられます。段階的にトラフィックを移す方式と組み合わせれば、全面切り替え前に問題に気づけます。いきなり全利用者へ展開せず、小さく試して確認しながら広げるという原則を、仕組みとして組み込むことが、信頼できるリリース運用につながります。

まとめ

CodeDeploy は EC2、ECS、Lambda への安全なデプロイを統一的に管理するサービスです。ブルーグリーンデプロイとトラフィックシフトで本番環境のリスクを最小化し、CloudWatch アラームとの連携で問題発生時の自動ロールバックを実現します。AppSpec のライフサイクルフックでデプロイプロセスにテストを組み込むことで、品質を担保したデプロイ自動化を構築できます。