Amazon DynamoDB へのクロスアカウントアクセスを設定する - AWS 規範ガイダンス

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

Amazon DynamoDB へのクロスアカウントアクセスを設定する

作成者: Shashi Dalmia (AWS)、Esteban Serna Parra (AWS)、Imhoertha Ojior (AWS)

概要

このパターンでは、リソースベースのポリシーを使用して Amazon DynamoDB へのクロスアカウントアクセスを設定する手順について説明します。DynamoDB を使用するワークロードでは、ワークロード分離戦略を使用してセキュリティの脅威を最小限に抑え、コンプライアンス要件を満たすことがより一般的になっています。ワークロード分離戦略を実装するには、 AWS Identity and Access Management (IAM) アイデンティティベースのポリシーを使用して DynamoDB リソースへのクロスアカウントおよびクロスリージョンアクセスが必要になることがよくあります。これには、IAM アクセス許可の設定と、 間の信頼関係の確立が含まれます AWS アカウント。

DynamoDB のリソースベースのポリシーは、クロスアカウントワークロードのセキュリティ体制を大幅に簡素化します。このパターンでは、別のアカウントの DynamoDB データベーステーブルにデータを書き込む AWS アカウント ように AWS Lambda 関数を 1 つに設定する方法を示すステップとサンプルコードを示します。

前提条件と制限

前提条件

  • 2 つの がアクティブです AWS アカウント。このパターンでは、これらのアカウントを「アカウント A」と「アカウント B」と呼びます。

  • AWS Command Line Interface (AWS CLI) をインストールし、アカウント A にアクセスするように設定して、DynamoDB テーブルを作成します。このパターンの他のステップでは、IAM、DynamoDB、および Lambda コンソールの使用手順について説明します。 AWS CLI 代わりに を使用する予定の場合は、両方のアカウントにアクセスするように設定します。

制約事項

アーキテクチャ

次の図は、単一アカウントアーキテクチャを示しています。 AWS Lambda、Amazon Elastic Compute Cloud (Amazon EC2)、DynamoDB はすべて同じアカウントにあります。このシナリオでは、Lambda 関数と Amazon EC2 インスタンスが DynamoDB にアクセスできます。DynamoDB テーブルへのアクセスを許可するには、IAM でアイデンティティベースのポリシーを作成するか、DynamoDB でリソースベースのポリシーを作成できます。

IAM アクセス許可を使用して、同じアカウントの DynamoDB テーブルにアクセスする。

次の図は、マルチアカウントアーキテクチャを示しています。1 つの のリソースが別のアカウントの DynamoDB テーブルにアクセス AWS アカウント する必要がある場合は、DynamoDB でリソースベースのポリシーを設定して、必要なアクセスを許可する必要があります。たとえば、次の図では、リソースベースのポリシーを使用して、アカウント A の DynamoDB テーブルへのアクセスがアカウント B の Lambda 関数に許可されています。

リソースベースのポリシーを使用して、別のアカウントの DynamoDB テーブルにアクセスする。

このパターンでは、Lambda と DynamoDB 間のクロスアカウントアクセスについて説明します。両方のアカウントに適切なアクセス許可 AWS のサービス が設定されている場合は、他の にも同様の手順を使用できます。たとえば、アカウント A の Amazon Simple Storage Service (Amazon S3) バケットへのアクセスを Lambda 関数に許可する場合は、Amazon S3 でリソースベースのポリシーを作成し、アカウント B の Lambda 実行ロールにアクセス許可を追加できます。

ツール

AWS のサービス

  • Amazon DynamoDB は、フルマネージド NoSQL データベースサービスです。高速かつ予測可能でスケーラブルなパフォーマンスを提供します。

  • AWS Identity and Access Management (IAM) は、AWS リソースの使用を認証および許可されているユーザーを制御することで、AWS リソースへのアクセスを安全に管理します。

  • AWS Lambda は、サーバーのプロビジョニングや管理を行うことなくコードを実行できるコンピューティングサービスです。必要に応じてコードを実行し、自動的にスケーリングするため、課金は実際に使用したコンピューティング時間に対してのみ発生します。

