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において、アプリケーションのデリバリー頻度を上げつつ、そのデリバリーを安全に行いたい想いを持つエンジニアの方々には、ぜひ利用を試みていただきたいです! ご精読いただき、ありがとうございました。

関連記事

AWS Network Firewall:シンプルな非機能要件に対して、過剰な設計をしていませんか?

はじめに シナリオ:ネットワーク制御要件を満たすための設計 適材適所の判断をする コスト最適化の視点 まとめ はじめに AWSでは、あらゆるユースケースを支える豊富なサービス群が提供されています。 しかし、その選択肢の多さゆえに「本当に必要な要件以上のサービスを導入してしまう」ケースも少なくありません。 特に、非機能要件に対して、必要以上に複雑な構成を採用してしまうと、以下のようなデメリットにつながることがあります。 AWSコ

記事詳細
AWS Network Firewall:シンプルな非機能要件に対して、過剰な設計をしていませんか?
AWS SRE
5分で分かる。Amazon CloudFrontによるAWSコスト削減術

はじめに 1. EC2 × ALB × CloudFront でインフラコストを削減 2. API Gateway × Lambda × CloudFront で動的コンテンツでもコスト最適化 3. 単一リージョン × CloudFront でグローバル配信をシンプルに まとめ:CloudFrontは単なる「CDN」ではない! はじめに AWSでシステムを構築する時、「とりあえずEC2インスタンスを建てて終わり」としていませんか?もし

記事詳細
5分で分かる。Amazon CloudFrontによるAWSコスト削減術
AWS SRE
AWSマルチアカウント環境でのOS・パッチ・証明書の統合管理

はじめに SSM統合コンソールによる一元管理 OSなど構成情報の可視化 Patch Managerによるパッチ運用の標準化 証明書有効期限の集中監視と自動通知 導入効果と業務改善イメージ 導入時の設計上の留意点 継続的改善を支える「運用の仕組み化」 1.はじめに クラウド活用が拡大し、AWS環境が複数アカウントで利用されたり、複数システムにまたがって利用されることは、システム運用における構成の一貫性を維持することの難易度を

記事詳細
AWSマルチアカウント環境でのOS・パッチ・証明書の統合管理
AWS SRE コラム
AWSの可用性設計を考える:AZ・リージョン・事業継続計画(BCP)のバランス

はじめに 可用性設計の基礎:リージョンとAZの仕組みを理解する 止まらない設計を妨げる単一点障害:単一AZ構成の限界 マルチAZ構成:同一リージョン内での止まらない仕組み マルチリージョン構成:事業継続(BCP)のための冗長化 まとめ:設計段階で「どこまで止めないか」を決めよう 1. はじめに AWSは、数クリックで仮想サーバー(EC2)を立ち上げられるなど、手軽にサービスを構築できるクラウドです。システム企画や開発の初期段階では

記事詳細
AWSの可用性設計を考える:AZ・リージョン・事業継続計画(BCP)のバランス
AWS コラム

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