助け合いフォーラム

AWS

AWS ソリューションアーキテクト - アソシエイト(SAA-C03)
問題ID : 49250
問題を開く
ある企業は輸送管理システムを開発しており、EKS上で複数のマイクロサービス(経路計算API、集荷依頼API、請求照会APIなど)を稼働させている。外部の取引先企業の業務システムがインターネット経由でHTTPSで接続し、リクエストのURIパスに応じて適切なマイクロサービスに振り分けられる必要がある。今後マイクロサービスの数が増えた場合でも、外部エンドポイントを増やさずに一貫したアクセスを提供しながら、運用負荷を考慮して効率的に実現する必要がある。どのアーキテクチャを採用するのが最も適切か。

正解

EKSクラスターにLoad Balancer Controllerを導入し、ALBを自動的にプロビジョニングして各リクエストをURIパスに基づいてルーティングする

解説

本設問では、外部の取引先がHTTPSで接続し、リクエストのURIパスに応じて適切なマイクロサービスに振り分けられる必要があります。この要件を満たすには、レイヤー7(アプリケーション層)のロードバランサーであるALBを利用するのが適切です。比較表にあるとおり、「ホストベースやパスベース、URLクエリ文字列でのルーティング」に対応しているのはALBだけであり、この要件を満たせる唯一のロードバランサーです。


AWS Load Balancer Controllerは、Amazon EKSやAmazon EC2上で動作するKubernetesコントローラーで、AWSのロードバランサーであるALBやNLBとKubernetesのリソース定義をつなぐツールです。EKSクラスターにLoad Balancer Controllerをデプロイすると、Kubernetes側で必要な設定を行うだけで自動的にALBやNLBがプロビジョニング・管理されます。アプリケーションを実行するPodの増減に応じてターゲット登録も更新されるため、利用者がロードバランサーを手作業で構築・運用する必要はありません。また、Kubernetes内にソフトウェアのロードバランサーを自前で用意する必要がなく、スケーリングや可用性の確保をAWSに任せられるため、運用がシンプルになり効率的に管理できます。

したがって、正解は
・EKSクラスターにLoad Balancer Controllerを導入し、ALBを自動的にプロビジョニングして各リクエストをURIパスに基づいてルーティングする
です。

それ以外の選択肢は、以下の通りです。

・EKSクラスターにLoad Balancer Controllerを導入し、NLBを自動的にプロビジョニングして各リクエストをURIパスに基づいてルーティングする
NLBは、レイヤー4のロードバランサーであり、TCP/UDPレベルの転送に特化しています。URIパスやホスト名といったアプリケーション層の情報に基づいたルーティングはできませんので、誤りです。

・CloudFrontを利用してリクエストをキャッシュし、オリジンにEKS上の各マイクロサービスを指定してURIパスごとの振り分けを行う
Amazon CloudFrontは、静的・動的コンテンツをグローバルに高速配信するためのコンテンツ配信ネットワークサービスです。主なユースケースはコンテンツ配信やキャッシュによるパフォーマンス向上であり、マイクロサービスごとのルーティングには適していません。よって、誤りです。

・API Gatewayでリクエストを受信し、バックエンドのLambda関数でURIパスを解析してEKS上の各マイクロサービスへ転送する
技術的に可能ですが、HTTPルーティングのためにLambdaを利用するのは過剰設計です。リクエスト数が多い場合は実行課金が増え、さらにレイテンシや同時実行制御の問題も発生します。本設問の要件である「コスト効率」や「運用負荷の低減」に反するため、誤りです。

学習テキスト

この学習テキストはプレミアムコンテンツです。 プレミアムプランへのお申込みは 「プレミアムプランの紹介ページ」 よりお願いいたします。

【負荷分散(ロードバランシング)】
サービスの利用者が増えてくると、単一のリソースでは全てのリクエストを処理しきれなくなり、結果としてレスポンスの遅延が起こります。このような場合、リクエストを処理するリソースを複数配置し、それらのリソースにリクエストの処理を分散することでレスポンスの遅延が発生しないようにできます。
このような仕組みを「負荷分散(ロードバランシング)」といいます。