コード

このパターンには、「追加情報」セクションのサンプルコードが含まれており、アカウント A の DynamoDB テーブルに書き込むようにアカウント B の Lambda 関数を設定する方法を示しています。コードは、説明とテストの目的でのみ提供されています。このパターンを本番環境に実装する場合は、コードを参照として使用し、独自の環境に合わせてカスタマイズします。

ベストプラクティス

エピック

タスク説明必要なスキル

アカウント B でポリシーを作成します。

この IAM ポリシーは、アカウント A の DynamoDB テーブルの PutItem アクションを許可します。

  1. でアカウント B にサインインします AWS Management Console。

  2. [IAM コンソール] を開きます。

  3. ナビゲーションペインで ポリシーを選択してから ポリシーの作成を選択します。

  4. アクセス許可の指定ページで、ポリシーエディタで JSON を選択します。

  5. 以下のポリシーを入力します。

    { "Version": "2012-10-17", "Statement": [ { "Sid": "Statement1", "Effect": "Allow", "Action": "dynamodb:PutItem", "Resource": "arn:aws:dynamodb:<Region>:<Account-A-ID>:table/Table-Account-A" } ] }
  6. <Region> と を自分の値<Account-A-ID>に置き換え、次を選択します。

  7. ポリシー名には、 など、ポリシーの一意の名前を入力しますDynamoDB-PutItem-Policy

  8. (オプション) ポリシーの説明を追加します。

  9. [Create policy] を選択します。

AWS 全般

アカウント B でロールを作成します。

アカウント B の Lambda 関数は、この IAM ロールを使用してアカウント A の DynamoDB テーブルにアクセスします。

  1. [IAM コンソール] を開きます。

  2. ナビゲーションペインで ロール を選択してから、ロールを作成する を選択します。

  3. [Select trusted entity] (信頼されたエンティティを選択) で、[AWS のサービス] を選択します。

  4. ユースケースセクションで、Lambda を選択します。

  5. [Next: Permissions] (次へ: アクセス許可) を選択します。

  6. [フィルタポリシー] ボックスに DynamoDB と入力します。

  7. DynamoDB ポリシーのリストで、 を選択しますDynamoDB-PutItem-Policy

  8. フィルタポリシーボックスをクリアし、Lambda を入力します。

  9. Lambda ポリシーのリストで、AWSLambdaExecute を選択します。

  10. [次へ:名前、確認、および作成] を選択します。

  11. [ロール名] に、DynamoDB-PutItemAccess などのロールの一意の名前を入力します。

  12. (オプション) ロールの説明を追加します。

  13. (オプション) タグをキーバリューのペアとしてアタッチして、メタデータをロールに追加します。

  14. [ロールの作成] を選択します。

ロールの作成の詳細については、「IAM ドキュメント」を参照してください。

AWS 全般

ロールの ARN を書き留めておきます。

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

  2. ナビゲーションペインで [Roles (ロール) ] を選択します。

  3. 検索ボックスに と入力しDynamoDB-PutItemAccess、ロールを選択します。

  4. ロールの概要ページで、Amazon リソースネーム (ARN) をコピーします。Lambda 関数を設定するときに ARN を使用します。

AWS 全般
タスク説明必要なスキル

DynamoDB テーブルを作成します。

DynamoDB テーブルを作成するには、次の AWS CLI コマンドを使用します。

aws dynamodb create-table \ --table-name Table-Account-A \ --attribute-definitions \ AttributeName=category,AttributeType=S \ AttributeName=item,AttributeType=S \ --key-schema \ AttributeName=category,KeyType=HASH \ AttributeName=item,KeyType=RANGE \ --provisioned-throughput \ ReadCapacityUnits=5,WriteCapacityUnits=5 \ --resource-policy \ '{ "Version": "2012-10-17", "Statement": [ { "Sid": "Statement1", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::<Account-B-ID>:role/<Role-Name>" }, "Action": "dynamodb:PutItem", "Resource": "arn:aws:dynamodb:<Region>:<Account-A-ID>:table/Table-Account-A" } ] }'

