Amazon Web Services ブログ

ブルー/グリーンでの継続的デプロイを使用して Amazon CloudFront でゼロダウンタイムのデプロイメントを実現する

ブルー/グリーンデプロイは、新しいコードの導入に伴うダウンタイムやリスクを最小限に抑えることを目的として、ソフトウェア開発において広く用いられているデプロイメント手法です。このデプロイ戦略は、2つの同一環境(ブルーおよびグリーン)を並行稼働させ、必要に応じてそれぞれの環境間でトラフィックを誘導します。この手法はエンドユーザーに悪影響を及ぼさず、途切れることなく新しい機能や更新をデリバリーできます。必要であれば簡単にロールバックできます。アジリティ、継続的デリバリー、信頼性のあるソフトウェアデリバリーを重視するチームにとって、ブルー/グリーンデプロイは重要なプラクティスです。

この記事では、Amazon CloudFront の機能である継続的デプロイを活用できるさまざまなユースケースについて議論をします。この機能は、ブルー/グリーンや Canary のテクニックを用いて、動作中のコンテンツ配信ネットワーク(CDN)ディストリビューションをデプロイするためのマネージドな方法を提供しています。これにより、ドメイン全体に渡って変更を加える際のリスクを大幅に低減します。この機能を使用すると、全てのエッジロケーションに変更を展開する前に、本番トラフィックの一部を更新した構成に向けて誘導することで、変更の検証を行えます。

一般的なユースケース

CloudFront の継続的デプロイは、ユーザーエクスペリエンスを妨げることなく、新機能、バグ修正、その他の変更をアプリケーションにリリースできる効果的な手法です。この記事では、いくつかの一般的なユースケースについて議論します。

  1. クリティカルなシステムの更新
    ビジネスクリティカルなアプリケーションとって、ダウンタイムやユーザーエクスペリエンスへの悪影響を最小限に抑えることは重要です。CloudFront の継続的デプロイを使用すると、既存のバージョンと並行して CDN コードの新しいバージョンをデプロイし、テストを行い、ダウンタイムなしで新しいバージョンに切り替えることができます。この機能により、ゼロダウンタイムでのデプロイや簡単なロールバックが可能となり、古い CloudFront ディストリビューションから新しいディストリビューションへのシームレスな移行を実現します。
  2. A/B テスト
    CloudFront の継続的デプロイは、ソフトウェア開発における実験に利用することもできます。これは、CloudFront のお客様が自身のユーザーベースを用いて試行できる実験の数を増やし、ビジネスメトリクスを収集して情報に基づいた意思決定を行い、これを繰り返すことで、プロダクトの開発ライフサイクルを短縮できます。
  3. 速いロールバック
    従来のデプロイメント手法では、変更のロールバックは困難で時間のかかるプロセスとなることがあります。しかし、CloudFront の継続的デプロイでは、もし他のディストリビューションの新しいコードに問題が発生した場合、プライマリディストリビューションのコードに簡単に切り戻すことができます。これにより、デプロイ中に発生しうる様々な問題やバグの影響をユーザーが受けることはありません。
  4. 新機能のロールアウト
    新機能のローンチでは、CloudFront の継続的デプロイは間違った CDN コードをデプロイするリスクを最小化する手助けをしてくれます。ユーザーの少数のグループに対して更新をリリースすることで、全体のユーザーベースにリリースする前に、開発者はその更新が正しく機能しているかを確認できます。これは、問題の拡大を防ぎ、ユーザーエクスペリエンスへの悪影響を最小限に抑えることができます。
  5. ステージング環境でのテスト
    コードベースへのあらゆる変更は、まずステージングディストリビューションにデプロイされます。これにより、テストチームは新しい変更に対して包括的なテストを行えます。テストが完了すると、変更内容をステージングディストリビューションから本番ディストリビューションにコピーできます。もしくは、アクティブな環境からアイドルな環境にトラフィックをリダイレクトして、アイドルな環境を新しい本番環境とすることもできます。このアプローチでは、本番環境に展開する前の新しいコードベースに対して、徹底的なテストや検証を実施できます。テスト中に発生したあらゆる問題は、アイドル環境で対処や解決がなされ、本番環境への影響を最小限に抑えることができます。

はじめに

CloudFront の継続的デプロイをセットアップするために、CloudFront マネジメントコンソール、AWS CloudFormationAWS SDK 、または AWS コマンドラインインターフェイス(AWS CLI) を使用して、既存のディストリビューションの新しいステージングディストリビューションの作成から始めることができます。新しいステージングディストリビューションが作成されると、希望する変更を適用できるようになり、重みベースやヘッダーベースのようなステージングポリシーを設定して、新しいディストリビューションに対するトラフィックを段階的に増やせます。

ステージングディストリビューションが期待通りに動作していることを検証した後、変更内容をメインのディストリビューションにコピーするか、このディストリビューションをプライマリディストリビューションへと昇格させることができます。このプロセスは変更のシームレスかつコントロールされたデプロイを可能とし、エンドユーザーへの影響を最小限に抑えることができます。

