C# と を使用したサイロモデルの SaaS アーキテクチャでのテナントオンボーディング AWS CDK - AWS 規範ガイダンス

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

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 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。

テナントスタックの作成フロー

  1. ユーザーは、 の新しいテナントペイロード (テナント名、テナントの説明) を含むPOSTAPIリクエストJSONを Amazon API Gateway でRESTAPIホストされている に送信します。API Gateway はリクエストを処理し、バックエンドの Lambda テナントオンボーディング関数に転送します。この例では、承認も認証もありません。本稼働環境では、これを SaaS インフラストラクチャセキュリティシステムと統合APIする必要があります。

  2. テナントオンボーディング機能がリクエストを検証します。次に、テナント名、生成されたテナントの汎用一意識別子 (UUID)、テナントの説明を含むテナントレコードを Amazon DynamoDB テナントオンボーディングテーブルに保存しようとします。 

  3. DynamoDB がレコードを保存すると、DynamoDB ストリームはダウンストリームの Lambda テナントインフラストラクチャ機能を開始します。

  4. テナントインフラストラクチャ Lambda 関数は、受信した DynamoDB ストリームに基づいて動作します。ストリームがイベント用である場合INSERT、関数はストリーム NewImage のセクション (最新の更新レコード、テナント名フィールド) を使用して を呼び出し、S3 バケットに保存されているテンプレートを使用して新しいテナントインフラストラクチャ CloudFormation を作成します。 CloudFormation テンプレートにはテナント名パラメータが必要です。 

  5. AWS CloudFormation は、 CloudFormation テンプレートと入力パラメータに基づいてテナントインフラストラクチャを作成します。

  6. 各テナントインフラストラクチャのセットアップには、 CloudWatch アラーム、請求アラーム、およびアラームイベントがあります。

  7. アラームイベントは、テナントのAWSKMSキーによって暗号化された SNSトピックへのメッセージになります。

  8. このSNSトピックでは、受信したアラームメッセージをSQSキューに転送します。キューは、暗号化キーAWSKMSのためにテナントの によって暗号化されます。

他のシステムは Amazon と統合してSQS、キュー内のメッセージに基づいてアクションを実行できます。この例では、コードを汎用的に保つため、受信メッセージはキューに残り、手動で削除する必要があります。

テナントスタックの削除フロー

  1. ユーザーは、新しいテナントペイロード (テナント名、テナントの説明) を含むDELETEAPIリクエストJSONを で Amazon API Gateway がRESTAPIホストする に送信します。これにより、リクエストが処理され、テナントオンボーディング機能に転送されます。この例では、承認も認証もありません。本番稼働用セットアップでは、これは SaaS インフラストラクチャセキュリティシステムと統合APIされます。

  2. テナントオンボーディング機能はリクエストを確認し、テナントオンボーディングテーブルからテナントレコード (テナント名) を削除しようとします。 

  3. DynamoDB がレコードを正常に削除すると (レコードはテーブルに存在し、削除された)、DynamoDB ストリームはダウンストリーム Lambda テナントインフラストラクチャ関数を開始します。

  4. テナントインフラストラクチャ Lambda 関数は、受信した DynamoDB ストリームレコードに基づいて動作します。ストリームがREMOVEイベント用である場合、関数はレコード OldImage のセクション (最新の変更の前にレコード情報とテナント名フィールド) を使用して、そのレコード情報に基づいて既存のスタックの削除を開始します。

  5. 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 がローカルマシンにインストールされていることを確認するには、次のコマンドを実行します。

node --version
AWS 管理者、 AWS DevOps

Toolkit AWSCDKをインストールします。

ローカルマシンに AWS CDK Toolkit をインストールするには、次のコマンドを実行します。

npm install -g aws-cdk

npm がインストールされていない場合は、「Node.js サイト」からインストールできます。

AWS 管理者、 AWS DevOps

AWS CDK Toolkit のバージョンを確認します。

Toolkit AWSCDKのバージョンがマシンに正しくインストールされていることを確認するには、次のコマンドを実行します。 

cdk --version
AWS 管理者、 AWS DevOps
タスク説明必要なスキル

リポジトリをクローン作成します。

リポジトリ」をクローンし、\tenant-onboarding-in-saas-architecture-for-silo-model-apg-example フォルダに移動します。

Visual Studio 2022 で \src\TenantOnboardingInfra.sln ソリューションファイルを開きます。TenantOnboardingInfraStack.cs ファイルを開き、コードを確認します。