このコードサンプルで以下を置き換えます。

  • <Account-B-ID> はアカウント B の ID です。

  • <Role-Name> は、 など、作成した IAM ロールの名前ですDynamoDB-PutItemAccess

  • <Region> は、DynamoDB テーブルを作成する AWS リージョン です。

  • <Account-A-ID> はアカウント A の ID です。

注記

create-table ステートメントでリソースベースのポリシー設定を指定するには、 --resource-policyフラグを使用します。このポリシーは、アカウント A の DynamoDB テーブルの ARN を参照します。

テーブルの作成の詳細については、「DynamoDB のドキュメント」を参照してください。

AWS 全般
タスク説明必要なスキル

DynamoDB にデータを書き込むLambda 関数を作成します。

  1. でアカウント B にサインインします AWS Management Console。

  2. Lambdaのコンソールを開きます。

  3. ナビゲーションペインで、[関数][関数を作成] の順に選択します。

  4. [名前]lambda_write_function と入力します。

  5. [ランタイム] には、[Python 3.8] またはそれ以降を選択します。

  6. 「デフォルトの実行ロールを変更する」で、「既存のロールを使用する」を選択します。

  7. 既存のロールで、 など、作成した IAM ロールを選択しますDynamoDB-PutItemAccess

  8. [Create function (関数の作成)] を選択します。

  9. コードタブで、このパターンの追加情報セクションで提供されているサンプルコードを貼り付けます。このコードサンプルで以下を置き換えます。

    • <Account-A-ID> はアカウント A の ID です。

    • <Region> は、DynamoDB テーブルを作成した AWS リージョン です。

  10. [デプロイ] を選択します。

  11. [テスト] を選択します。これにより、テストイベントを設定するよう求められます。などの任意の名前で新しいイベントを作成しMyTestEventForWrite、設定を保存します。

  12. [テスト] を再度選択します。これにより、指定したイベント名で Lambda 関数が実行されます。

  13. 関数からの出力を確認します。これは、関数がアカウント A の DynamoDB テーブルにアクセスし、それにデータを書き込めたことを示します。

Lambda 関数の作成についての詳細は、「Lambda ドキュメント」を参照してください。

AWS 全般
タスク説明必要なスキル

リソースの削除

このパターンで作成されたリソースに関連するコストが発生しないようにするには、次の操作を実行してこれらのリソースを削除します。

  1. アカウント B で、DynamoDB に接続するために作成した Lambda 関数を削除します。手順については、Lambda ドキュメントを参照してください。

  2. アカウント A で、作成した DynamoDB テーブルを削除します。手順については、DynamoDB ドキュメントを参照してください。

  3. セキュリティのベストプラクティスについては、不要になった IAM ポリシー (DynamoDB-PutItem-Policy) を削除します。詳細については、「IAM ドキュメント」を参照してください。

  4. セキュリティのベストプラクティスとして、不要になった IAM ロール (DynamoDB-PutItemAccess) を削除します。詳細については、「IAM ドキュメント」を参照してください。

AWS 全般

トラブルシューティング

問題ソリューション

Lambda 関数を作成すると、ResourceNotFoundExceptionエラーが表示されます。

アカウント A の AWS リージョン と ID が正しく入力されていることを確認します。これらは DynamoDB テーブルの ARN の一部です。

関連リソース

追加情報

「サンプルコード」

import boto3 from datetime import datetime dynamodb_client = boto3.client('dynamodb') def lambda_handler(event, context): now = datetime.now().isoformat() data = dynamodb_client.put_item(TableName='arn:aws:dynamodb:<Region>:<Account-A-ID>:table/Table-Account-A', Item={"category": {"S": "Fruit"},"item": {"S": "Apple"},"time": {"S": now}}) return data
注記

DynamoDB クライアントがインスタンス化されると、テーブル名の代わりに DynamoDB テーブルの ARN が提供されます。これは、Lambda 関数が実行時に正しい DynamoDB テーブルに接続するために必要です。