【Elastic Load Balancing(ELB)】
Elastic Load Balancing(ELB)は、AWSが提供する負荷分散サービスです。マネージドサービスであり、ユーザーは負荷分散機能を利用する際にアプリケーションのインストールやバージョンアップなどを考慮する必要がありません。

ELB配下の負荷分散先リソースのことを「ターゲット」といい、一つのELB配下で管理されるターゲットの集合を「ターゲットグループ」といいます。ターゲットにはインスタンス、IPアドレス、Lambda関数を指定できます。ターゲットグループ単位で負荷分散を行い、適切なターゲットにリクエストがルーティングされるようになります。
ターゲットは、可用性を向上させるためにマルチAZ(複数のAZに配置する構成)にするのが一般的です。これにより一部のAZに障害が発生した場合でも、他のAZに配置されたターゲットで引き続きリクエストが処理されます。また、ELB自体もマルチAZ構成で動作するので、高い可用性と冗長性を確保できます。

【ELBの種類】
ELBにはロードバランシングの方式によって複数の種類があります。

■Application Load Balancer(ALB)
・レイヤー7(アプリケーション層)で負荷分散を行う
・HTTP、HTTPS、gRPCベースのルーティングをサポート
・ホストベースやパスベース、URLクエリ文字列でのルーティングなど高度なルーティング機能を提供する
・WebSocketや同一インスタンス内の複数ポートへの負荷分散に対応

○ALBが対応している主なルーティング
・ホストベース
ホストベースのルーティングとは、クライアントがリクエストした接続先URLのFQDN(Fully Qualified Domain Name:完全修飾ドメイン名)に従ってルーティングできる機能のことです。例えば、クライアントの接続先URLが「http://www1.example.com」の場合はWebサーバー1にアクセスさせて、「http://www2.example.com」の場合はWebサーバー2にアクセスさせることができます。

・パスベース
パスベースのルーティングとは、クライアントがリクエストした接続先URLのパスに従ってルーティングできる機能のことです。例えば、クライアントの接続先URLが「http://www.example.com/web1/」の場合はWebサーバー1にアクセスさせて、「http://www.example.com/web2/」の場合はWebサーバー2にアクセスさせることができます。

・URLクエリ文字列
URLクエリ文字列でのルーティングとは、クライアントがリクエストした接続先URLのクエリ文字列に従ってルーティングできる機能のことです。URLクエリ文字列とは、ブラウザがWebサーバーに送信するデータをURLに表記したものです。URLが「http://www.example.com/web?lang=jp」であれば「lang=jp」がURLクエリ文字列に該当します。
例えば、クライアントの接続先URLが「http://www.example.com/web?lang=jp」の場合は日本語サイトのあるWebサーバーにアクセスさせて、「http://www.example.com/web?lang=en」の場合は英語サイトのあるWebサーバーにアクセスさせることができます。

○WebSocket
一つのコネクション内で永続的にサーバー/クライアント双方からデータ送信できる技術です。通常のWebアプリケーションの場合、クライアントからのリクエストにサーバーがレスポンスを返して接続終了となりますが、WebSocketを使うと、一度接続したコネクションではクライアントからのリクエストがなくてもサーバー側からデータを送信できます。WebSocketはチャットや株価情報のような、リアルタイムな情報提供を必要とするアプリケーションで使用されます。

■Network Load Balancer(NLB)
・レイヤー4(トランスポート層)で負荷分散を行う
・TCP、UDP、TLSベースのルーティングをサポート
・高スループットかつ低レイテンシー(低遅延)で、数百万パケット/秒のトラフィック処理に対応
・WebSocketや同一インスタンス内の複数ポートへの負荷分散に対応

NLBはElastic IPアドレス(固定のパブリックIPアドレス)と関連付けることができます。これによりクライアントからNLB配下のサーバーに、NLBに関連付けられたElastic IPアドレスでアクセスできるようになります。サーバーへのアクセスをドメイン名ではなくIPアドレスで行いたい場合や、クライアントのアクセス先をIPアドレスで管理・制限している環境などで有用です。
Elastic IPアドレスと関連付けられるのはNLBのみですが、NLBのターゲットにALBを指定すると、クライアントからALB配下のサーバーにNLBのElastic IPアドレスでアクセスできるようになります。

