翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
セルベースのアーキテクチャ用にサーバーレスセルルーターを設定する
作成者: Mian Tariq (AWS) と Ioannis Lioupras (AWS)
コードリポジトリ: Serverless-Cell-Router | 環境:PoC またはパイロット | テクノロジー: サーバーレス、コンテンツ配信、インフラストラクチャ |
ワークロード: オープンソース | AWS サービス: Amazon API Gateway、AWSCLI、AWS CloudFormation、Amazon CognitoAmazon DynamoDBAWSLambda、Amazon S3、AmazonSQS、AWSStep Functions |
[概要]
グローバルセルベースのアプリケーションのシステムへのエントリポイントとして、セルルーターはユーザーを適切なセルに効率的に割り当て、ユーザーにエンドポイントを提供する責任があります。セルルーターは、マッピングの保存 user-to-cell、セル容量のモニタリング、必要に応じて新しいセルのリクエストなどの機能を処理します。中断が発生する可能性がある間は、セルルーターの機能を維持することが重要です。
このパターンのセルルーター設計フレームワークは、耐障害性、スケーラビリティ、全体的なパフォーマンスの最適化に焦点を当てています。このパターンは静的ルーティングを使用し、クライアントは初回ログイン時にエンドポイントをキャッシュし、セルと直接通信します。このデカップリングは、セルルーターの障害発生時にセルベースのアプリケーションの中断のない機能を確保できるようにすることで、システムの耐障害性を向上させます。
このパターンは、 AWS CloudFormation テンプレートを使用してアーキテクチャをデプロイします。テンプレートのデプロイの詳細、または を使用して同じ設定をデプロイするには AWS Management Console、「追加情報」セクションを参照してください。
重要: このパターンで示されているデモンストレーション、コード、 AWS CloudFormation テンプレートは、説明のみを目的としています。提供されるマテリアルは、設計パターンを説明し、理解を支援する目的のみを目的としています。デモとコードは本番稼働用ではないため、ライブ本番稼働アクティビティには使用しないでください。本番環境でコードまたはデモを使用しようとすることは強くお勧めせず、お客様の責任となります。このパターンまたはそのコンポーネントを本番環境に実装する前に、適切な専門家に相談し、徹底的なテストを実行することをお勧めします。
前提条件と制限
前提条件
アクティブな Amazon Web Services (AWS) アカウント
(AWS Command Line InterfaceAWS CLI) の最新バージョン
AWS CloudFormation スタック、 AWS Lambda 関数、および関連リソースを作成するために必要なアクセス許可を持つAWS 認証情報
製品バージョン
Python 3.12
アーキテクチャ
次の図は、セルルーターの大まかな設計を示しています。
図は、以下のワークフローをステップスルーします。
ユーザーは、セルルーターAPIエンドポイントのフロントとして機能する Amazon API Gateway に連絡します。
Amazon Cognito は認証と認可を処理します。
AWS Step Functions ワークフローは、次のコンポーネントで構成されます。
Orchestrator - は、
Orchestrator
AWS Step Functions を使用してワークフローまたはステートマシンを作成します。ワークフローは、セルルーター によってトリガーされますAPI。は、リソースパスに基づいて Lambda 関数Orchestrator
を実行します。ディスパッチャー -
Dispatcher
Lambda 関数は、登録された新しいユーザーごとに 1 つの静的セルを識別して割り当てます。この関数は、ユーザー数が最も少ないセルを検索し、ユーザーに割り当てることで、エンドポイントを返します。マッパー ‒
Mapper
オペレーションは、 user-to-cell AWS CloudFormation テンプレートによって作成されたRoutingDB
Amazon DynamoDB データベース内のマッピングを処理します。トリガーされると、Mapper
関数は、既に割り当てられたユーザーにエンドポイントを提供します。Scaler -
Scaler
関数は、セルの占有率と使用可能な容量を追跡します。必要に応じて、Scaler
関数は Amazon Simple Queue Service (Amazon SQS) を介して Provision and Deploy レイヤーにリクエストを送信して、新しいセルをリクエストできます。Validator ‒
Validator
関数はセルエンドポイントを検証し、潜在的な問題を検出します。
は、セル情報と属性 (APIエンドポイント、 AWS リージョン状態、メトリクス)
RoutingDB
を保存します。セルの使用可能な容量がしきい値を超えると、セルルーターは Amazon 経由でプロビジョニングおよびデプロイサービスSQSを要求して新しいセルを作成します。
新しいセルが作成されると、 RoutingDB
はプロビジョニングおよびデプロイレイヤーから更新されます。ただし、このプロセスはこのパターンの範囲を超えています。セルベースのアーキテクチャ設計の前提の概要と、このパターンで使用されるセルルーター設計の詳細については、「追加情報」セクションを参照してください。
ツール
AWS のサービス
Amazon API Gateway は、、、および をあらゆる規模で作成、公開REST、維持、モニタリングHTTP、 WebSocket APIs保護するのに役立ちます。
AWS CloudFormation は、 AWS リソースをセットアップし、迅速かつ一貫してプロビジョニングし、 AWS アカウント および のライフサイクル全体を通じてリソースを管理するのに役立ちます AWS リージョン。
Amazon Cognito は、ウェブおよびモバイルアプリの認証、認可、ユーザー管理を提供します。
Amazon DynamoDB は、高速で予測可能でスケーラブルなパフォーマンスを提供するフルマネージドの NoSQL データベースサービスです。
AWS Lambda は、サーバーのプロビジョニングや管理を行うことなくコードを実行できるコンピューティングサービスです。必要に応じてコードを実行し、自動的にスケーリングするため、課金は実際に使用したコンピューティング時間に対してのみ発生します。
Amazon Simple Storage Service (Amazon S3) は、任意の量のデータを保存、保護、取得する上で役立つクラウドベースのオブジェクトストレージサービスです。
Amazon Simple Queue Service (Amazon SQS) は、安全で耐久性があり、利用可能なホストキューを提供し、分散ソフトウェアシステムとコンポーネントの統合と分離に役立ちます。
AWS Step Functions は、Lambda 関数とその他を組み合わせてビジネスクリティカルなアプリケーション AWS のサービス を構築するのに役立つサーバーレスオーケストレーションサービスです。
その他のツール
「Python
」は汎用のコンピュータープログラミング言語です。
コードリポジトリ
このパターンのコードは、 GitHub Serverless-Cell-Router
ベストプラクティス
セルベースのアーキテクチャを構築する際のベストプラクティスについては、以下の AWS Well-Architected ガイダンスを参照してください。
エピック
タスク | 説明 | 必要なスキル |
---|---|---|
サンプルコードリポジトリをクローンします。 | Serverless-Cell-Router GitHub リポジトリをコンピュータにクローンするには、次のコマンドを使用します。
| 開発者 |
AWS CLI 一時的な認証情報を設定します。 | の認証情報 AWS CLI を使用して を設定します AWS アカウント。このチュートリアルでは、 AWS IAMIdentity Center コマンドラインまたはプログラムによるアクセスオプションによって提供される一時的な認証情報を使用します。これにより | 開発者 |
S3 バケットを作成する。 | AWS CloudFormation テンプレートによるデプロイのために Lambda 関数を保存してアクセス Serverless-Cell-Routerするために使用される S3 バケットを作成します。S3 バケットを作成するには、次のコマンドを使用します。
| 開発者 |
.zip ファイルを作成します。 | Functions
| 開発者 |
.zip ファイルを S3 バケットにコピーします。 | すべての Lambda 関数の .zip ファイルを S3 バケットにコピーするには、次のコマンドを使用します。
| 開発者 |
タスク | 説明 | 必要なスキル |
---|---|---|
AWS CloudFormation テンプレートをデプロイします。 | AWS CloudFormation テンプレートをデプロイするには、次の AWS CLI コマンドを実行します。
| 開発者 |
進捗確認。 | にサインインし AWS Management Console、 で AWS CloudFormation コンソールを開きhttps://console.aws.amazon.com/cloudformation/、スタック開発の進行状況を確認します。ステータスが | 開発者 |
タスク | 説明 | 必要なスキル |
---|---|---|
ユーザーにセルを割り当てます。 | を開始するには
は関数の実行を
| 開発者 |
ユーザーセルを取得します。 | を使用して
は、ユーザーに割り当てられたセル
| 開発者 |
タスク | 説明 | 必要なスキル |
---|---|---|
リソースをクリーンアップします。 | アカウントに追加料金が発生しないようにするには、以下を実行します。
| アプリ開発者 |
関連リソース
リファレンス
動画
Physalia: Amazon で高可用性を実現するセルベースのアーキテクチャ EBS
追加情報
セルベースのアーキテクチャ設計の前提
このパターンはセルルーターに焦点を当てていますが、環境全体を理解することが重要です。環境は、次の 3 つの個別のレイヤーで構成されています。
ルーティングレイヤー、またはセルルーターを含むシンレイヤー
さまざまなセルで構成されるセルレイヤー
セルをプロビジョニングしてアプリケーションをデプロイするプロビジョニングレイヤーとデプロイレイヤー
各レイヤーは、他のレイヤーに影響を与える障害が発生した場合でも機能を維持します。障害分離境界として機能し AWS アカウント ます。
次の図は、レイヤーの概要を示しています。セルレイヤーとプロビジョニングおよびデプロイレイヤーは、このパターンの範囲外です。
セルベースのアーキテクチャの詳細については、「セルベースのアーキテクチャによる影響範囲の削減: セルルーティング」を参照してください。
セルルーター設計パターン
セルルーターは、セル間で共有されるコンポーネントです。潜在的な影響を軽減するには、Routing レイヤーができるだけ薄いシンプルで水平方向にスケーラブルな設計を使用することが重要です。ルーティングレイヤーは、システムのエントリポイントとして機能し、ユーザーを適切なセルに効率的に割り当てるために必要なコンポーネントのみで構成されます。このレイヤー内のコンポーネントは、セルの管理や作成には関与しません。
このパターンは静的ルーティングを使用します。つまり、クライアントは初回ログイン時にエンドポイントをキャッシュし、その後セルとの直接通信を確立します。クライアントとセルルーター間の定期的なインタラクションが開始され、現在のステータスを確認したり、更新を取得したりできます。この意図的なデカップリングにより、セルルーターのダウンタイム発生時に既存のユーザーに対して中断のないオペレーションが可能になり、システム内で継続的な機能と回復力を提供します。
このパターンでは、セルルーターは次の機能をサポートしています。
プロビジョニングおよびデプロイレイヤーのセルデータベースからセルデータを取得し、ローカルデータベースを保存または更新します。
セル割り当てアルゴリズムを使用して、アプリケーションの新しい登録ユーザーごとにセルを割り当てます。
マッピングを user-to-cellsローカルデータベースに保存します。
ユーザー割り当て中にセルの容量を確認し、自動販売機のイベントをプロビジョニングおよびデプロイレイヤーに引き上げてセルを作成します。
セル作成基準アルゴリズムを使用してこの機能を提供します。
静的セルURLsの を指定して、新しく登録されたユーザーリクエストに対応します。これらは、存続する時間 () でクライアントにキャッシュURLsされますTTL。
新規または更新された を指定URLして、 の既存のユーザーリクエストに応答しますURL。
AWS CloudFormation テンプレートでセットアップされているデモセルルーターをさらに理解するには、以下のコンポーネントとステップを確認してください。
Amazon Cognito ユーザープールを設定および設定します。
セルルーターの API Gateway をセットアップして設定APIします。
DynamoDB テーブルを作成します。
SQS キューを作成して設定します。
を実装します
Orchestrator
。Lambda 関数を実装します:
Dispatcher
、Scaler
、Mapper
、Validator
。評価して検証します。
前提は、プロビジョニングレイヤーとデプロイレイヤーが既に確立されていることです。実装の詳細は、このアーティファクトの範囲を超えています。
これらのコンポーネントは AWS CloudFormation テンプレートによって設定および設定されるため、次の手順は説明的で高レベルに示されています。前提は、セットアップと設定を完了するために必要な AWS スキルがあることです。
1. Amazon Cognito ユーザープールのセットアップと設定
にサインインし AWS Management Console、 で Amazon Cognito コンソールを開きますhttps://console.aws.amazon.com/cognito/。アプリケーション統合、ホストされた UICellRouterPool
、および必要なアクセス許可を使用して、 という名前の Amazon Cognito ユーザープールを設定および設定します。
2. セルルーターの API Gateway をセットアップおよび設定APIする
で API Gateway コンソールを開きますhttps://console.aws.amazon.com/apigateway/。Amazon Cognito ユーザープール と統合された Amazon Cognito オーソライザーを使用してCellRouter
、 APIという名前の を設定および設定しますCellRouterPool
。次の要素を実装します。
CellRouter
APIPOST
メソッドを含む リソースステップ 5 で実装された Step Functions ワークフローとの統合
Amazon Cognito オーソライザーによる承認
統合リクエストとレスポンスのマッピング
必要なアクセス許可の割り当て
3. DynamoDB テーブルを作成する
で DynamoDB コンソールを開きhttps://console.aws.amazon.com/dynamodb/、次の設定tbl_router
で という名前の標準 DynamoDB テーブルを作成します。
パーティションキー
marketId
‒ソートキー
cellId
‒キャパシティモード ‒ プロビジョニング済み
Point-in-time リカバリ (PITR) ‒ オフ
Indexes タブで、 という名前のグローバルセカンダリインデックスを作成しますmarketId-currentCapacity-index
。Scaler
Lambda 関数は、インデックスを使用して、割り当てられたユーザーの数が最も少ないセルを効率的に検索します。
次の属性を使用してテーブル構造を作成します。
marketId
‒ 欧州cellId
‒ cell-0002currentCapacity
‒ 2endPoint_1
‒ <最初のリージョンのエンドポイント>endPoint_2
‒ <第 2 リージョンのエンドポイント>IsHealthy
‒ TruemaxCapacity
‒ 10regionCode_1
‒eu-north-1
regionCode_2
‒eu-central-1
userIds
‒ <E メールアドレス>
4. SQSキューの作成と設定
で Amazon SQSコンソールを開きhttps://console.aws.amazon.com/sqs/、Amazon SQSキー暗号化でCellProvisioning
設定された という標準SQSキューを作成します。
5. Orchestrator の実装
Orchestrator
ルーターの として機能する Step Functions ワークフローを作成します。ワークフローは、セルルーター を介して呼び出すことができますAPI。ワークフローは、リソースパスに基づいて指定された Lambda 関数を実行します。ステップ関数をセルルーター API の API Gateway と統合しCellRouter
、Lambda 関数を呼び出すために必要なアクセス許可を設定します。
以下の図に、ワークフローを示しています。選択状態は、Lambda 関数のいずれかを呼び出します。Lambda 関数が成功すると、ワークフローは終了します。Lambda 関数が失敗すると、フェイル状態が呼び出されます。
6. Lambda 関数の実装
Dispatcher
、Mapper
、Scaler
、および Validator
関数を実装します。デモンストレーションで各関数を設定および設定するときは、関数のロールを定義し、DynamoDB テーブル で必要な操作を実行するために必要なアクセス許可を割り当てますtbl_router
。さらに、各関数をワークフロー に統合しますOrchestrator
。
ディスパッチャー関数
このDispatcher
関数は、新しい登録ユーザーごとに 1 つの静的セルを識別して割り当てる責任があります。新しいユーザーがグローバルアプリケーションに登録すると、リクエストは Dispatcher
関数に送信されます。関数は、次のような事前定義された評価基準を使用してリクエストを処理します。
リージョン - ユーザーがいるマーケットのセルを選択します。例えば、ユーザーが欧州からグローバルアプリケーションにアクセスする場合は、欧州 AWS リージョン で を使用するセルを選択します。
近接度またはレイテンシー - ユーザーに最も近いセルを選択します。例えば、ユーザーがオランダからアプリケーションにアクセスする場合、関数はフランクフルトとアイルランドを使用するセルを考慮します。どのセルが最も近いかの決定は、ユーザーのロケーションとセルリージョン間のレイテンシーなどのメトリクスに基づいています。このパターン例では、情報は Provision and Deploy レイヤーから静的に供給されます。
Health ‒
Dispatcher
関数は、指定されたセル状態 (Healthy = true または false) に基づいて、選択したセルが正常かどうかを確認します。キャパシティ - ユーザーディストリビューションはセルロジック内の最小ユーザー数に基づいているため、ユーザーは最小ユーザー数を持つセルに割り当てられます。
注: これらの基準は、この例のパターンを説明するためにのみ表示されます。実際のセルルーターの実装では、より洗練されたユースケースベースの基準を定義できます。
は Dispatcher 関数をOrchestrator
呼び出して、ユーザーをセルに割り当てます。このデモ関数では、市場値は として定義される静的パラメータですeurope
。
このDispatcher
関数は、セルが既にユーザーに割り当てられているかどうかを評価します。セルがすでに割り当てられている場合、Dispatcher
関数はセルのエンドポイントを返します。ユーザーにセルが割り当てられていない場合、 関数はユーザー数が最も少ないセルを検索し、ユーザーに割り当て、エンドポイントを返します。セル検索クエリの効率は、グローバルセカンダリインデックスを使用して最適化されます。
マッパー関数
このMapper
関数は、データベース内のマッピングの user-to-cellストレージとメンテナンスを監督します。登録された各ユーザーに単一のセルが割り当てられます。各セルには 2 つの異なる URLs- 各AWSリージョンに 1 つずつあります。API Gateway でホストされるAPIエンドポイントとして機能するこれらのURLs関数は、グローバルアプリケーションを指すインバウンドとして機能します。
Mapper
関数がクライアントアプリケーションからリクエストを受信すると、DynamoDB テーブルでクエリを実行して、 user-to-cell指定された E メール ID に関連付けられているマッピングtbl_router
を取得します。割り当てられたセルが見つかった場合、Mapper
関数はセルの 2 つの をすぐに提供しますURLs。また、このMapper
関数はセル の変更を積極的にモニタリングしURLs、ユーザー設定の通知または更新を開始します。
Scaler 関数
Scaler
関数はセルの残容量を管理します。新しいユーザー登録リクエストごとに、Scaler
関数はDispatcher
、関数がユーザーに割り当てられたセルの利用可能な容量を評価します。指定された評価基準に従ってセルが所定の制限に達した場合、関数は Amazon SQSキューを介して Provision and Deploy レイヤーへのリクエストを開始し、新しいセルのプロビジョニングとデプロイを要求します。セルのスケーリングは、次のような一連の評価基準に基づいて実行できます。
最大ユーザー数 - 各セルには最大ユーザー数が 500 人まで指定できます。
バッファ容量 - 各セルのバッファ容量は 20% です。つまり、各セルはいつでも 400 ユーザーに割り当てることができます。残りの 20% のバッファ容量は、将来のユースケースや予期しないシナリオ (セルの作成やプロビジョニングサービスが利用できない場合など) の処理用に予約されています。
セルの作成 - 既存のセルが容量の 70% に達すると、追加のセルを作成するリクエストがトリガーされます。
注: これらの基準は、この例のパターンを説明するためにのみ表示されます。実際のセルルーターの実装では、より詳細なユースケースベースの基準を定義できます。
デモScaler
コードは、 が新しく登録したユーザーにセルをDispatcher
正常に割り当てOrchestrator
た後、 によって実行されます。はScaler
、 からセル ID を受信するとDispatcher
、事前定義された評価基準に基づいて、指定されたセルに、追加のユーザーに対応するのに十分な容量があるかどうかを評価します。セルの容量が不十分な場合、Scaler
関数は Amazon SQSサービスにメッセージをディスパッチします。このメッセージは、プロビジョニングおよびデプロイレイヤー内のサービスによって取得され、新しいセルのプロビジョニングを開始します。
バリデータ関数
このValidator
関数は、セルアクセスに関連する問題を特定して解決します。ユーザーがグローバルアプリケーションにサインインすると、アプリケーションはユーザープロファイル設定URLsからセルの を取得し、ユーザーリクエストをセル内の 2 つの割り当てられたリージョンのいずれかにルーティングします。にアクセスできない場合、アプリケーションURLsは検証URLリクエストをセルルーターにディスパッチできます。セルルーターは をOrchestrator
呼び出しますValidator
。は検証プロセスValidator
を開始します。検証には、その他のチェックとして以下が含まれる場合があります。
リクエストURLs内のセルをデータベースURLsに保存して相互参照し、潜在的な更新を特定して処理する
ディープヘルスチェックの実行 (セルのエンドポイントへの
HTTP GET
リクエストなど)
結論として、 Validator
関数はクライアントアプリケーションリクエストに応答し、必要な修復ステップとともに検証ステータスを提供します。
Validator
は、ユーザーエクスペリエンスを向上させるように設計されています。インシデントによりセルが一時的に使用できなくなるため、特定のユーザーがグローバルアプリケーションにアクセスできないシナリオを考えてみましょう。Validator
関数は、一般的なエラーを提示する代わりに、指示的な修復ステップを提供できます。これらのステップには、次のアクションが含まれる場合があります。
インシデントについてユーザーに通知します。
サービスが利用できるまでのおおよその待機時間を指定します。
追加情報を取得するためのサポート連絡先番号を指定します。
Validator
関数のデモコードは、リクエストURLs内のユーザーが指定したセルがtbl_router
テーブルに保存されたレコードと一致することを確認します。このValidator
関数は、セルが正常かどうかも確認します。