ソリューションの概要

サンプルソリューションは、1つの Amazon Simple Storage Service(Amazon S3) オリジンの CloudFront ディストリビューションをデプロイします。また、プライマリディストリビューションへ変更を安全にテストしリリースするために、ステージングディストリビューションを用いた昇格の設定を行えます。推奨されるソリューションとしては、 CloudFront ディストリビューションの設定変更のために、継続的デプロイを有効にした AWS Cloud Development Kit(AWS CDK)パイプライン を実装することです。

1. AWS CDK Pipeline は、プライマリディストリビューション、ステージングディストリビューション、Amazon S3 オリジン、およびデプロイメントポリシーの作成を手助けします。
2. AWS Step Functions ワークフローは、以下のアクションを実行する CloudFront API の呼び出しをオーケストレーションする責務があります。

a. 継続的デプロイポリシーを有効化し、プライマリディストリビューションに紐づける
b. 最新のステージングの設定でプライマリディストリビューションを更新する

このソリューションの一部では、Amazon S3 オリジンを持つ CloudFront ディストリビューションのデプロイと、変更のテストやプライマリディストリビューションへの昇格を目的としたステージングディストリビューションの設定を行います。

AWS CDK Pipeline を使用して Amazon S3 オリジンの CloudFront ディストリビューションをデプロイし、プライマリディストリビューションへの変更をテストしてプロモートするようにステージングディストリビューションを設定するソリューション

リファレンスソリューション

リファレンスソリューションの GitHub リポジトリはこちら です。

実装の詳細

ステップバイステップで実装の詳細を示すと以下のようになります。

1. cdk deploy コマンドによるパイプラインスタックの作成
2. プライマリディストリビューションに対して変更をリリース

a. プライマリディストリビューションのスタックを更新して、ディストリビューションの設定を変更します。変更内容をコードリポジトリにコミットします。
b. リポジトリへのコードのコミットがパイプラインをトリガーします。
c. パイプラインはプライマリディストリビューションに対して変更のデプロイを行う一連のステージを実行します。

3. CloudFront の継続的デプロイを使用した継続的デプロイのワークフロー

a. プライマリディストリビューションがデプロイされて有効になると、パイプラインを継続的デプロイモードに更新することで、ディストリビューションへのあらゆる変更がブルー/グリーンデプロイもしくは Canary デプロイを使用してリリースされます。
b. 継続的デプロイはパイプラインコード内のフラグを更新することで有効化できます。これはステージングディストリビューションを使用して変更を昇格させます。
c. パイプラインでは SingleHeader トラフィック設定またはブルー/グリーンデプロイを使用します。パイプラインコード内のフラグを更新することで SingleWeight トラフィック設定を使用するように更新することもできます。
d. SingleWeight を選択した場合、リクエストを同じ CloudFront ディストリビューションで処理しながらユーザーに同じ体験を提供しつづけるための session stickiness の設定を選択できます。
e. ディストリビューションの設定に変更を加え、リポジトリにコミットします。
f. リポジトリへの変更のコミットがパイプラインをトリガーします。変更を反映したステージングディストリビューションと、ヘッダーベースまたはウェイトベースによるトラフィックの振り分けを含んだデプロイメントポリシーが作成されます。
g. Step Functions をパイプラインのステップとして実行することにより、継続的デプロイポリシーのプライマリディストリビューションへのアタッチまたはリンクが行われます。 ディストリビューションにデプロイメントポリシーをアタッチするため、Step Functions はデプロイメントポリシーを有効にし、プライマリディストリビューションを更新します。
h. パイプラインは、ステージングディストリビューションでの変更をプライマリディストリビューションに昇格する前に、手動での承認を待ちます。
i. 検証した後、パイプラインではステージングの変更を含んだプライマリディストリビューションへの更新を承認する必要があります。これにより、変更がリリースされます。変更をリリースするために、パイプラインは Step Functions を実行します。 CloudFront API を呼び出し、プライマリディストリビューションをステージングの設定で更新します。

まとめ

CloudFront の継続的デプロイは、最小限のリスクと最大の効率性でソフトウェアの更新をリリースするための強力なツールです。CloudFront の継続的デプロイが利用可能になったことで、ソフトウェアリリースの速度と信頼性をさらに向上させることができます。CloudFront のエッジサーバーのグローバルネットワークを活用することで、デプロイメントが世界中のユーザーに素早くかつ簡単に展開され、一貫したユーザーエクスペリエンスを保ち、ダウンタイムを最小限に抑えるられるようになりました。

本記事は「Achieving Zero-downtime deployments with Amazon CloudFront using blue/green continuous deployments」の翻訳となります。
このブログの翻訳はプロフェッショナルサービスの 鈴木(隆) が担当しました。