

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

# Amazon DynamoDB へのクロスアカウントアクセスを設定する
<a name="configure-cross-account-access-to-amazon-dynamodb"></a>

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

## 概要
<a name="configure-cross-account-access-to-amazon-dynamodb-summary"></a>

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

[DynamoDB のリソースベースのポリシー](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/access-control-resource-based.html)は、クロスアカウントワークロードのセキュリティ体制を大幅に簡素化します。このパターンでは、別のアカウントの DynamoDB データベーステーブルにデータを書き込む AWS アカウント ように 1 つの で AWS Lambda 関数を設定する方法を示すステップとサンプルコードを示します。

## 前提条件と制限
<a name="configure-cross-account-access-to-amazon-dynamodb-prereqs"></a>

**前提条件**
+ 2 つの がアクティブです AWS アカウント。このパターンでは、これらのアカウントを*アカウント A* と*アカウント B* と呼びます。
+ AWS Command Line Interface (AWS CLI) [をインストール](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)し、アカウント A にアクセスするように[設定](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-configure.html)して、DynamoDB テーブルを作成します。このパターンの他のステップでは、IAM、DynamoDB、および Lambda コンソールの使用手順について説明します。 AWS CLI 代わりに を使用する場合は、両方のアカウントにアクセスするように設定してください。