このスタックの一部として、以下のリソースが作成されます。

  • DynamoDB テーブル

  • S3 バケット (S3 バケットに CloudFormation テンプレートをアップロードします)。

  • Lambda 実行ロール

  • Lambda 関数

  • API ゲートウェイ API

  • Lambda 関数へのイベントソース

AWS 管理者、 AWS DevOps

CloudFormation テンプレートを確認します。

\tenant-onboarding-in-saas-architecture-for-silo-model-apg-example\template フォルダで を開きinfra.yaml、 CloudFormation テンプレートを確認します。このテンプレートは、テナントオンボーディング DynamoDB テーブルから取得したテナント名でハイドレイトされます。

このテンプレートはテナント固有のインフラストラクチャをプロビジョニングします。この例では、 AWSKMSキー、Amazon SNS 、Amazon 、SQSおよび CloudWatch アラームをプロビジョニングします。

アプリデベロッパー、 AWS DevOps

テナントオンボーディング機能を確認してください。

を開きFunction.cs、Visual Studio AWS Lambda プロジェクト () で作成されたテナントオンボーディング関数のコードを確認します。NET Core - C#) テンプレート。NET 6 (コンテナイメージ) の設計図。

Dockerfile を開き、コードを確認します。Dockerfile は、Lambda コンテナイメージを構築するための手順を含むテキストファイルです。

次の NuGet パッケージが依存関係としてTenantOnboardingFunctionプロジェクトに追加されることに注意してください。

  • Amazon.Lambda.APIGatewayEvents

  • AWSSDK.DynamoDBv2

  • Newtonsoft.Json

アプリデベロッパー、 AWS DevOps

テナント InfraProvisioning 関数を確認します。

\tenant-onboarding-in-saas-architecture-for-silo-model-apg-example\src\InfraProvisioningFunction に移動します。

を開きFunction.cs、Visual Studio AWS Lambda プロジェクト () で作成されたテナントインフラストラクチャプロビジョニング関数のコードを確認します。NET Core - C#) テンプレート。NET 6 (コンテナイメージ) の設計図。

Dockerfile を開き、コードを確認します。

次の NuGet パッケージが依存関係としてInfraProvisioningFunctionプロジェクトに追加されることに注意してください。

  • Amazon.Lambda.DynamoDBEvents

  • AWSSDK.DynamoDBv2

  • AWSSDK.Cloudformation

アプリデベロッパー、 AWS DevOps
タスク説明必要なスキル

ソリューションをビルドします。

ソリューションを構築するには、以下のステップを実行します。

  1. Visual Studio 2022 で \tenant-onboarding-in-saas-architecture-for-silo-model-apg-example\src\TenantOnboardingInfra.sln ソリューションファイルを開きます。 

  2. ソリューションのコンテキスト (右クリック) メニューを開き、[ソリューションの構築] を選択します。

注:ソリューションをビルドする前に、必ず \tenant-onboarding-in-saas-architecture-for-silo-model-apg-example\src\TenantOnboardingInfra プロジェクト内の Amazon.CDK.Lib NuGet パッケージを最新バージョンに更新してください。

アプリ開発者

AWS CDK 環境をブートストラップします。

Windows コマンドプロンプトを開き、cdk.jsonファイルが利用可能なAWSCDKアプリルートフォルダに移動します (\tenant-onboarding-in-saas-architecture-for-silo-model-apg-example)。ブートストラップの場合は、次のコマンドを実行します。

cdk bootstrap

認証情報のAWSプロファイルを作成した場合は、 プロファイルで コマンドを使用します。

cdk bootstrap --profile <profile name>
AWS 管理者、 AWS DevOps

AWS CDK スタックを一覧表示します。

このプロジェクトの一部として作成されるスタックをすべて一覧表示するには、次のコマンドを実行します。

cdk ls cdk ls --profile <profile name>

認証情報のAWSプロファイルを作成した場合は、プロファイルで コマンドを使用します。

cdk ls --profile <profile name>
AWS 管理者、 AWS DevOps

作成するAWSリソースを確認します。

このプロジェクトの一部として作成されるすべてのAWSリソースを確認するには、次のコマンドを実行します。

cdk diff

認証情報のAWSプロファイルを作成した場合は、プロファイルで コマンドを使用します。

cdk diff --profile <profile name>
AWS 管理者、 AWS DevOps

を使用してすべてのAWSリソースをデプロイしますAWSCDK。

すべてのAWSリソースをデプロイするには、次のコマンドを実行します。

cdk deploy --all --require-approval never

認証情報のAWSプロファイルを作成した場合は、プロファイルで コマンドを使用します。

cdk deploy --all --require-approval never --profile <profile name>

デプロイが完了したら、次の例に示すコマンドプロンプトの出力セクションAPIURLから をコピーします。

