翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
C# と を使用したサイロモデルの SaaS アーキテクチャでのテナントオンボーディング AWS CDK
作成者: Tabby Ward (AWS)、Susmitha Reddy Gankidi (AWS)、Vijai Anand Ramalingam (AWS)
コードリポジトリ: Tennat オンボーディングサイロ | 環境:PoC またはパイロット | テクノロジー: モダナイゼーション DevOps |
ワークロード: オープンソース | AWS サービス: AWS CloudFormation、Amazon DynamoDB 、Amazon DynamoDB Streams、AWSLambda、Amazon API Gateway |
[概要]
Software as a service (SaaS) アプリケーションは、さまざまなアーキテクチャモデルで構築できます。サイロモデルとは、テナントに専用のリソースを提供するアーキテクチャを指します。
SaaS アプリケーションは、新しいテナントを環境に導入する際に摩擦のないモデルに依存しています。新しいテナントを作成するのに必要なすべての要素を正常にプロビジョニングして構成するには、多くの場合、多数のコンポーネントのオーケストレーションが必要になります。SaaS アーキテクチャでは、このプロセスをテナントオンボーディングと呼びます。オンボーディングは、オンボーディングプロセスのコードとしてのインフラストラクチャを活用して、すべての SaaS 環境で完全に自動化する必要があります。
このパターンでは、テナントを作成し、Amazon Web Services () でテナントの基本インフラストラクチャをプロビジョニングする例を示しますAWS。このパターンでは、C# と AWS Cloud Development Kit (AWS) を使用しますCDK。
このパターンでは請求アラームが発生するため、スタックを米国東部 (バージニア北部) または us-east-1、AWSリージョンにデプロイすることをお勧めします。詳細については、 AWS ドキュメントを参照してください。
前提条件と制限
前提条件
アクティブなAWSアカウント
。 このパターンのAWSリソースを作成するのに十分なIAMアクセス権を持つ AWS Identity and Access Management (IAM) プリンシパル。詳細については、「 IAMロール」を参照してください。
Amazon コマンドラインインターフェイス (AWS CLI) をインストールし、AWSCDKデプロイを実行するAWSように を設定しますCLI。
「Visual Studio 2022
」をダウンロードしてインストールするか、「Visual Studio Code 」をダウンロードしてインストールしました。 AWS Toolkit for Visual Studio のセットアップ。
。NET Core 3.1 以降
(C# AWSCDKアプリケーションに必要) 「Amazon.Lambda.Tools
」がインストールされました。
制限事項
AWS CDK は を使用するためAWS CloudFormation
、AWSCDKアプリケーションには CloudFormation サービスクォータが適用されます。詳細については、「 AWS CloudFormation クォータ」を参照してください。 テナント CloudFormation スタックは、アクション (
sns
* とsqs*
) でワイルドカード文字infra-cloudformation-role
を持つ CloudFormation サービスロールで作成されますが、リソースはtenant-cluster
プレフィックスにロックされます。実稼働環境での使用では、この設定を評価し、このサービスロールへの必要なアクセス権のみを提供してください。InfrastructureProvision
Lambda 関数は、ワイルドカード文字 (cloudformation*
) を使用して CloudFormation スタックをプロビジョニングしますが、リソースはtenant-cluster
プレフィックスにロックされます。このサンプルコードの docker ビルドは、
linux/amd64
ベースイメージを強制するために--platform=linux/amd64
に使用されています。これは、最終的なイメージアーティファクトが、デフォルトで x86-64 アーキテクチャを使用する Lambda に適したものになるようにするためです。ターゲット Lambda アーキテクチャを変更する必要がある場合は、必ず Dockerfiles とAWSCDKコードの両方を変更してください。詳細については、ブログ記事「Lambda 関数を Arm ベースの AWS Graviton2 AWS プロセッサに移行する」を参照してください。 スタックの削除プロセスでは、スタックによって生成された CloudWatch ログ (ロググループとログ) はクリーンアップされません。ログは、 AWSマネジメントコンソールの Amazon CloudWatch コンソールまたは を使用して手動でクリーンアップする必要がありますAPI。
このパターンは例として設定されています。本番環境で使用する場合は、以下の設定を評価し、ビジネス要件に基づいて変更を加えます。
この例の AWS Simple Storage Service (Amazon S3)
バケットでは、わかりやすくするためにバージョニングが有効になっていません。セットアップを評価し、必要に応じて更新してください。 この例では、わかりやすくするために、認証、承認、スロットリングなしで Amazon API Gateway
RESTAPIエンドポイントを設定します。本番環境での使用には、システムをビジネスセキュリティインフラストラクチャと統合することをお勧めします。この設定を評価し、必要に応じて必要なセキュリティ設定を追加してください。 このテナントインフラストラクチャの例では、Amazon Simple Notification Service (Amazon SNS)
と Amazon Simple Queue Service (Amazon SQS) の設定は最小限に抑えられています。各テナントの AWS Key Management Service (AWS KMS) が、キーポリシー に基づいて消費するアカウントの Amazon CloudWatch および Amazon SNSサービスに開きます。 AWS KMS セットアップは単なるプレースホルダーです。ビジネスユースケースに基づいて、必要に応じて設定を調整してください。 API エンドポイントや、 を使用したバックエンドテナントのプロビジョニングと削除を含むセットアップ全体はAWS CloudFormation、基本的なハッピーパスケースのみを対象としています。ビジネスニーズに基づいて、必要な再試行ロジック、追加のエラー処理ロジック、セキュリティロジックを使用してセットアップを評価し、更新してください。
サンプルコードは up-to-date cdk-nag
でテストされ、この書き込み時にポリシーをチェックします。将来、新しいポリシーが施行される可能性があります。これらの新しいポリシーでは、スタックをデプロイする前に、推奨事項に基づいてスタックを手動で変更する必要がある場合があります。既存のコードを見直して、ビジネス要件に合っていることを確認してください。 このコードは、作成されたほとんどのリソースAWSCDKに静的に割り当てられた物理名に依存するのではなく、 に依存してランダムなサフィックスを生成します。この設定は、これらのリソースが一意であり、他のスタックと競合しないようにするためです。詳細については、 AWS CDK ドキュメントを参照してください。ビジネス要件に基づいて調整してください。
このサンプルコードパッケージは です。NET Lambda アーティファクトを Docker ベースのイメージに組み込み、Lambda が提供するコンテナイメージランタイム で実行されます。コンテナイメージランタイムには、標準的な転送および保存メカニズム (コンテナレジストリ) と、より正確なローカルテスト環境 (コンテナイメージを使用) という利点があります。プロジェクトを Lambda が提供する を使用するように切り替えることができます。NET ランタイムは Docker イメージのビルド時間を短縮しますが、転送および保存メカニズムを設定し、ローカルセットアップが Lambda セットアップと一致することを確認する必要があります。ユーザーのビジネス要件に合わせてコードを調整してください。
製品バージョン
AWS CDK バージョン 2.45.0 以降
Visual Studio 2022
アーキテクチャ
テクノロジースタック
Amazon API Gateway
AWS CloudFormation
Amazon CloudWatch
Amazon DynamoDB
AWS Identity and Access Management (IAM)
AWS KMS
AWS Lambda
Amazon S3
Amazon SNS
Amazon SQS
アーキテクチャ
次の図に、テナントスタックの作成フローを示します。コントロールプレーンとテナントテクノロジースタックの詳細については、「追加情報」セクションを参照してください。
![テナントを作成し、 でテナントの基本インフラストラクチャをプロビジョニングするワークフローAWS。](images/pattern-img/5baef800-fe39-4eb8-b11d-2c23eb3175fc/images/0b579484-b87c-4acb-8c60-8c33c18370e3.png)
テナントスタックの作成フロー
ユーザーは、 の新しいテナントペイロード (テナント名、テナントの説明) を含むPOSTAPIリクエストJSONを Amazon API Gateway でRESTAPIホストされている に送信します。API Gateway はリクエストを処理し、バックエンドの Lambda テナントオンボーディング関数に転送します。この例では、承認も認証もありません。本稼働環境では、これを SaaS インフラストラクチャセキュリティシステムと統合APIする必要があります。
テナントオンボーディング機能がリクエストを検証します。次に、テナント名、生成されたテナントの汎用一意識別子 (UUID)、テナントの説明を含むテナントレコードを Amazon DynamoDB テナントオンボーディングテーブルに保存しようとします。
DynamoDB がレコードを保存すると、DynamoDB ストリームはダウンストリームの Lambda テナントインフラストラクチャ機能を開始します。
テナントインフラストラクチャ Lambda 関数は、受信した DynamoDB ストリームに基づいて動作します。ストリームがイベント用である場合INSERT、関数はストリーム NewImage のセクション (最新の更新レコード、テナント名フィールド) を使用して を呼び出し、S3 バケットに保存されているテンプレートを使用して新しいテナントインフラストラクチャ CloudFormation を作成します。 CloudFormation テンプレートにはテナント名パラメータが必要です。
AWS CloudFormation は、 CloudFormation テンプレートと入力パラメータに基づいてテナントインフラストラクチャを作成します。
各テナントインフラストラクチャのセットアップには、 CloudWatch アラーム、請求アラーム、およびアラームイベントがあります。
アラームイベントは、テナントのAWSKMSキーによって暗号化された SNSトピックへのメッセージになります。
このSNSトピックでは、受信したアラームメッセージをSQSキューに転送します。キューは、暗号化キーAWSKMSのためにテナントの によって暗号化されます。
他のシステムは Amazon と統合してSQS、キュー内のメッセージに基づいてアクションを実行できます。この例では、コードを汎用的に保つため、受信メッセージはキューに残り、手動で削除する必要があります。
テナントスタックの削除フロー
ユーザーは、新しいテナントペイロード (テナント名、テナントの説明) を含むDELETEAPIリクエストJSONを で Amazon API Gateway がRESTAPIホストする に送信します。これにより、リクエストが処理され、テナントオンボーディング機能に転送されます。この例では、承認も認証もありません。本番稼働用セットアップでは、これは SaaS インフラストラクチャセキュリティシステムと統合APIされます。
テナントオンボーディング機能はリクエストを確認し、テナントオンボーディングテーブルからテナントレコード (テナント名) を削除しようとします。
DynamoDB がレコードを正常に削除すると (レコードはテーブルに存在し、削除された)、DynamoDB ストリームはダウンストリーム Lambda テナントインフラストラクチャ関数を開始します。
テナントインフラストラクチャ Lambda 関数は、受信した DynamoDB ストリームレコードに基づいて動作します。ストリームがREMOVEイベント用である場合、関数はレコード OldImage のセクション (最新の変更の前にレコード情報とテナント名フィールド) を使用して、そのレコード情報に基づいて既存のスタックの削除を開始します。
AWS CloudFormation は、入力に従ってターゲットテナントスタックを削除します。
ツール
AWS サービス
Amazon API Gateway は、、、および をあらゆる規模で作成、公開REST、保守、モニタリングHTTP、 WebSocket APIs保護するのに役立ちます。
AWS Cloud Development Kit (AWS CDK) は、コードで AWS クラウドインフラストラクチャを定義およびプロビジョニングするのに役立つソフトウェア開発フレームワークです。
AWS CDK Toolkit は、Cloud Development Kit (AWS CDK) アプリの操作に役立つコマンドラインAWSクラウド開発キットです。
AWS コマンドラインインターフェイス (AWS CLI) は、コマンドラインシェルのコマンドを使用して AWSサービスとやり取りするのに役立つオープンソースツールです。
AWS CloudFormation は、AWSリソースをセットアップし、迅速かつ一貫してプロビジョニングし、AWSアカウントとリージョン全体のライフサイクルを通じてリソースを管理するのに役立ちます。
Amazon DynamoDB は、高速で予測可能でスケーラブルなパフォーマンスを提供するフルマネージドの NoSQL データベースサービスです。
AWS Identity and Access Management (IAM) は、誰を認証し、誰に使用を認可するかを制御することで、 AWSリソースへのアクセスを安全に管理するのに役立ちます。
AWS Key Management Service (AWS KMS) は、データの保護に役立つ暗号化キーの作成と制御に役立ちます。
AWS Lambda は、サーバーのプロビジョニングや管理を必要とせずにコードを実行するのに役立つコンピューティングサービスです。必要に応じてコードを実行し、自動的にスケーリングするため、課金は実際に使用したコンピューティング時間に対してのみ発生します。
Amazon Simple Storage Service (Amazon S3) は、任意の量のデータを保存、保護、取得する上で役立つクラウドベースのオブジェクトストレージサービスです。
Amazon Simple Notification Service (Amazon SNS) は、ウェブサーバーや E メールアドレスなど、パブリッシャーとクライアント間のメッセージ交換を調整および管理するのに役立ちます。
Amazon Simple Queue Service (Amazon SQS) は、分散ソフトウェアシステムとコンポーネントの統合と分離に役立つ、安全で耐久性があり、利用可能なホストキューを提供します。
AWS Toolkit for Visual Studio は、Visual Studio 統合開発環境 () 用のプラグインですIDE。Toolkit for Visual Studio は、 AWSサービスを使用する NETアプリケーションの開発、デバッグ、デプロイをサポートしています。
その他のツール
Visual Studio
は、コンパイラ、コード補完ツール、グラフィカルデザイナー、およびソフトウェア開発をサポートするその他の機能IDEを含む です。
コード
このパターンのコードは、SaaS Architecture for Silo Model APG Example リポジトリのテナントオンボーディング
エピック
タスク | 説明 | 必要なスキル |
---|---|---|
Node.js がインストールされていることを確認してください。 | Node.js がローカルマシンにインストールされていることを確認するには、次のコマンドを実行します。
| AWS 管理者、 AWS DevOps |
Toolkit AWSCDKをインストールします。 | ローカルマシンに AWS CDK Toolkit をインストールするには、次のコマンドを実行します。
npm がインストールされていない場合は、「Node.js サイト | AWS 管理者、 AWS DevOps |
AWS CDK Toolkit のバージョンを確認します。 | Toolkit AWSCDKのバージョンがマシンに正しくインストールされていることを確認するには、次のコマンドを実行します。
| AWS 管理者、 AWS DevOps |
タスク | 説明 | 必要なスキル |
---|---|---|
リポジトリをクローン作成します。 | 「リポジトリ Visual Studio 2022 で このスタックの一部として、以下のリソースが作成されます。
| AWS 管理者、 AWS DevOps |
CloudFormation テンプレートを確認します。 |
このテンプレートはテナント固有のインフラストラクチャをプロビジョニングします。この例では、 AWSKMSキー、Amazon SNS 、Amazon 、SQSおよび CloudWatch アラームをプロビジョニングします。 | アプリデベロッパー、 AWS DevOps |
テナントオンボーディング機能を確認してください。 | を開き
次の NuGet パッケージが依存関係として
| アプリデベロッパー、 AWS DevOps |
テナント InfraProvisioning 関数を確認します。 |
を開き
次の NuGet パッケージが依存関係として
| アプリデベロッパー、 AWS DevOps |
タスク | 説明 | 必要なスキル |
---|---|---|
ソリューションをビルドします。 | ソリューションを構築するには、以下のステップを実行します。
注:ソリューションをビルドする前に、必ず | アプリ開発者 |
AWS CDK 環境をブートストラップします。 | Windows コマンドプロンプトを開き、
認証情報のAWSプロファイルを作成した場合は、 プロファイルで コマンドを使用します。
| AWS 管理者、 AWS DevOps |
AWS CDK スタックを一覧表示します。 | このプロジェクトの一部として作成されるスタックをすべて一覧表示するには、次のコマンドを実行します。
認証情報のAWSプロファイルを作成した場合は、プロファイルで コマンドを使用します。
| AWS 管理者、 AWS DevOps |
作成するAWSリソースを確認します。 | このプロジェクトの一部として作成されるすべてのAWSリソースを確認するには、次のコマンドを実行します。
認証情報のAWSプロファイルを作成した場合は、プロファイルで コマンドを使用します。
| AWS 管理者、 AWS DevOps |
を使用してすべてのAWSリソースをデプロイしますAWSCDK。 | すべてのAWSリソースをデプロイするには、次のコマンドを実行します。
認証情報のAWSプロファイルを作成した場合は、プロファイルで コマンドを使用します。
デプロイが完了したら、次の例に示すコマンドプロンプトの出力セクションAPIURLから をコピーします。
| AWS 管理者、 AWS DevOps |
タスク | 説明 | 必要なスキル |
---|---|---|
新しいテナントを作成する。 | 新しいテナントを作成するには、次の curl リクエストを送信します。
次の例に示すようにCDK、プレースホルダー
以下の例は出力を示しています。
| アプリ開発者、AWS管理者、 AWS DevOps |
DynamoDB で新しく作成されたテナントの詳細を確認します。 | DynamoDB で新しく作成されたテナントの詳細を確認するには、次のステップを実行します。
| アプリ開発者、AWS管理者、 AWS DevOps |
新しいテナントのスタックの作成を確認します。 | テンプレートに従って、新しいスタックが正常に作成され、新しく作成されたテナントのインフラストラクチャでプロビジョニングされたことを確認します CloudFormation 。
| アプリ開発者、AWS管理者、 AWS DevOps |
テナントスタックを削除します。 | テナントスタックを削除するには、次の curl リクエストを送信します。
次の例に示すようにCDK、プレースホルダー
以下の例は出力を示しています。
| アプリ開発者、AWS DevOps、AWS管理者 |
既存のテナントのスタックの削除を確認します。 | 既存のテナントスタックが削除されたことを確認するには、次のステップを実行します。
| アプリ開発者、AWS管理者、 AWS DevOps |
タスク | 説明 | 必要なスキル |
---|---|---|
環境を破壊する。 | スタックをクリーンアップする前に、次の点を確認してください。
テストが完了したら、次のコマンドを実行して、 を使用してすべてのスタックおよび関連リソースを破棄AWSCDKできます。
認証情報のAWSプロファイルを作成した場合は、 プロファイルを使用します。 スタックの削除プロンプトを確認して、スタックを削除します。 | AWS 管理者、 AWS DevOps |
Amazon CloudWatch Logs をクリーンアップします。 | スタックの削除プロセスでは、スタックによって生成された CloudWatch ログ (ロググループとログ) はクリーンアップされません。 CloudWatch コンソールまたは を使用して CloudWatch 、リソースを手動でクリーンアップしますAPI。 | アプリ開発者、AWS DevOps、AWS管理者 |
関連リソース
追加情報
コントロールプレーンテクノロジースタック
で記述されたCDKコード。NET は、以下のリソースで構成されるコントロールプレーンインフラストラクチャをプロビジョニングするために使用されます。
API ゲートウェイ
コントロールプレーンスタックのRESTAPIエントリポイントとして機能します。
テナントオンボーディング Lambda 関数
この Lambda 関数は、APIゲートウェイが m メソッドを使用して開始します。
POST メソッドAPIリクエストにより、 (
tenant name
、tenant description
) が DynamoDBTenant Onboarding
テーブルに挿入されます。このコード例では、テナント名はテナントスタック名とそのスタック内のリソース名の一部としても使用されています。これは、これらのリソースを識別しやすくするためです。このテナント名は、競合やエラーを避けるため、セットアップで一意である必要があります。詳細な入力検証の設定については、IAMロールドキュメントと制限事項セクションで説明されています。
DynamoDB テーブルへの永続化プロセスは、テナント名がテーブル内の他のレコードで使用されていない場合にのみ成功します。
PutItem
条件式として使用できるのはパーティションキーだけなので、この場合のテナント名がこのテーブルのパーティションキーになります。テナント名が以前に記録されたことがなければ、レコードはテーブルに正常に保存されます。
ただし、テナント名がテーブル内の既存のレコードですでに使用されている場合、操作は失敗し、DynamoDB
ConditionalCheckFailedException
例外が開始されます。この例外は、テナント名が既に存在することを示す失敗メッセージ (HTTP BadRequest
) を返すために使用されます。DELETE
メソッドAPIリクエストは、特定のテナント名のレコードをTenant Onboardin
g テーブルから削除します。この例の DynamoDB レコードの削除は、レコードが存在しなくても成功します。
ターゲットレコードが存在して削除されると、DynamoDB ストリームレコードが作成されます。それ以外の場合は、ダウンストリームレコードは作成されません。
Amazon DynamoDB Streams を有効にしたテナントによる DynamoDB のオンボーディング
これによりテナントのメタデータ情報が記録され、レコードを保存または削除すると、ストリームが下流の
Tenant Infrastructure
Lambda 関数に送信されます。テナントインフラストラクチャ Lambda 関数
この Lambda 関数は、前のステップの DynamoDB ストリームレコードによって開始されます。レコードがイベント用である場合、 を呼び出しAWS CloudFormation て
INSERT
、S3 バケットに保存されている CloudFormation テンプレートを使用して新しいテナントインフラストラクチャを作成します。レコードがREMOVE
の場合、ストリームレコードのTenant Name
フィールドに基づいて既存のスタックの削除を開始します。S3 バケット
これは CloudFormation テンプレートを保存するためのものです。
IAM 各 Lambda 関数の ロールと のサービスロール CloudFormation
各 Lambda 関数には、タスクを達成するための最小特権のアクセス許可を持つ一意のIAMロールがあります。たとえば、
Tenant On-boarding
Lambda 関数には DynamoDB への読み取り/書き込みアクセス権があり、Tenant Infrastructure
Lambda 関数は DynamoDB ストリームのみを読み取ることができます。テナントスタックのプロビジョニング用にカスタム CloudFormation サービスロールが作成されます。このサービスロールには、 CloudFormation スタックのプロビジョニングのための追加のアクセス許可 ( AWSKMSキーなど) が含まれています。これにより、1 つのロール (Infrastructure Lambda ロール) に対するすべてのアクセス許可を回避 CloudFormation するために、ロールが Lambda と に分割されます。
強力なアクション ( CloudFormation スタックの作成や削除など) を許可するアクセス許可は、 で始まるリソースでのみロックされ、許可されます
tenantcluster-
。リソースの命名規則によりAWSKMS、例外は です。から取り込まれたテナント名は、他の検証チェック (ダッシュのみを含む英数字で、ほとんどのAWSリソース命名に適合するように 30 文字未満に制限)tenantcluster-
とともに先頭に追加APIされます。これにより、テナント名によってコアインフラストラクチャスタックやリソースが誤って中断されることがなくなります。
テナントテクノロジースタック
CloudFormation テンプレートは S3 バケットに保存されます。テンプレートは、テナント固有のAWSKMSキー、 CloudWatch アラーム、 SNSトピック、 SQSキュー、および SQS ポリシーをプロビジョニングします。
AWS KMS キーは、Amazon SNSと Amazon によるSQSメッセージのデータ暗号化に使用されます。AwsSolutions-SNS2 および AwsSolutions- のセキュリティプラクティスでは、暗号化を使用して Amazon SQS2
SQS ポリシーは Amazon SQSキューで使用され、作成されたSNSトピックがメッセージをキューに配信できるようにします。SQS ポリシーがない場合、アクセスは拒否されます。詳細については、「Amazon SNSドキュメント」を参照してください。