DEVELOPER’s BLOG

技術ブログ

Amazon ECSから考える安全なアプリケーションデリバリー

2024.08.26 鈴木 萌子
AWS
Amazon ECSから考える安全なアプリケーションデリバリー

はじめに

AWSにてデプロイのリスクを緩和するにあたり「Well-Architected Framework 運用上の優秀性」への考慮は大変重要です。 今回は、AWS Summit Japan「Amazon ECSから考える安全なアプリケーションデリバリー」をベースに、デプロイのリスクを緩和する方法をご紹介いたします。


目次

  • 安全なアプリケーションデリバリーとは
  • 線形デプロイ/Canaryデプロイ
  • 機能フラグ(Feature Flag)
  • 自動ロールバックの必要性
  • まとめ


安全なアプリケーションデリバリーとは

AWSの定義する「安全なアプリケーションデリバリー」とは意図しない障害が発生した際の影響範囲を最小限にすることです。 残念ながら、システムを運用する上で、意図しない障害が発生する可能性をゼロにすることはできません。 だからこそ「いかに影響範囲を最小限にするか?!」に着目すべきなのだと思います。


いかに影響範囲を最小限にするか?

AWSはこの課題を解決するためにデリバリーによる新機能の公開を少数のユーザから段階的に行う手法を推奨しています。


新機能を段階的に公開する手法

  1. 線形デプロイ/Canaryデプロイ
  2. 機能フラグ(Feature Flag)


それでは、それぞれの手法を詳しく見ていきたいと思います。


1. 線形デプロイ/Canaryデプロイ

線形デプロイおよびCanaryデプロイとは、ユーザからのトラフィックの一部分のみを新バージョンのアプリケーションへアクセス許可する手法です。

pasted-2024.07.09-18.01.06.png


線形とCanaryの違い

線形デプロイ
線形デプロイとは、デリバリーされた新機能にアクセス許可するトラフィックの比率を10% → 20% → 30%...と線形的に増やし、正常性確認を慎重に行う手法です。

Canaryデプロイ
Canaryデプロイとは、デリバリーされた新機能にアクセス許可するトラフィックの比率を10%程度の少数に定め、その小規模なトラフィックに対して正常性が確認でき次第、全てのトラフィックを新機能にアクセス許可する慎重かつ大胆な手法です。


線形/CanaryデプロイのAmazon ECSでの実践

それでは、線形デプロイ/CanaryデプロイのAmazon ECSでの実践について詳しく見ていきたいと思います。


必要となるAWSのリソース

  • AWS ALB
    → ユーザからのトラフィックの一部を新バージョンのアプリケーションにルーティングさせる役割
  • Amazon ECS
    → 現バージョンで稼働させているアプリケーションはそのまま稼働させつつ新バージョンのアプリケーションも追加で稼働させる役割
  • AWS CodeDeploy
    → 線形デプロイ/Canaryデプロイの司令塔
    → AWS ALBにおけるトラフィックの比率管理およびAmazon ECSにおけるサーバの並行稼働を実現する役割

pasted-2024.07.09-18.03.16.png


フロー

  1. 新バージョンのアプリケーションをデプロイ
    → AWS CodeDeployがAmazon ECSに自動でデプロイ
  2. ユーザからのトラフィックの一部を新バージョンのアプリケーションにルーティング
    → AWS CodeDeployがAWS ALBのトラフィックの比率を自動で変更
  3. 全てのユーザからのトラフィックを新バージョンのアプリケーションにルーティング
    → AWS CodeDeployがAWS ALBのトラフィックの比率を自動で変更
  4. 現バージョンのアプリケーションを停止
    → AWS CodeDeployがAmazon ECSを自動で停止


上記のようなフローで、線形デプロイ/CanaryデプロイをAmazon ECSにて実践することができます。


ALBの仕組み