Outputs: TenantOnboardingInfraStack.TenantOnboardingAPIEndpoint42E526D7 = https://j2qmp8ds21i1i.execute-api.us-west-2.amazonaws.com/prod/
AWS 管理者、 AWS DevOps
タスク説明必要なスキル

新しいテナントを作成する。

新しいテナントを作成するには、次の curl リクエストを送信します。

curl -X POST <TenantOnboardingAPIEndpoint* from CDK Output>tenant -d '{"Name":"Tenant123", "Description":"Stack for Tenant123"}'

次の例に示すようにCDK、プレースホルダー<TenantOnboardingAPIEndpoint* from CDK Output>を AWS から実際の値に変更します。

curl -X POST https://j2qmp8ds21i1i.execute-api.us-west-2.amazonaws.com/prod/tenant -d '{"Name":"Tenant123", "Description":"test12"}'

以下の例は出力を示しています。

{"message": "A new tenant added - 5/4/2022 7:11:30 AM"}
アプリ開発者、AWS管理者、 AWS DevOps

DynamoDB で新しく作成されたテナントの詳細を確認します。

DynamoDB で新しく作成されたテナントの詳細を確認するには、次のステップを実行します。

  1. AWS マネジメントコンソールを開き、Amazon DynamoDB サービスに移動します。

  2. 左側のナビゲーションで [項目の探索] を選択し、TenantOnboarding テーブルを選択します。

    注:テナント名の先頭には tenantcluster- が付きます。詳細については、「追加情報」セクションをご覧ください。

  3. テナントの詳細を含む新しいアイテムが作成されていることを確認します。

アプリ開発者、AWS管理者、 AWS DevOps

新しいテナントのスタックの作成を確認します。

テンプレートに従って、新しいスタックが正常に作成され、新しく作成されたテナントのインフラストラクチャでプロビジョニングされたことを確認します CloudFormation 。

  1. CloudFormation コンソールを開きます。

  2. 左側のナビゲーションで [スタック] を選択し、テナント名のスタックが正常に作成されたことを確認します。

  3. 新しく作成したテナントスタックを選択し、[リソース]タブを選択します。アラームリソースと Amazon SQSリソースを書き留めます。

  4. AWS 認証情報が設定された新しいターミナルを開き、正しいリージョンをポイントします。テストアラームを発生させるには、次のコードを入力し、<alarm resource name> をステップ 3 で書き留めたアラームリソース名に置き換えます。

    aws cloudwatch set-alarm-state --alarm-name <alarm resource name> --state-value ALARM --state-reason 'Test setup'

    次の例は、アラームリソース名を含むコードを示します。

    aws cloudwatch set-alarm-state --alarm-name tenantcluster-tenant123-alarm --state-value ALARM --state-reason 'Test setup'
  5. コンソールを開き、Amazon SQSコンソールに移動します。ステップ 3 で特定した Amazon SQSリソース名を選択します。AWS ドキュメントの指示に従って、ステップ 4 で発生したアラームからテストメッセージを受信および削除します。

アプリ開発者、AWS管理者、 AWS DevOps

テナントスタックを削除します。

テナントスタックを削除するには、次の curl リクエストを送信します。

curl -X DELETE <TenantOnboardingAPIEndpoint* from CDK Output>tenant/<Tenant Name from previous step>

次の例に示すようにCDK、プレースホルダー<TenantOnboardingAPIEndpoint* from CDK Output>を AWS から実際の値<Tenant Name from previous step>に変更し、前のテナント作成ステップの実際の値に変更します。

curl -X DELETE https://j2qmp8ds21i1i.execute-api.us-west-2.amazonaws.com/prod/tenant/Tenant123

以下の例は出力を示しています。

{"message": "Tenant destroyed - 5/4/2022 7:14:48 AM"}
アプリ開発者、AWS DevOps、AWS管理者

既存のテナントのスタックの削除を確認します。

既存のテナントスタックが削除されたことを確認するには、次のステップを実行します。

  1. コンソールを開き、 CloudFormation コンソールに移動します。

  2. 左側のナビゲーションで、テナント名の既存のスタックがコンソールに表示されなくなったか ( CloudFormation コンソールがアクティブスタックのみを表示するように設定されている場合)、削除中であることを確認します。スタックが CloudFormation コンソールに表示されなくなった場合は、ドロップダウンリストを使用してコンソールの設定をアクティブから削除済みに変更し、削除されたスタックを確認し、スタックが正常に削除されたことを確認します。

アプリ開発者、AWS管理者、 AWS DevOps
タスク説明必要なスキル

