

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 配置对 Amazon DynamoDB 的跨账户访问
<a name="configure-cross-account-access-to-amazon-dynamodb"></a>

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

## Summary
<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)极大地简化了跨账户工作负载的安全态势。此模式提供了步骤和示例代码，用于演示如何将 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)页面，然后选择相应服务的链接。

## 架构
<a name="configure-cross-account-access-to-amazon-dynamodb-architecture"></a>

下图显示了单账户架构。 AWS Lambda、亚马逊 Elastic Compute Cloud（亚马逊 EC2）和 DynamoDB 都在同一个账户中。在这种情况下，Lambda 函数和亚马逊 EC2 实例可以访问 DynamoDB。要授予对 DynamoDB 表的访问权限，您可以在 IAM 中创建基于身份的策略，也可以在 DynamoDB 中创建基于资源的策略。

![使用 IAM 权限访问同一账户中的 DynamoDB 表。](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/bfc32fe8-5db0-4cac-a30f-b870a1a82875/images/cbb009eb-422d-4833-a1bc-0c571d83c21f.png)


下图显示了多账户架构。如果一个中的资源 AWS 账户 需要访问其他账户中的 DynamoDB 表，则需要在 DynamoDB 中设置基于资源的策略来授予所需的访问权限。例如，在下图中，使用基于资源的策略向账户 B 中的 Lambda 函数授予访问账户 A 中的 DynamoDB 表的权限。

![使用基于资源的策略以访问另一账户中的 DynamoDB 表。](http://docs.aws.amazon.com/zh_cn/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) 是一项计算服务，可帮助您运行代码，无需预调配或管理服务器。它只在需要时运行您的代码，并自动进行扩展，因此您只需为使用的计算时间付费。

**代码**

此模式包含[其他信息](#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>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 在账户 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_cn/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_cn/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/zh_cn/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>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 创建 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><br />在此代码命令示例中，替换以下内容：[See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/configure-cross-account-access-to-amazon-dynamodb.html)您可以使用 `--resource-policy` 标志在 `create-table` 语句中指定基于资源的策略配置。此策略引用账户 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>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 创建一个 Lambda 函数，以向 DynamoDB 写入数据。 | [See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_cn/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>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 删除资源。 | 要避免产生与在此模式中创建的资源相关的成本，请执行以下操作，删除这些资源：[See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_cn/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)（Dynam oDB 文档）
+ [创建 IAM policy](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 表。