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

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

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

Amazon Web Services、Shashi Dalmia、Imhoertha Ojior、Esteban Serna Parra

概要

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

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

前提条件と制限

前提条件

  • 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 テーブルにアクセスする。

次の図は、マルチアカウントのアーキテクチャを示しています。ある のリソースが別のアカウントの 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 は、サーバーのプロビジョニングや管理を行うことなくコードを実行できるコンピューティングサービスです。必要に応じてコードを実行し、自動的にスケーリングするため、課金は実際に使用したコンピューティング時間に対してのみ発生します。

Code

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

ベストプラクティス

エピック

タスク説明必要なスキル

アカウント B でポリシーを作成する

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

  1. でアカウント B にサインインします AWS マネジメントコンソール。

  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 全般

アカウント A でロールを作成する

アカウント 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. ナビゲーションペインで [ロール] を選択します。

  3. 検索ボックスに「DynamoDB-PutItemAccess」と入力し、ポリシーを選択します。

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

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 マネジメントコンソール。

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

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

  4. [名前] にlambda_write_functionと入力してください。

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

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

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

  8. [関数の作成] を選択してください。

  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 テーブルに接続するために必要です。