こんにちは。皆さんはアプリケーションのデリバリーを安全に行えていますか?最近はビジネスシーンの変化が激しく、ソフトウェア製品のアップデートや新機能のリリースなど、開発スピードが求められるケースが増えてきました。しかし、開発スピードを重視するあまり、セキュリティリスクへの対策がおろそかになっては本末転倒です。
本記事では、AWSのコンテナサービスであるAmazon ECSを用いて、アプリケーションのデリバリーを安全に行うための方法論と、具体的な実装方法について解説していきます。
まず、安全なアプリケーションデリバリーとは何でしょうか?アプリケーションデリバリーとは、開発したアプリケーションをユーザーが利用できるように、本番環境に配置し、公開するプロセス全体を指します。しかし、このプロセスにおいては、バグの混入や予期せぬ障害が発生するリスクが常に付きまといます。
もちろん、コードレビューや検証環境でのテストなど、事前にリスクを最小限に抑える努力は必要です。しかし、それでも完全にリスクを排除することはできません。
安全なアプリケーションデリバリーとは、障害などの意図しない状況が発生した場合の影響範囲を最小限に抑え、ユーザーへの影響を最小限に抑えることを目指す取り組みと言えます。
安全なアプリケーションデリバリーを実現するために、新機能を段階的に公開する方法は、主に以下の2つがあります。
これらの方法はどちらも、トラフィックをコントロールすることで新機能を段階的に公開するという点では共通していますが、トラフィックの移行パターンが異なります。
デプロイ方法 | 説明 |
---|---|
線形デプロイ(Linear Deploy) | 新バージョンにアクセスするトラフィックの比率を線形に増やしていく方法 |
カナリーデプロイ(Canary Deploy) | 少数のトラフィックを新バージョンにルーティングし、問題がないことを確認した後に、残りのトラフィックを一括で新バージョンに移行する方法 |
線形デプロイとカナリーデプロイは、アプリケーションの前段にロードバランサーなどを配置し、トラフィックを制御することで、新機能を段階的に公開する方法です。
例として、スポーツの実況サービスを構築するケースを考えてみましょう。このサービスでは、ユーザーがインターネットを経由してアクセスし、ELB (Application Load Balancer) を通じてアプリケーションにリクエストを送信します。
線形デプロイでは、新バージョンへのトラフィックの比率を段階的に増加させていきます。例えば、10%ずつトラフィックを新バージョンに移行していく場合、次のような流れになります。
カナリーデプロイでは、少数のトラフィックを新バージョンにルーティングし、動作確認を行い問題がないことを確認してから、残りのトラフィックを一括で新バージョンに移行します。
線形デプロイとカナリーデプロイは、ワークロードに応じて使い分けることができます。慎重に状況を見ながらデプロイしたい場合は線形デプロイ、ある程度のスピードを重視したい場合はカナリーデプロイを選択するといった形です。
Amazon ECSでは、ELB (Elastic Load Balancing) と連携することで、線形デプロイやカナリーデプロイを実現することができます。ELBは、1つのリスナーに対して、複数のターゲットグループ(アプリケーションの塊)を設定することができます。
ELBは、それぞれのターゲットグループに重み付けをして、リスナーが受けたリクエストを振り分けることができます。例えば、既存バージョンのアプリケーションに80、新バージョンに20といった重みを設定することができます。
また、ELBでは、ターゲットグループレベルのスティッキーセッション(振り分けの維持)を設定することができます。例えば、スティッキーセッションの維持時間中に新バージョンのターゲットグループにルーティングされたユーザーは、その時間中は新バージョンにルーティングされ続けるという振り分けの維持も設定できます。
機能フラグは、ユーザーからのリクエストに含まれる特定の属性(例えばユーザーIDなど)に基づいて、新機能を段階的に公開する方法です。
例えば、電子書籍の販売サービスにおいて、新機能を段階的に公開したい場合、次のような流れになります。
このように、機能フラグを利用することで、アプリケーションコードを書き換えることなく、機能のON/OFFを切り替えることができます。
Amazon ECSで機能フラグを利用するには、アプリケーションの外部で機能フラグを管理するためのコンポーネントが必要です。
本記事では、AWS AppConfigを利用して機能フラグを管理する方法を紹介します。AWS AppConfigは、機能フラグの保存や取得を簡単に行うことができます。
また、AWS AppConfigでは、アプリケーションからAWS AppConfigのAPIを直接叩いて値を取得する必要はなく、アプリケーションの代わりにAppconfig Agentというコンテナ化されたエージェントが値の取得を行ってくれます。
Amazon ECSでは、このAppconfig Agentをサイドカーコンテナとして追加することで、簡単に機能フラグの利用環境をセットアップすることができます。
新機能を段階的に公開する際には、問題が発生した場合に備えて、ロールバックを自動化する仕組みも重要です。
例えば、バージョン2のアプリケーションをデプロイしたものの問題があり、バージョン1にロールバックしたとしましょう。しかし、バージョン2では書き込みをJSON形式で行うように変更されていたため、バージョン1のアプリケーションでは、JSONファイルを読み込むことができず、問題が発生する可能性があります。
このように、ロールバックの前後で破壊的な変更を含まないようにすることが重要です。
Amazon ECSでは、AWS CodeDeployと連携することで、自動ロールバックを組み込むことができます。
AWS CodeDeployでは、デプロイ戦略として、2フェーズデプロイと呼ばれる段階的なデプロイを定義することができます。
このデプロイ戦略では、ロールバックのトリガーとして、どのCloudWatchアラームを使うのかという設定ができます。
例えば、新バージョンのアプリケーションの信頼性を測るメトリクスをAmazon CloudWatchに発行しておき、そのターゲットとなるCloudWatchアラームも作成しておきます。新バージョンで問題が発生し、メトリクスにその状況が反映され、CloudWatchアラームがアラーム状態になった場合に自動でロールバックするように設定できます。
本記事では、AWSコンテナサービスから考える安全なアプリケーションデリバリーというテーマで解説を行いました。特に、Amazon ECSで安全にアプリケーションをデプロイするための具体的な方法として、以下の3つのアプローチを紹介しました。
これらのアプローチを組み合わせることで、より安全で信頼性の高いアプリケーションデリバリーを実現できます。
安全なアプリケーションデリバリーは、開発スピードを重視する現代において非常に重要です。本記事の内容が、皆様のアプリケーションデリバリープロセスを改善する一助となれば幸いです。
AWSモダナイズ・スモールスタート開発支援、基幹業務システムのUI.UX刷新はお気軽にお問い合わせください。
スモールスタート開発支援、サーバーレス・NoSQLのことなら
ラーゲイトまでご相談ください
低コスト、サーバーレスの
モダナイズ開発をご検討なら
下請け対応可能
Sler企業様からの依頼も歓迎