

# 跨账户、跨区域访问 DynamoDB 表
<a name="aws-glue-programming-etl-dynamo-db-cross-account"></a>

AWS Glue ETL 任务支持跨账户、跨区域访问 DynamoDB 表。AWS GlueETL 任务支持从其他 AWS 账户的 DynamoDB 表读取数据，并将数据写入其他 AWS 账户的 DynamoDB 表。AWS Glue 还支持从其他区域的 DynamoDB 表读取数据并将数据写入其他区域的 DynamoDB 表。本部分提供关于设置访问的说明以及示例脚本。

本部分的过程参考了用于创建 IAM 角色和授予角色访问权限的 IAM 教程。本教程还讨论了担任角色，但在此处，您将使用任务脚本来担任 AWS Glue 中的角色。本教程还包含有关常规跨账户实践的信息。有关更多信息，请参阅《IAM 用户指南》**中的[教程：使用 IAM 角色委派跨 AWS 账户的访问权限](https://docs.aws.amazon.com/IAM/latest/UserGuide/tutorial_cross-account-with-roles.html)。

## 创建角色
<a name="aws-glue-programming-etl-dynamo-db-create-role"></a>

按照[教程中的步骤 1](https://docs.aws.amazon.com/IAM/latest/UserGuide/tutorial_cross-account-with-roles.html#tutorial_cross-account-with-roles-1) 在账户 A 中创建 IAM 角色。在定义角色的权限时，您可以选择附加现有策略（例如 `AmazonDynamoDBReadOnlyAccess` 或 `AmazonDynamoDBFullAccess`）以允许角色读取/写入 DynamoDB。以下示例演示了如何使用权限策略 `AmazonDynamoDBFullAccess` 创建名为 `DynamoDBCrossAccessRole` 的角色。

## 向角色授予访问权限
<a name="aws-glue-programming-etl-dynamo-db-grant-access"></a>

遵循《IAM 用户指南》**中的[教程中的步骤 2](https://docs.aws.amazon.com/IAM/latest/UserGuide/tutorial_cross-account-with-roles.html#tutorial_cross-account-with-roles-2)，允许账户 B 切换到新创建的角色。以下示例使用以下语句创建新策略：

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": {
    "Effect": "Allow",
    "Action": "sts:AssumeRole",
    "Resource": "arn:aws:iam::111122223333:role/DynamoDBCrossAccessRole"
  }
}
```

------

然后，您可以将此策略附加到要用于访问 DynamoDB 的组/角色/用户。

## 担任 AWS Glue 作业脚本中的角色
<a name="aws-glue-programming-etl-dynamo-db-assume-role"></a>

现在，您可以登录账户 B 并创建 AWS Glue 任务。要创建任务，请参阅[在 AWS Glue 中为 Spark 作业配置作业属性](add-job.md)中的说明。

在任务脚本中，您需要使用 `dynamodb.sts.roleArn` 参数担任 `DynamoDBCrossAccessRole` 角色。假设此角色允许您获取临时凭证，这些凭证需要用于访问账户 B 中的 DynamoDB。请查看这些示例脚本。

对于跨区域跨账户读取（ETL 连接器）：

```
import sys
from pyspark.context import SparkContext
from awsglue.context import GlueContext
from awsglue.job import Job
from awsglue.utils import getResolvedOptions

args = getResolvedOptions(sys.argv, ["JOB_NAME"])
glue_context= GlueContext(SparkContext.getOrCreate())
job = Job(glue_context)
job.init(args["JOB_NAME"], args)

dyf = glue_context.create_dynamic_frame_from_options(
    connection_type="dynamodb",
    connection_options={
    "dynamodb.region": "us-east-1",
    "dynamodb.input.tableName": "test_source",
    "dynamodb.sts.roleArn": "<DynamoDBCrossAccessRole's ARN>"
    }
)
dyf.show()
job.commit()
```

对于跨区域跨账户读取（ELT 连接器）：

```
import sys
from pyspark.context import SparkContext
from awsglue.context import GlueContext
from awsglue.job import Job
from awsglue.utils import getResolvedOptions

args = getResolvedOptions(sys.argv, ["JOB_NAME"])
glue_context= GlueContext(SparkContext.getOrCreate())
job = Job(glue_context)
job.init(args["JOB_NAME"], args)

dyf = glue_context.create_dynamic_frame_from_options(
    connection_type="dynamodb",
    connection_options={
        "dynamodb.export": "ddb",
        "dynamodb.tableArn": "<test_source ARN>",
        "dynamodb.sts.roleArn": "<DynamoDBCrossAccessRole's ARN>"
    }
)
dyf.show()
job.commit()
```

对于跨区域的读取和跨账户写入：

```
import sys
from pyspark.context import SparkContext
from awsglue.context import GlueContext
from awsglue.job import Job
from awsglue.utils import getResolvedOptions
 
args = getResolvedOptions(sys.argv, ["JOB_NAME"])
glue_context= GlueContext(SparkContext.getOrCreate())
job = Job(glue_context)
job.init(args["JOB_NAME"], args)
 
dyf = glue_context.create_dynamic_frame_from_options(
    connection_type="dynamodb",
    connection_options={
        "dynamodb.region": "us-east-1",
        "dynamodb.input.tableName": "test_source"
    }
)
dyf.show()
 
glue_context.write_dynamic_frame_from_options(
    frame=dyf,
    connection_type="dynamodb",
    connection_options={
        "dynamodb.region": "us-west-2",
        "dynamodb.output.tableName": "test_sink",
        "dynamodb.sts.roleArn": "<DynamoDBCrossAccessRole's ARN>"
    }
)
 
job.commit()
```