アマゾン予測 は、Amazon.com で予測に使用されているのと同じテクノロジーに基づいたフルマネージド サービスです。 Forecast は機械学習 (ML) を使用して時系列データを追加の変数と組み合わせて、高精度の予測を構築します。 Forecast を開始するには、ML の経験は必要ありません。 提供する必要があるのは、履歴データと、予測に影響を与える可能性のある追加データのみです。
顧客は、マルチテナント ソリューションの提供に Software as Service (SaaS) モデルの使用に目を向けています。 規制やコンプライアンスの要件を満たすために、さまざまなアーキテクチャ モデルを使用して SaaS アプリケーションを構築できます。 SaaS モデルによっては、Forecast などのリソースがテナント間で共有されます。 SaaS ソリューションを展開する場合は、予測データのアクセス、監視、請求をテナントごとに考慮する必要があります。
この投稿では、マルチテナント SaaS アプリケーション内で Forecast を使用する方法について概要を説明します。 属性ベースのアクセス制御 (ABAC) で AWS IDおよびアクセス管理 (IAM) これらの機能を提供します。 ABAC は、テナント間でリソースを分離するために使用できる強力なアプローチです。
この投稿では、ABAC 原則と予測を使用してテナントに IAM ポリシーを設定するためのガイダンスを提供します。 構成をデモンストレーションするために、XNUMX つのテナントをセットアップします。 TenantA
および TenantB
、Forecast を使用した SaaS アプリケーションのコンテキストでのユースケースを示します。 私たちのユースケースでは、 TenantB
削除できません TenantA
リソース、またはその逆。 次の図は、アーキテクチャを示しています。
TenantA
および TenantB
サービス内でマイクロサービスとして実行されるサービスがある Amazon Elastic Kubernetesサービス (アマゾンEKS)。 テナント アプリケーションは、ビジネス フローの一部として Forecast を使用します。
予測データの取り込み
Forecast はテナントのデータをインポートします Amazon シンプル ストレージ サービス (Amazon S3) バケットを Forecast 管理の S3 バケットに追加します。 データは、Forecast 管理キーまたはテナント固有のキーを使用して、転送中および保存中に自動的に暗号化できます。 AWSキー管理サービス (AWS KMS)。 テナント固有のキーは、オンボーディングの一環として SaaS アプリケーションによって作成することも、テナントが AWS KMS を使用して独自のカスタマー管理キー (CMK) を提供することもできます。 テナント固有のキーに対するアクセス許可を取り消すと、Forecast がテナントのデータを使用できなくなります。 マルチテナント SaaS 環境では、テナント固有のキーとテナントごとの IAM ロールを使用することをお勧めします。 これにより、テナントごとにデータを保護できます。
ソリューションの概要
Amazon S3 上のデータを分割して、さまざまな方法でテナントのアクセスを分離できます。 この投稿では、次の XNUMX つの戦略について説明します。
- テナントごとに 3 つの SXNUMX バケットを使用する
- 単一の S3 バケットを使用し、プレフィックス付きの個別のテナント データを使用する
さまざまな戦略の詳細については、「 Amazon S3 へのマルチテナント データの保存 GitHubレポ。
テナントごとに 3 つのバケットを使用する場合、IAM ポリシーを使用して、特定のテナント SXNUMX バケットへのアクセスを制限します。 例えば:
s3://tenant_a [ Tag tenant = tenant_a ] s3://tenant_b [ Tag tenant = tenant_b ]
アカウントあたりの S3 バケットの数には厳しい制限があります。 この制限を克服するには、マルチアカウント戦略を検討する必要があります。
3 番目のオプションでは、単一の S3 バケット内の SXNUMX プレフィックスを使用してテナント データを分離します。 IAM ポリシーを使用して、テナントごとのバケット プレフィックス内のアクセスを制限します。 例えば:
s3://<bucketname>/tenant_a
この投稿では、単一バケット内で S3 プレフィックスを割り当てる XNUMX 番目のオプションを使用します。 AWS KMS の CMK を使用してテナントデータを暗号化します。
テナントのオンボーディング
SaaS アプリケーションは、新しいテナントを環境に導入するための摩擦のないモデルに依存しています。 多くの場合、新しいテナントの作成に必要なすべての要素を正常にプロビジョニングおよび構成するには、いくつかのコンポーネントを調整する必要があります。 このプロセスは、SaaS アーキテクチャでは次のように呼ばれます。 テナントのオンボーディング。 これは、テナントによって直接開始することも、プロバイダーが管理するプロセスの一部として開始することもできます。 次の図は、オンボーディング プロセスの一部としてテナントごとに予測を構成するフローを示しています。
リソースにはテナント情報がタグ付けされています。 この投稿では、リソースにテナントの値をタグ付けします。たとえば、 tenant_a
.
予測ロールを作成する
この IAM ロールは、テナントごとに Forecast によって引き受けられます。 Forecast が顧客アカウントで Amazon S3 および AWS KMS と対話できるようにするには、次のポリシーを適用する必要があります。 ロールにはタグテナントのタグが付けられます。 たとえば、次のコードを参照してください。
TenantA create role Forecast_TenantA_Role [ Tag tenant = tenant_a] TenantB create role Forecast_TenantB_Role [ Tag tenant = tenant_b]
ポリシーを作成する
次のステップでは、Forecast ロールのポリシーを作成します。 この投稿では、読みやすくするためにポリシーを XNUMX つのポリシーに分割しましたが、ニーズに応じて作成できます。
ポリシー 1: 読み取り専用アクセスを予測する
次のポリシーは、予測リソースの説明、リスト、およびクエリを実行する権限を与えます。 このポリシーは、Forecast を読み取り専用アクセスに制限します。 次のコードのテナント タグ検証条件は、テナント タグ値がプリンシパルのテナント タグと一致することを確認します。 を参照してください。 太字のコード 詳細については。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "DescribeQuery", "Effect": "Allow", "Action": [ "forecast:GetAccuracyMetrics", "forecast:ListTagsForResource", "forecast:DescribeDataset", "forecast:DescribeForecast", "forecast:DescribePredictor", "forecast:DescribeDatasetImportJob", "forecast:DescribePredictorBacktestExportJob", "forecast:DescribeDatasetGroup", "forecast:DescribeForecastExportJob", "forecast:QueryForecast" ], "Resource": [ "arn:aws:forecast:*:<accountid>:dataset-import-job/*", "arn:aws:forecast:*:<accountid>:dataset-group/*", "arn:aws:forecast:*:<accountid>:predictor/*", "arn:aws:forecast:*:<accountid>:forecast/*", "arn:aws:forecast:*:<accountid>:forecast-export-job/*", "arn:aws:forecast:*:<accountid>:dataset/*", "arn:aws:forecast:*:<accountid>:predictor-backtest-export-job/*" ], "Condition": { "StringEquals": { "aws:ResourceTag/tenant":"${aws:PrincipalTag/tenant}" } } }, { "Sid": "List", "Effect": "Allow", "Action": [ "forecast:ListDatasetImportJobs", "forecast:ListDatasetGroups", "forecast:ListPredictorBacktestExportJobs", "forecast:ListForecastExportJobs", "forecast:ListForecasts", "forecast:ListPredictors", "forecast:ListDatasets" ], "Resource": "*" } ] }
ポリシー 2: Amazon S3 および AWS KMS アクセス ポリシー
次のポリシーは、AWS KMS に権限を与え、S3 テナント プレフィックスへのアクセスを与えます。 次のコードのテナント タグ検証条件は、テナント タグ値がプリンシパルのテナント タグと一致することを確認します。 を参照してください。 太字のコード 詳細については。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "KMS", "Effect": "Allow", "Action": [ "kms:Decrypt", "kms:Encrypt", "kms:RevokeGrant", "kms:GenerateDataKey", "kms:DescribeKey", "kms:RetireGrant", "kms:CreateGrant", "kms:ListGrants" ], "Resource": "*", "Condition": { "StringEquals": { "aws:ResourceTag/tenant":"${aws:PrincipalTag/tenant}" } } }, { "Sid": "S3Access", "Effect": "Allow", "Action": [ "s3:GetObject", "s3:PutObject", "s3:GetObjectVersionTagging", "s3:GetObjectAcl", "s3:GetObjectVersionAcl", "s3:GetBucketPolicyStatus", "s3:ListBucket", "s3:ListBucketMultipartUploads", "s3:ListAccessPoints", "s3:GetObjectVersion" ], "Resource": [ "arn:aws:s3:::<bucketname>/*", "arn:aws:s3:::<bucketname>" ], "Condition": { "StringLike": { "s3:prefix": [ "${aws:PrincipalTag/tenant}", "${aws:PrincipalTag/tenant}/*" ] } } } ] }
テナント固有のキーを作成する
次に、AWS KMS でテナントごとにテナント固有のキーを作成し、テナントのタグ値でタグ付けします。 あるいは、テナントは独自のキーを AWS KMS に持ち込むこともできます。 前述の役割を与えます (Forecast_TenantA_Role
or Forecast_TenantB_Role
) テナント固有のキーへのアクセス。
たとえば、次のスクリーンショットは、次のキーと値のペアを示しています。 tenant
および tenant_a
.
次のスクリーンショットは、このキーを使用できる IAM ロールを示しています。
アプリケーションロールを作成する
作成する 3 番目のロールは、テナントごとの SaaS アプリケーションによって引き受けられます。 アプリケーションが Forecast、Amazon SXNUMX、および AWS KMS と対話できるようにするには、次のポリシーを適用する必要があります。 ロールにはタグテナントのタグが付けられます。 次のコードを参照してください。
TenantA create role TenantA_Application_Role [ Tag tenant = tenant_a] TenantB create role TenantB_Application_Role [ Tag tenant = tenant_b]
ポリシーを作成する
次に、アプリケーション ロールのポリシーを作成します。 この投稿では、読みやすくするためにポリシーを XNUMX つのポリシーに分割しましたが、ニーズに応じて作成できます。
ポリシー 1: 予測アクセス
次のポリシーは、Forecast リソースを作成、更新、および削除する権限を与えます。 ポリシーは、作成時にタグ要件を強制します。 さらに、次のことを制限します。 list
, describe
, delete
リソースに対するアクションを各テナントに送信します。 このポリシーには IAM があります PassRole
Forecast が役割を引き受けられるようにします。
tenant
次のコードのタグ検証条件は、テナント タグ値がテナントと一致することを確認します。 を参照してください。 太字のコード 詳細については。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "CreateDataSet", "Effect": "Allow", "Action": [ "forecast:CreateDataset", "forecast:CreateDatasetGroup", "forecast:TagResource" ], "Resource": [ "arn:aws:forecast:*:<accountid>:dataset-import-job/*", "arn:aws:forecast:*:<accountid>:dataset-group/*", "arn:aws:forecast:*:<accountid>:predictor/*", "arn:aws:forecast:*:<accountid>:forecast/*", "arn:aws:forecast:*:<accountid>:forecast-export-job/*", "arn:aws:forecast:*:<accountid>:dataset/*", "arn:aws:forecast:*:<accountid>:predictor-backtest-export-job/*" ], "Condition": { "ForAnyValue:StringEquals": { "aws:TagKeys": [ "tenant" ] }, "StringEquals": { "aws:RequestTag/tenant": "${aws:PrincipalTag/tenant}" } } }, { "Sid": "CreateUpdateDescribeQueryDelete", "Effect": "Allow", "Action": [ "forecast:CreateDatasetImportJob", "forecast:CreatePredictor", "forecast:CreateForecast", "forecast:CreateForecastExportJob", "forecast:CreatePredictorBacktestExportJob", "forecast:GetAccuracyMetrics", "forecast:ListTagsForResource", "forecast:UpdateDatasetGroup", "forecast:DescribeDataset", "forecast:DescribeForecast", "forecast:DescribePredictor", "forecast:DescribeDatasetImportJob", "forecast:DescribePredictorBacktestExportJob", "forecast:DescribeDatasetGroup", "forecast:DescribeForecastExportJob", "forecast:QueryForecast", "forecast:DeletePredictorBacktestExportJob", "forecast:DeleteDatasetImportJob", "forecast:DeletePredictor", "forecast:DeleteDataset", "forecast:DeleteDatasetGroup", "forecast:DeleteForecastExportJob", "forecast:DeleteForecast" ], "Resource": [ "arn:aws:forecast:*:<accountid>:dataset-import-job/*", "arn:aws:forecast:*:<accountid>:dataset-group/*", "arn:aws:forecast:*:<accountid>:predictor/*", "arn:aws:forecast:*:<accountid>:forecast/*", "arn:aws:forecast:*:<accountid>:forecast-export-job/*", "arn:aws:forecast:*:<accountid>:dataset/*", "arn:aws:forecast:*:<accountid>:predictor-backtest-export-job/*" ], "Condition": { "StringEquals": { "aws:ResourceTag/tenant": "${aws:PrincipalTag/tenant}" } } }, { "Sid": "IAMPassRole", "Effect": "Allow", "Action": [ "iam:GetRole", "iam:PassRole" ], "Resource": "--Provide Resource ARN--" }, { "Sid": "ListAccess", "Effect": "Allow", "Action": [ "forecast:ListDatasetImportJobs", "forecast:ListDatasetGroups", "forecast:ListPredictorBacktestExportJobs", "forecast:ListForecastExportJobs", "forecast:ListForecasts", "forecast:ListPredictors", "forecast:ListDatasets" ], "Resource": "*" } ] }
ポリシー 2: Amazon S3、AWS KMS、Amazon CloudWatch、およびリソースグループへのアクセス
次のポリシーは、Amazon S3 および AWS KMS リソースにアクセスする権限を付与します。 アマゾンクラウドウォッチ。 これにより、テナント固有の S3 プレフィックスとテナント固有の CMK へのアクセスが制限されます。 テナントの検証条件は次のとおりです 太字のコード.
{ "Version": "2012-10-17", "Statement": [ { "Sid": "S3Storage", "Effect": "Allow", "Action": [ "s3:*" ---> To be modifed based on application needs ], "Resource": [ "arn:aws:s3:::<bucketname>", "arn:aws:s3:::<bucketname>/*" ], "Conditio
n": { "StringLike": { "s3:prefix": [ "${aws:PrincipalTag/tenant}", "${aws:PrincipalTag/tenant}/*" ] } } }, { "Sid": "ResourceGroup", "Effect": "Allow", "Action": [ "resource-groups:SearchResources", "tag:GetResources", "tag:getTagKeys", "tag:getTagValues", "resource-explorer:List*", "cloudwatch:PutMetricData" ], "Resource": "*" }, { "Sid": "KMS", "Effect": "Allow", "Action": [ "kms:Encrypt", "kms:Decrypt", "kms:CreateGrant", "kms:RevokeGrant", "kms:RetireGrant", "kms:ListGrants", "kms:DescribeKey", "kms:GenerateDataKey" ], "Resource": "*", "Condition": { "StringEquals": { "aws:ResourceTag/tenant": "${aws:PrincipalTag/tenant}" } } } ] }
リソースグループを作成する
リソース グループを使用すると、タグ付けされたすべてのリソースをテナントがクエリできるようになります。 次のコード例では、 AWSコマンドラインインターフェイス (AWS CLI) のリソースグループを作成するには TenantA
:
aws resource-groups create-group --name TenantA --tags tenant=tenant_a --resource-query '{"Type":"TAG_FILTERS_1_0", "Query":"{"ResourceTypeFilters":["AWS::AllSupported"],"TagFilters":[{"Key":"tenant", "Values":["tenant_a"]}]}"}'
予測申請の流れ
次の図は、Forecast アプリケーションのフローを示しています。 アプリケーション サービスはテナントの IAM ロールを引き受け、ビジネス フローの一部として Forecast API を呼び出します。
TenantB の予測変数を作成する
作成したリソースにはテナント タグを付ける必要があります。 次のコードは、Python (Boto3) API を使用して TenantB の予測子を作成します (「 太字のコード 詳細については):
//Run under TenantB role TenantB_Application_Role session = boto3.Session() forecast = session.client(service_name='forecast') ... response=forecast.create_dataset( Domain="CUSTOM", DatasetType='TARGET_TIME_SERIES', DatasetName=datasetName, DataFrequency=DATASET_FREQUENCY, Schema = schema, Tags = [{'Key':'tenant','Value':'tenant_b'}], EncryptionConfig={'KMSKeyArn':'KMS_TenantB_ARN', 'RoleArn':Forecast_TenantB_Role} ) ... create_predictor_response=forecast.create_predictor( ... EncryptionConfig={ 'KMSKeyArn':'KMS_TenantB _ARN', 'RoleArn':Forecast_TenantB_Role}, Tags = [{'Key':'tenant','Value':'tenant_b'}], ... }) predictor_arn=create_predictor_response['PredictorArn']
TenantB の予測子に関する予測を作成する
次のコードは、Python (Boto3) API を使用して、作成した予測子の予測を作成します。
//Run under TenantB role TenantB_Application_Role session = boto3.Session() forecast = session.client(service_name='forecast') ... create_forecast_response=create_forecast_response=forecast.create_forecast( ForecastName=forecastName, PredictorArn=predictor_arn, Tags = [{'Key':'tenant','Value':'tenant_b'}]) tenant_b_forecast_arn = create_forecast_response['ForecastArn']
Forecast リソースへのアクセスを検証する
このセクションでは、それぞれのテナントのみが Forecast リソースにアクセスできることを確認します。 別のテナントに属する Forecast リソースにアクセス、変更、または削除すると、エラーがスローされます。 次のコードは、Python (Boto3) API を使用して、TenantA が TenantB Forecast リソースを削除しようとする様子を示しています。
//Run under TenantA role TenantA_Application_Role session = boto3.Session() forecast = session.client(service_name='forecast') .. forecast.delete_forecast(ForecastArn= tenant_b_forecast_arn) ClientError: An error occurred (AccessDeniedException) when calling the DeleteForecast operation: User: arn:aws:sts::<accountid>:assumed-role/TenantA_Application_Role/tenant-a-role is not authorized to perform: forecast:DeleteForecast on resource: arn:aws:forecast:<region>:<accountid>:forecast/tenantb_deeparp_algo_forecast
予測変数のリストと監視
次のコード例では、Python (Boto3) API を使用して、リソース グループを使用して TenantA の予測予測子をクエリします。:
//Run under TenantA role TenantA_Application_Role session = boto3.Session() resourcegroup = session.client(service_name='resource-groups') query="{"ResourceTypeFilters":["AWS::Forecast::Predictor"],"TagFilters":[{"Key":"tenant", "Values":["tenant_a"]}]}" Tenant Tag needs to be specified. response = resourcegroup.search_resources( ResourceQuery={ 'Type': 'TAG_FILTERS_1_0', 'Query': query }, MaxResults=20 ) predictor_count=0 for resource in response['ResourceIdentifiers']: print(resource['ResourceArn']) predictor_count=predictor_count+1
として AWS の適切に設計されたフレームワーク サービス クォータ (サービス クォータとも呼ばれます) を監視することが重要であると説明しています。 サービス制限)。 予測にはアカウントごとに制限があります。 詳細については、を参照してください。 ガイドラインと割り当て.
次のコードは、CloudWatch メトリクスに予測子の合計数を入力する例です。
cloudwatch = session.client(service_name='cloudwatch') cwresponse = cloudwatch.put_metric_data(Namespace='TenantA_PredictorCount',MetricData=[ { 'MetricName': 'TotalPredictors', 'Value': predictor_count }] )
その他の考慮事項
リソース制限とスロットリングは、テナント全体でアプリケーションによって管理する必要があります。 対応できない場合は、 予測限界、マルチアカウント構成を検討する必要があります。
予測リスト API またはリソース グループの応答は、 tenant
タグ値。
まとめ
この投稿では、マルチテナント SaaS アプリケーションで ABAC 手法を使用して Forecast アクセスを分離する方法を説明しました。 テナントタグを使用して、テナントごとに Forecast へのアクセスを制限する方法を説明しました。 さらにタグを適用してポリシーをさらにカスタマイズしたり、この戦略を他の AWS サービスに適用したりできます。
ABAC を認証戦略として使用する方法の詳細については、次を参照してください。 AWSのABACとは何ですか?
著者について
グンジャンガーグ は、AWS 垂直 AI チームのシニア ソフトウェア開発エンジニアです。 Amazon Forecast での現在の役割では、エンジニアリングの問題に重点を置き、エンドユーザーに最大の価値を提供するスケーラブルなシステムの構築に楽しんでいます。 自由時間には、数独とマインスイーパーを楽しんでいます。
マティアス・バッタリア アマゾン ウェブ サービスのテクニカル アカウント マネージャーです。 現在の役割では、クラウドへの移行のあらゆる段階で顧客を支援することに喜びを感じています。 自由時間には、AI/ML プロジェクトの構築を楽しんでいます。
ラケシュラマダ アマゾンウェブサービスのISVソリューションアーキテクトです。 彼の重点分野には、AI / MLとビッグデータが含まれます。
出典: https://aws.amazon.com/blogs/machine-learning/configure-amazon-forecast-for-a-multi-tenant-saas-application/