AWS ALBはターゲットグループと重み(トラフィックの比率)を設定することができます。
例えば、現バージョンのターゲットグループに80%の重みを、新バージョンのターゲットグループに20%の重みを設定します。 そうすることで、ユーザからのトラフィックの一部分のみを新バージョンのアプリケーションへアクセス許可することが可能です。 しかしながら、その設定だけではユーザの割り当て先が毎回バラバラになってしまう課題が残ります。
そこで登場するのが、AWS ALBの機能の内の1つであるスティッキーセッションです。


スティッキーセッション
セッションが有効な間、クライアントとサーバーを常に一対一で接続させる役割


スティッキーセッションを利用することで、ユーザの割り当て先を固定し、線形/CanaryデプロイのAmazon ECSでの実践を可能にします。


2. 機能フラグ(Feature Flag)

機能フラグ(Feature Flag)とは、特定の属性を持つユーザからのトラフィックのみに対して新バージョンのアプリケーションへアクセス許可する手法です。 具体的には、アプリケーションコードに「機能フラグがONの場合にのみ実行されるロジック」を組み込み、機能フラグのON/OFFによりアプリケーションの振る舞いを切り替えます。


補足 : フラグ(Flag)とは、ONかOFFのどちらの状態かを判断するために使用する変数です。


アプリケーションコードに組み込むロジック

987178efe999f29749c640823355fdac838ceaef.png

ユーザからのトラフィックの情報に含まれるuserID(Flag)が、機能フラグ(FlagGroup)に含まれている場合にのみ、新機能へのルーティングがONになります。 これにより、ユーザID単位での新機能へのON/OFFを制御することが可能になります。


機能フラグ(Feature Flag)のAmazon ECSでの実践

それでは、機能フラグ(Feature Flag)のAmazon ECSでの実践について詳しく見ていきたいと思います。


必要となるAWSのリソース

  • AWS AppConfig
    → 機能フラグを管理する役割
    → アプリケーションコードに組み込むロジックの保存や配布を簡素化する役割
  • Amazon ECS
    → 機能フラグを定期的に取得するためのサイドカーコンテナ(AppConfigエージェント)を稼働させる役割
  • AppConfigエージェント(サイドカーコンテナ)
    → アプリケーションの代わりに機能フラグを定期的に取得する役割
    → アプリケーションが直接的にAWS AppConfigを叩く必要がなくなり、アプリケーションコードをよりシンプルに書くことが可能

pasted-2024.07.09-18.05.02.png


フロー

  1. 新機能を含むアプリケーションコードを本番環境にデプロイ
    → AWS AppConfigに保存されている機能フラグはOFFの状態
  2. 新機能を公開したい一部のユーザに対して機能フラグをONに変更
    → AWS AppConfigに保存されている機能フラグの値を更新
  3. 機能フラグがアプリケーションに反映され一部のユーザに新機能が公開
    → AppConfigエージェント(サイドカーコンテナ)が非同期で機能フラグの値を取得しアプリケーションに反映
  4. 全てのユーザに対して機能フラグをONに変更し、全体のユーザに新機能が公開


上記のようなフローで、機能フラグをAmazon ECSにて実践することができます。


自動ロールバックの必要性

ここまで、線形/Canaryデプロイと機能フラグについて見てきましたが、ここで自動ロールバックについて考えます。 線形/Canaryデプロイや機能フラグによる新機能の段階的公開では、問題が確認されたタイミングでロールバックを実施する必要があります。 もし、ロールバック作業が手動である場合、せっかく確保できた時間リソースを無駄にしてしまうことになります。


そこで登場するのが自動ロールバックです。


自動ロールバックのAmazon ECSでの実践

それでは、自動ロールバックのAmazon ECSでの実践について見ていきたいと思います。


必要となるAWSのリソース

  • Amazon CloudWatch
    → AWS CodeDeployとAWS AppConfigと連携しALARM状態を伝達する役割
  • Amazon ECS
    → 新バージョンのアプリケーションからメトリクスを発行する役割
  • AWS CodeDeploy & AWS AppConfig
    → AWS CloudWatchのALARM状態時に自動でロールバックをする役割

