

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 設定對 Amazon DynamoDB 的跨帳戶存取權
<a name="configure-cross-account-access-to-amazon-dynamodb"></a>

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

## 總結
<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)將安全威脅降至最低並符合合規要求變得越來越常見。實作工作負載隔離策略通常需要跨帳戶和跨區域存取 DynamoDB 資源，方法是使用 AWS Identity and Access Management (IAM) 身分型政策。這包括設定 IAM 許可，以及在 之間建立信任關係 AWS 帳戶。

[DynamoDB 的資源型政策](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/access-control-resource-based.html)可大幅簡化跨帳戶工作負載的安全狀態。此模式提供步驟和範例程式碼，示範如何在一個 中設定 AWS Lambda 函數 AWS 帳戶 ，以將資料寫入不同帳戶中的 DynamoDB 資料庫資料表。

## 先決條件和限制
<a name="configure-cross-account-access-to-amazon-dynamodb-prereqs"></a>

**先決條件**
+ 兩個作用中 AWS 帳戶。此模式將這些帳戶稱為*帳戶 A *和*帳戶 B*。
+ AWS Command Line Interface (AWS CLI) [已安裝](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)並[設定為](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-configure.html)存取帳戶 A，以建立 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)頁面，然後選擇服務的連結。

## Architecture
<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/zh_tw/prescriptive-guidance/latest/patterns/images/pattern-img/bfc32fe8-5db0-4cac-a30f-b870a1a82875/images/cbb009eb-422d-4833-a1bc-0c571d83c21f.png)


下圖顯示多帳戶架構。如果其中一個資源 AWS 帳戶 需要存取不同帳戶中的 DynamoDB 資料表，您需要在 DynamoDB 中設定資源型政策，以授予所需的存取權。例如，在下圖中，帳戶 A 中 DynamoDB 資料表的存取權是透過使用資源型政策授予帳戶 B 中 Lambda 函數的。

![\[使用資源型政策來存取不同帳戶中的 DynamoDB 資料表。\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/images/pattern-img/bfc32fe8-5db0-4cac-a30f-b870a1a82875/images/9f9165a8-b767-4427-a2ae-31b5b8c83326.png)


此模式描述 Lambda 和 DynamoDB 之間的跨帳戶存取。 AWS 服務 如果兩個帳戶都設定了適當的許可，則可以對其他帳戶使用類似的步驟。例如，如果您想要提供 Lambda 函數存取帳戶 A 中的 Amazon Simple Storage Service (Amazon S3) 儲存貯體，您可以在 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 Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html) 是一項運算服務，可協助您執行程式碼，無需佈建或管理伺服器。它只會在需要時執行程式碼並自動擴展，因此您只需支付使用的運算時間。

**Code**

此模式包含[額外資訊](#configure-cross-account-access-to-amazon-dynamodb-additional)區段中的範例程式碼，示範如何在帳戶 B 中設定 Lambda 函數，以寫入帳戶 A 中的 DynamoDB 資料表。此程式碼僅供說明和測試之用。如果您要在生產環境中實作此模式，請使用程式碼做為參考，並針對您自己的環境進行自訂。

## 最佳實務
<a name="configure-cross-account-access-to-amazon-dynamodb-best-practices"></a>
+ 遵循 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)和[安全最佳實務](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>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 在帳戶 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/zh_tw/prescriptive-guidance/latest/patterns/configure-cross-account-access-to-amazon-dynamodb.html) | 一般 AWS | 
| 在帳戶 B 中建立角色。 | 帳戶 B 中的 Lambda 函數使用此 IAM 角色來存取帳戶 A 中的 DynamoDB 資料表。[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/configure-cross-account-access-to-amazon-dynamodb.html)如需建立角色的詳細資訊，請參閱 [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/zh_tw/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>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 建立 DynamoDB 資料表。 | 使用下列 AWS CLI 命令來建立 DynamoDB 資料表。<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>取代此程式碼範例中的以下內容：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/configure-cross-account-access-to-amazon-dynamodb.html)您可以使用 `--resource-policy`旗標，在 `create-table`陳述式中指定資源型政策組態。此政策是指帳戶 A 中 DynamoDB 資料表的 ARN。如需建立資料表的詳細資訊，請參閱 [DynamoDB 文件](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GettingStartedDynamoDB.html)。 | 一般 AWS | 

### 在帳戶 B 中建立 Lambda 函數
<a name="create-a-lam-function-in-account-b"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 建立 Lambda 函數以將資料寫入 DynamoDB。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/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>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 刪除 資源。 | 若要避免產生與此模式中建立的資源相關的成本，請執行下列動作來刪除這些資源：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/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 資料表。