■Classic Load Balancer(CLB)
・レイヤー7(アプリケーション層)およびレイヤー4(トランスポート層)で負荷分散を行う
・TCP、SSL/TLS、HTTP、HTTPSベースのルーティングをサポート
・旧世代のELBなので、機能や柔軟性の観点からALBやNLBの利用が推奨される

■Gateway Load Balancer(GWLB)
・レイヤー3(ネットワーク層)およびレイヤー4(トランスポート層)のトラフィックを対象とする
・すべてのIPトラフィックを透過的に処理する
・ファイアウォール、侵入検知・防止システム(IDS/IPS)などのサードパーティ製ネットワーク仮想アプライアンスをデプロイ、スケーリング、管理できる

[ELBの比較表]

【ELBの機能】
ELBには負荷分散に関する様々な機能があります。下記では代表的な機能を紹介します。

■ELBのヘルスチェック
ELBはターゲットグループ内の各ターゲットが正常に動作しているかを定期的にヘルスチェックで確認します。ターゲットから正常に応答が返ってくれば、ELBはそのターゲットへのルーティングを継続します。もしターゲットが異常であると判断された場合は、ELBはそのターゲットへのルーティングを停止します。

ELBのヘルスチェックにはターゲットの復旧機能が含まれていないため、稼働するターゲット数を維持するにはAuto Scalingを用いて自動的に復旧する設計が必要です。

[ヘルスチェックの主な設定項目]

■アクセスログ
ELBに送信されるリクエストを記録しログをAmazon S3に保存します。記録されたログはトラフィックの分析やコンプライアンスの監査に利用できます。アクセスログには、クライアントのアクセス日時、接続元IPアドレス、ポート番号、ステータスコードなどクライアントの接続情報が記録されます。

■ELB自身のスケーリング
ELBにはリクエスト数の増減に応じてELB自身が自動的にスケーリングする機能があります。リクエスト数が増加したらELB自身を自動的にスケールアウト(追加)し、リクエスト数が減少したらスケールイン(削除)して元の状態に戻ります。

■リダイレクト
ALBには、ALBに送られてきたリクエストを別のURLにリダイレクトする機能があります。例えば、ユーザーから「http://www.example.com」(HTTP)へ送られたリクエストを「https://www.example.com」(HTTPS)に変換することで、セキュアな通信が可能になります。
HTTPのリクエストをHTTPSに変換するには、ALBでHTTPリスナーを作成し、HTTPSへリダイレクトするルールを設定します。下記の図は、HTTPリスナーのルール設定の例です。

■スティッキーセッション
ALBではCookieベースのスティッキーセッションが利用可能です。これは、ユーザーのブラウザに保存されたCookieの値をもとに、ALBが後続のリクエストを同じEC2インスタンスにルーティングする仕組みです。たとえば、WebアプリケーションがセッションIDを含むCookieを発行しておけば、ALBは自身が発行する、または設定されたCookieの値をもとにターゲットを識別し同じインスタンスにルーティングできるため、インスタンスのローカルメモリに保存されたショッピングカートやログイン情報などのセッション状態を維持しやすくなります。

[スティッキーセッションの仕組み]

スティッキーセッションを利用すると、ユーザーごとにセッション情報を保持できるため利便性は向上しますが、アクセスが特定のユーザー群に偏ると、一部のインスタンスに過剰な負荷がかかり、全体のパフォーマンスに悪影響を及ぼすことがあります。そのため、スティッキーセッションの有効期限は、永続的にせず、必要最小限の期間に設定し、特定インスタンスへの張り付き状態を解消しやすくすることが推奨されます。

また、より信頼性の高いシステム構築を目指す場合は、スティッキーセッションを使用せずにセッション管理を行う方法も有効です。アプリケーション側でCookieを用いてセッションの識別のみを行い、ショッピングカートやログイン情報などのセッションデータは、ElastiCacheやDynamoDBなどの外部ストアに保存します。これにより、どのインスタンスにリクエストが振り分けられてもセッションを維持できるため、ALBのスティッキーセッション機能をオフにしても、インスタンス間で負荷を均等に分散しやすくなります。

