对 DynamoDB 表的跨账户跨区域访问 - AWS Glue
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

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

对 DynamoDB 表的跨账户跨区域访问

AWS GlueETL 作业支持对 DynamoDB 表的跨区域和跨账户访问。AWS GlueETL 作业支持从其他 AWS 账户的 DynamoDB 表读取数据,以及将数据写入其他 AWS 账户的 DynamoDB 表。AWS Glue 还支持从其他区域中的 DynamoDB 表读取数据,以及写入其他区域中的 DynamoDB 表。本节提供有关设置访问权限的说明,并提供示例脚本。

本节中的过程参考 IAM 教程,该教程用于创建 IAM 角色和授予对角色的访问权限。本教程还讨论代入角色,但在这里,您将改为使用作业脚本代入 AWS Glue 中的角色。本教程还包含有关常规跨账户实践的信息。有关更多信息,请参阅教程:。 使用 IAM 角色委派跨 AWS 账户的访问权限

创建角色

按照本教程中的步骤 1 在账户 A 中创建一个 IAM 角色。在定义该角色的权限时,您可以选择附加现有策略(如 AmazonDynamoDBReadOnlyAccess)或 AmazonDynamoDBFullAccess,以允许该角色读取/写入 DynamoDB。以下示例显示了使用权限策略 DynamoDBCrossAccessRole 创建名为 AmazonDynamoDBFullAccess 的角色。

向 角色授予 访问权限

按照本教程中的步骤 2 操作以允许账户 B 切换到新创建的角色。以下示例使用以下语句创建新策略:

{ "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Action": "sts:AssumeRole", "Resource": "<DynamoDBCrossAccessRole's ARN>" } }

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

代入 AWS Glue 作业脚本中的角色

现在,您可以登录到账户 B 并创建 AWS Glue 作业。在作业脚本中,您需要使用 dynamodb.sts.roleArn 参数来代入 DynamoDBCrossAccessRole 角色。担任此角色后,您可以获取临时凭证,这些凭证需要用于访问账户 B 中的 DynamoDB。查看这些示例脚本。

对于跨账户跨区域的读取:

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()

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

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()