pasted-2024.07.09-18.07.09.png

フロー

  1. 常時発行されるメトリクスに対してしきい値を設定
    → Amazon ECSから常時発行されるメトリクスに対してAmazon CloudWatchアラームを作成
  2. しきい値を超えた場合のみ旧アプリケーションへの自動ロールバックを実行
    → AWS CodeDeploy & AWS AppConfigがAmazon CloudWatchのALARM状態を検知し自動ロールバックを実行


補足 : Amazon CloudWatchのデフォルト機能だけでは自動ロールバックをすることはできません。そのため、上記のようなアラームの作成が必要とされます。


上記のようなフローで、自動ロールバックをAmazon ECSにて実践することができます。


まとめ

ここまで「Amazon ECSから考える安全なアプリケーションデリバリー」について見てきました。 デプロイのリスクを緩和する方法のイメージは湧きましたでしょうか?


AWS CodeDeployやAWS App Configなど、マネージドなリソースを利用することで時間リソースを確保するだけではなく、オペレーションミスなどによるインシデントを未然に防ぐことができます。 AWSにおいて、アプリケーションのデリバリー頻度を上げつつ、そのデリバリーを安全に行いたい想いを持つエンジニアの方々には、ぜひ利用を試みていただきたいです! ご精読いただき、ありがとうございました。

関連記事

Amazon RDSのコスト最適化:効率的なデータベース運用で50%のコスト削減に成功!

目次 背景 コスト削減のための分析 解決策 結果   背景 Amazon RDS(Relational Database Service)は、多くの企業で利用されるマネージド型データベースサービスです。高可用性や自動バックアップなどの機能を備えており、運用管理の負担を軽減しますが、使い方によってはコストが膨らみ、企業のIT予算を圧迫する原因となります。 当社でもRDSのコスト最適化に取り組み、その結果、利用コストを最大で50%削減することに成功しました

記事詳細
Amazon RDSのコスト最適化:効率的なデータベース運用で50%のコスト削減に成功!
AWS SRE
AWS Organizationsから考えるマルチアカウント戦略

はじめに AWSのアカウント管理を実施するにあたり「Well-Architected Framework」への考慮は必要不可欠です! 私たちAWSユーザは、AWS Organizationsを利用したマルチアカウント戦略の実践を、AWSからベストプラクティスとして推奨されています。 今回は、AWS Organizationsを利用したマルチアカウント戦略の実践により、AWSアカウント管理でよくある課題を解決する方法をいくつかご紹介いたします。 目次 AWS

記事詳細
AWS Organizationsから考えるマルチアカウント戦略
AWS SRE
AWSコスト削減を叶える18個のチェック項目

はじめに 今回は、アクセルユニバースのインフラエンジニアがAWSアカウントのコスト削減を実施する際に利用しているチェックリストをご紹介いたします。 AWSコスト削減チェックリスト 私たちアクセルユニバースのAWSコスト削減チェックリストは チェック対象リソース/サービス コスト削減観点(状態) 手段 の3つの項目から構成されています。 私たちインフラエンジニアはこのチェックリストを元に「クラウド支出の最適化(FinOps)」におけるコストの最適化を実践して

記事詳細
AWSコスト削減を叶える18個のチェック項目
AWS SRE
AWSにてクラウド財務管理(CFM)を実践するための3つのミッション

はじめに AWSのコスト管理を実施するにあたり「Well-Architected Framework コスト最適化の柱」への考慮は欠かせません! その中でも「クラウド財務管理(CFM)」の実装は特に重要です! 今回は、そのクラウド財務管理(CFM)を実践するためにクリアすべきミッションを3つご紹介いたします。 目次 クラウド財務管理(CFM)とは? ミッション① : コストの可視化 ミッション② : コストの最適化 ミッション③ : コストの計画・予測の確

記事詳細
AWSにてクラウド財務管理(CFM)を実践するための3つのミッション
AWS

お問い合わせはこちらから