**制限事項**
+ 一部の AWS のサービス は では使用できません AWS リージョン。利用可能なリージョンについては、「[AWS のサービス (リージョン別)](https://aws.amazon.com/about-aws/global-infrastructure/regional-product-services/)」を参照してください。特定のエンドポイントについては、「[サービスエンドポイントとクォータ](https://docs.aws.amazon.com/general/latest/gr/aws-service-information.html)」ページを参照して、サービスのリンクを選択します。

## アーキテクチャ
<a name="configure-cross-account-access-to-amazon-dynamodb-architecture"></a>

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

![IAM アクセス許可を使用して、同じアカウントの DynamoDB テーブルにアクセスする。](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/images/pattern-img/bfc32fe8-5db0-4cac-a30f-b870a1a82875/images/cbb009eb-422d-4833-a1bc-0c571d83c21f.png)


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

![リソースベースのポリシーを使用して、別のアカウントの DynamoDB テーブルにアクセスする。](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/images/pattern-img/bfc32fe8-5db0-4cac-a30f-b870a1a82875/images/9f9165a8-b767-4427-a2ae-31b5b8c83326.png)


このパターンでは、Lambda と DynamoDB 間のクロスアカウントアクセスについて説明します。両方のアカウントに適切なアクセス許可 AWS のサービス が設定されている場合、他の にも同様の手順を使用できます。例えば、アカウント A の Amazon Simple Storage Service (Amazon S3) バケットへのアクセスを Lambda 関数に許可する場合は、Amazon S3 で[リソースベースのポリシー](https://docs.aws.amazon.com/AmazonS3/latest/userguide/bucket-policies.html)を作成し、アカウント B の [Lambda 実行ロール](https://docs.aws.amazon.com/lambda/latest/dg/lambda-intro-execution-role.html)にアクセス許可を追加します。

## ツール
<a name="configure-cross-account-access-to-amazon-dynamodb-tools"></a>

**AWS のサービス**
+ [Amazon DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Introduction.html) は、フルマネージド NoSQL データベースサービスです。高速かつ予測可能でスケーラブルなパフォーマンスを提供します。
+ [AWS Identity and Access Management (IAM)](https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction.html) は、AWS リソースの使用を認証および認可されたユーザーを制御することで、AWS リソースへのアクセスを安全に管理するのに役立ちます。
+ [AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html) は、サーバーのプロビジョニングや管理を行うことなくコードを実行できるコンピューティングサービスです。必要に応じてコードを実行し、自動的にスケーリングするため、課金は実際に使用したコンピューティング時間に対してのみ発生します。

**Code**

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

## ベストプラクティス
<a name="configure-cross-account-access-to-amazon-dynamodb-best-practices"></a>
+ DynamoDB ドキュメントの「[DynamoDB リソースベースのポリシーに関するベストプラクティス](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/rbac-best-practices.html)」に従ってください。
+ 最小特権の原則に従い、タスクの実行に必要最小限のアクセス許可を付与します。詳細については、IAM ドキュメントの「[最小限の特権を認める。](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#grant-least-priv)」と「[IAM でのセキュリティのベストプラクティス](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html)」を参照してください。

## エピック
<a name="configure-cross-account-access-to-amazon-dynamodb-epics"></a>

### アカウント B で Lambda 関数の IAM ポリシーとロールを作成する
<a name="create-an-iam-policy-and-role-for-the-lam-function-in-account-b"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| アカウント B でポリシーを作成する | この IAM ポリシーは、アカウント A の DynamoDB テーブルの [PutItem](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_PutItem.html) アクションを許可します。[See the AWS documentation website for more details](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/configure-cross-account-access-to-amazon-dynamodb.html) | AWS 全般 | 
| アカウント A でロールを作成する | アカウント B の Lambda 関数は、この IAM ロールを使用して、アカウント A の DynamoDB テーブルにアクセスします。[See the AWS documentation website for more details](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/configure-cross-account-access-to-amazon-dynamodb.html)<br />ロールの作成の詳細については、「[IAM ドキュメント](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-service.html)」を参照してください。 | AWS 全般 | 
| ロールの ARN を書き留めておきます。 | [See the AWS documentation website for more details](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/configure-cross-account-access-to-amazon-dynamodb.html) | AWS 全般 | 

### アカウント A でDynamoDB テーブルを作成する
<a name="create-a-ddb-table-in-account-a"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| DynamoDB テーブルを作成します。 | DynamoDB テーブルを作成するには、次の AWS CLI コマンドを使用します。<pre> aws dynamodb create-table \<br />    --table-name Table-Account-A \<br />    --attribute-definitions \<br />      AttributeName=category,AttributeType=S \<br />      AttributeName=item,AttributeType=S \<br />    --key-schema \<br />      AttributeName=category,KeyType=HASH \<br />      AttributeName=item,KeyType=RANGE \<br />    --provisioned-throughput \<br />      ReadCapacityUnits=5,WriteCapacityUnits=5 \<br />    --resource-policy \<br />      '{         <br />          "Version": "2012-10-17",		 	 	 <br />          "Statement": [<br />            {                    <br />               "Sid": "Statement1",<br />               "Effect": "Allow",<br />               "Principal": {<br />                  "AWS": "arn:aws:iam::<Account-B-ID>:role/<Role-Name>"<br />               },<br />               "Action": "dynamodb:PutItem",<br />               "Resource": "arn:aws:dynamodb:<Region>:<Account-A-ID>:table/Table-Account-A"<br />            }            <br />         ]<br />      }'</pre><br />このコードサンプルでは、以下を置き換えます。[See the AWS documentation website for more details](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/configure-cross-account-access-to-amazon-dynamodb.html)`create-table` ステートメントでリソースベースのポリシー設定を指定するには、`--resource-policy` フラグを使用します。このポリシーは、アカウント A の DynamoDB テーブルの ARN を参照します。<br />テーブルの作成の詳細については、「[DynamoDB のドキュメント](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GettingStartedDynamoDB.html)」を参照してください。 | AWS 全般 | 

### アカウント B で Lambda 関数を作成する
<a name="create-a-lam-function-in-account-b"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| DynamoDB にデータを書き込むLambda 関数を作成します。 | [See the AWS documentation website for more details](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/configure-cross-account-access-to-amazon-dynamodb.html)Lambda 関数の作成についての詳細は、「[Lambda ドキュメント](https://docs.aws.amazon.com/lambda/latest/dg/getting-started-create-function.html)」を参照してください。 | AWS 全般 | 

### クリーンアップ
<a name="clean-up"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| リソースの削除 | このパターンで作成されたリソースに関連するコストが発生しないようにするには、以下を実行して、これらのリソースを削除します。[See the AWS documentation website for more details](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/configure-cross-account-access-to-amazon-dynamodb.html) | AWS 全般 | 

## トラブルシューティング
<a name="configure-cross-account-access-to-amazon-dynamodb-troubleshooting"></a>


| 問題 | ソリューション | 
| --- | --- | 
| Lambda 関数を作成すると、`ResourceNotFoundException` エラーが表示される | アカウント A の AWS リージョン と ID が正しく入力されていることを確認します。これらは DynamoDB テーブルの ARN の一部です。 | 

## 関連リソース
<a name="configure-cross-account-access-to-amazon-dynamodb-resources"></a>
+ 「[DynamoDB の使用を開始する](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GettingStartedDynamoDB.html)」(DynamoDB ドキュメント)
+ [最初の Lambda 関数を作成する](https://docs.aws.amazon.com/lambda/latest/dg/getting-started.html) (Lambda ドキュメント)
+ [DynamoDB 用のリソースベースのポリシーを使用する](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/access-control-resource-based.html) (DynamoDB ドキュメント)
+ 「[IAM ポリシーの作成](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create.html)」(IAM ドキュメント)
+ 「[クロスアカウントポリシーの評価ロジック](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_evaluation-logic-cross-account.html)」(IAM ドキュメント)
+ 「[IAM JSON ポリシー要素のリファレンス](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements.html)」(IAM ドキュメント)

## 追加情報
<a name="configure-cross-account-access-to-amazon-dynamodb-additional"></a>

「サンプルコード」

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