環境を破壊する。

スタックをクリーンアップする前に、次の点を確認してください。

  • DynamoDB のすべてのレコードは、前のテナント削除オペレーション、または DynamoDB コンソールまたは を通じて削除されますAPI。テナントレコードを削除するたびに、AWS CloudFormation 対応するレコードのクリーンアップが開始されます。 

  • テナントベースのAWS CloudFormation スタックはすべてAWS CloudFormation 、コンソールでクリーンアップされます (DynamoDB トリガーのクリーンアップロジックが失敗した場合)。

テストが完了したら、次のコマンドを実行して、 を使用してすべてのスタックおよび関連リソースを破棄AWSCDKできます。

cdk destroy --all;

認証情報のAWSプロファイルを作成した場合は、 プロファイルを使用します。

スタックの削除プロンプトを確認して、スタックを削除します。

AWS 管理者、 AWS DevOps

Amazon CloudWatch Logs をクリーンアップします。

スタックの削除プロセスでは、スタックによって生成された CloudWatch ログ (ロググループとログ) はクリーンアップされません。 CloudWatch コンソールまたは を使用して CloudWatch 、リソースを手動でクリーンアップしますAPI。

アプリ開発者、AWS DevOps、AWS管理者

関連リソース

追加情報

コントロールプレーンテクノロジースタック

で記述されたCDKコード。NET は、以下のリソースで構成されるコントロールプレーンインフラストラクチャをプロビジョニングするために使用されます。

  1. API ゲートウェイ

    コントロールプレーンスタックのRESTAPIエントリポイントとして機能します。

  2. テナントオンボーディング Lambda 関数

    この Lambda 関数は、APIゲートウェイが m メソッドを使用して開始します。

    POST メソッドAPIリクエストにより、 (tenant nametenant description) が DynamoDB Tenant Onboardingテーブルに挿入されます。

    このコード例では、テナント名はテナントスタック名とそのスタック内のリソース名の一部としても使用されています。これは、これらのリソースを識別しやすくするためです。このテナント名は、競合やエラーを避けるため、セットアップで一意である必要があります。詳細な入力検証の設定については、IAMロールドキュメントと制限事項セクションで説明されています。

    DynamoDB テーブルへの永続化プロセスは、テナント名がテーブル内の他のレコードで使用されていない場合にのみ成功します。

    PutItem 条件式として使用できるのはパーティションキーだけなので、この場合のテナント名がこのテーブルのパーティションキーになります。

    テナント名が以前に記録されたことがなければ、レコードはテーブルに正常に保存されます。

    ただし、テナント名がテーブル内の既存のレコードですでに使用されている場合、操作は失敗し、DynamoDB ConditionalCheckFailedException 例外が開始されます。この例外は、テナント名が既に存在することを示す失敗メッセージ (HTTP BadRequest) を返すために使用されます。

    DELETE メソッドAPIリクエストは、特定のテナント名のレコードを Tenant Onboarding テーブルから削除します。

    この例の DynamoDB レコードの削除は、レコードが存在しなくても成功します。

    ターゲットレコードが存在して削除されると、DynamoDB ストリームレコードが作成されます。それ以外の場合は、ダウンストリームレコードは作成されません。

  3. Amazon DynamoDB Streams を有効にしたテナントによる DynamoDB のオンボーディング

    これによりテナントのメタデータ情報が記録され、レコードを保存または削除すると、ストリームが下流の Tenant Infrastructure Lambda 関数に送信されます。 

  4. テナントインフラストラクチャ Lambda 関数

    この Lambda 関数は、前のステップの DynamoDB ストリームレコードによって開始されます。レコードがイベント用である場合、 を呼び出しAWS CloudFormation てINSERT、S3 バケットに保存されている CloudFormation テンプレートを使用して新しいテナントインフラストラクチャを作成します。レコードが REMOVE の場合、ストリームレコードの Tenant Name フィールドに基づいて既存のスタックの削除を開始します。

  5. S3 バケット

    これは CloudFormation テンプレートを保存するためのものです。

  6. 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 SQS2SNSと Amazon を設定することをお勧めします。 SQSただし、 AWSマネージドキーSNSを使用する場合、 CloudWatch アラームは Amazon では機能しないため、この場合はカスタマーマネージドキーを使用する必要があります。詳細については、「 AWSナレッジセンター」を参照してください。

SQS ポリシーは Amazon SQSキューで使用され、作成されたSNSトピックがメッセージをキューに配信できるようにします。SQS ポリシーがない場合、アクセスは拒否されます。詳細については、「Amazon SNSドキュメント」を参照してください。