Cross-Account Cross-Region Access to DynamoDB Tables - AWS Glue
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

如果我们为英文版本指南提供翻译,那么如果存在任何冲突,将以英文版本指南为准。在提供翻译时使用机器翻译。

Cross-Account Cross-Region Access to DynamoDB Tables

AWS Glue ETL职位支持跨地区和跨客户访问 DynamoDB 表。 AWS GlueETL工作支持从另一个AWS帐户读取数据 DynamoDB 并将数据写入另一个AWS帐户 DynamoDB 表。 AWS Glue 同时还支持 DynamoDB 其他地区的表格,并写入 DynamoDB 其他区域的表格。本节提供了有关设置访问权限的说明,并提供示例脚本。

本节中的程序参考了创建IAM角色并授权访问角色的IAM教程。本教程还讨论了一个角色,但在这里,您将使用工作脚本来承担角色 AWS Glue. 本教程还包含有关常规跨客户实践的信息。有关更多信息,请参阅 教程。使用IAM角色代表访问AWS账户.

Create a Role

遵循 教程中的步骤1 在帐户A中创建IAM角色。定义角色的权限时,您可以选择附加现有策略,例如 AmazonDynamoDBReadOnlyAccess,或 AmazonDynamoDBFullAccess 要允许角色读取/写入 DynamoDB. 以下示例显示创建名称的角色 DynamoDBCrossAccessRole,通过权限政策 AmazonDynamoDBFullAccess.

Grant Access to the Role

遵循 教程中的步骤2 允许帐户B切换到新创建的角色。以下示例创建了一个新策略,其中包含以下声明:

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

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

Assume the Role in the AWS Glue Job Script

现在,您可以登录到B,创建一个 AWS Glue 工作。在作业脚本中,您需要使用安全令牌服务(STS)API来假设 DynamoDBCrossAccessRole 角色。假设此角色允许您获取临时凭据,需要使用该角色来访问 DynamoDB 在帐户B中,查看这些示例脚本。

对于跨地区的跨客户:

import boto3 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) sts_client = boto3.client('sts') res = sts_client.assume_role( RoleArn="<DynamoDBCrossAccessRole's ARN>", RoleSessionName='assume-role' ) ddb_key = res['Credentials']['AccessKeyId'] ddb_secret = res['Credentials']['SecretAccessKey'] ddb_token = res['Credentials']['SessionToken'] dyf = glue_context.create_dynamic_frame_from_options( connection_type="dynamodb", connection_options={ "dynamodb.region": "us-east-1", "dynamodb.input.tableName": "test_source", "dynamodb.awsAccessKeyId": ddb_key, "dynamodb.awsSecretAccessKey": ddb_secret, "dynamodb.awsSessionToken": ddb_token } ) dyf.show() job.commit()

对于跨地区的读取和跨客户写入:

import boto3 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() sts_client = boto3.client('sts') res = sts_client.assume_role( RoleArn="<DynamoDBCrossAccessRole's ARN>", RoleSessionName='assume-role' ) ddb_key = res['Credentials']['AccessKeyId'] ddb_secret = res['Credentials']['SecretAccessKey'] ddb_token = res['Credentials']['SessionToken'] 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.awsAccessKeyId": ddb_key, "dynamodb.awsSecretAccessKey": ddb_secret, "dynamodb.awsSessionToken": ddb_token } ) job.commit()