【ELB経由の暗号化通信】
ELB経由でクライアントとターゲット間の通信を暗号化させるには、暗号化する通信の範囲とサーバー証明書(SSL/TLS証明書)の配置によって3つの方法があります。サーバー証明書とは、ユーザーとの通信をHTTPSで暗号化するとともに、ドメイン(ping-t.com など)の使用権を確認してアクセス先のサーバーが本物であることを証明する電子証明書のことです。ELB経由の暗号化通信に利用するサーバー証明書は、AWS Certificate Manager(SSL/TLS証明書を管理するサービス)で管理されている証明書を利用できます。

■クライアントとELB間の通信を暗号化する
○ELBにサーバー証明書を導入する
クライアントとELB間で通信を暗号化し、ELBとターゲット間は平文の通信(暗号化されていない通信)を行う方法です。クライアントとELB間での通信の暗号化・復号をELBが行うため、ターゲットに暗号化・復号による負荷が発生しません。すべてのELBが対応しています。

■クライアントとターゲット間の通信を暗号化する
○ELBとターゲットにサーバー証明書を導入する
クライアントとELB間、ELBとターゲット間で別の暗号化通信を行う方法です。暗号化接続はELBが終端となり、ELBから別の暗号化接続を確立して通信します。ELB、ターゲットに暗号化・復号による負荷がかかりますが、クライアントからターゲットまでの通信すべてを暗号化できます。ALB、CLBが対応しています。

○ターゲットにサーバー証明書を導入する
ELBでは暗号化・復号せず、直接クライアントとターゲット間で暗号化通信を行う方法です。ターゲットに暗号化・復号による負荷が発生しますが、ELBによる暗号化・復号の遅延を発生させずに通信全てを暗号できます。NLB、CLBが対応しています。

【SNIを利用したELB経由の暗号化通信】
通常のサーバー証明書は、一つのパブリックIPアドレスを持つサーバーに対して一つのドメイン名が紐づきます。例えば「example.com」と「example.co.jp」の2つのドメイン名を持つWebサーバーの場合、ドメイン名ごとに異なるパブリックIPアドレスを取得してサーバー証明書を導入する必要があります。しかしELBからドメイン名を複数持つWebサーバーへ通信を転送しようとすると、クライアントから見たWebサーバーのパブリックIPアドレスは窓口であるELBのパブリックIPアドレスしかないため、通常のサーバー証明書では対応できません。
SNI(Server Name Indication)は、暗号化通信で使用するサーバー証明書をパブリックIPアドレスではなくドメイン名によって判断する技術です。SNIに対応したELBに複数のサーバー証明書を導入すると、ELBが宛先ドメイン名から適切なサーバー証明書を判断してサーバーへ通信を転送します。SNIはALBとNLBが対応しています。

上に戻る

クラウドフロントの機能

投稿日 2025/11/10

「CloudFrontを利用してリクエストをキャッシュし、オリジンにEKS上の各マイクロサービスを指定してURIパスごとの振り分けを行う
Amazon CloudFrontは、静的・動的コンテンツをグローバルに高速配信するためのコンテンツ配信ネットワークサービスです。主なユースケースはコンテンツ配信やキャッシュによるパフォーマンス向上であり、マイクロサービスごとのルーティングには適していません。よって、誤りです」と、ありますが、URLのパスに応じて異なるオリジンサーバを指定することで1つのドメインで複数のサービスを提供できます。よって、この選択肢は正解とすべきです。

2025/11/12 02:27

確かに、CloudFrontはパスパターンによって異なるオリジンを指定できるため、1つのドメインで複数のサービスを提供すること自体は技術的に可能だと思います。ただ、設問では「運用負荷を考慮して効率的に実現すること」が明記されているので、マイクロサービスを追加するたびにCloudFrontのオリジンやビヘイビアを都度設定・更新し、ディストリビューション反映までを待つ運用は、やや手間がかかる印象です。そのため、技術的に成立する構成であっても、この要件のもとでは「最も適切な」選択肢とは言いにくいのではないかと思いました。


コメント

c chipalion

2025/11/12 11:06

Haru453様、ご回答ご解説ありがとうございます。運用負荷を考慮すると、やはりCloudfrontパスは選択肢は不適切と納得できました。

この返信に対して
コメントを記入できます

この投稿に対して返信しませんか?