跨账户、跨区域访问 DynamoDB 表
AWS Glue ETL 任务支持跨账户、跨区域访问 DynamoDB 表。AWS GlueETL 任务支持从其他 AWS 账户的 DynamoDB 表读取数据,并将数据写入其他 AWS 账户的 DynamoDB 表。AWS Glue 还支持从其他区域的 DynamoDB 表读取数据并将数据写入其他区域的 DynamoDB 表。本部分提供关于设置访问的说明以及示例脚本。
本部分的过程参考了用于创建 IAM 角色和授予角色访问权限的 IAM 教程。本教程还讨论了担任角色,但在此处,您将使用任务脚本来担任 AWS Glue 中的角色。本教程还包含有关常规跨账户实践的信息。有关更多信息,请参阅《IAM 用户指南》中的教程:使用 IAM 角色委派跨 AWS 账户的访问权限。
创建角色
按照教程中的步骤 1 在账户 A 中创建 IAM 角色。在定义角色的权限时,您可以选择附加现有策略(例如 AmazonDynamoDBReadOnlyAccess
或 AmazonDynamoDBFullAccess
)以允许角色读取/写入 DynamoDB。以下示例演示了如何使用权限策略 AmazonDynamoDBFullAccess
创建名为 DynamoDBCrossAccessRole
的角色。
向角色授予访问权限
遵循《IAM 用户指南》中的教程中的步骤 2,允许账户 B 切换到新创建的角色。以下示例使用以下语句创建新策略:
{ "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Action": "sts:AssumeRole", "Resource": "<DynamoDBCrossAccessRole's ARN>" } }
然后,您可以将此策略附加到要用于访问 DynamoDB 的组/角色/用户。
担任 AWS Glue 作业脚本中的角色
现在,您可以登录账户 B 并创建 AWS Glue 任务。要创建任务,请参阅在 AWS Glue 中为 Spark 作业配置作业属性中的说明。
在任务脚本中,您需要使用 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()