跨帳戶跨區域存取 DynamoDB 資料表 - AWS Glue

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

跨帳戶跨區域存取 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。下列範例顯示建立名為 DynamoDBCrossAccessRole 的角色,具備許可政策 AmazonDynamoDBFullAccess

授予角色存取權

跟隨 IAM 使用者指南中的教學課程中的步驟 2,以允許帳戶 B 切換至新建立的角色。下列範例會建立使用下列陳述式的新政策:

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

然後,您可以將此政策連接到您要用來存取 DynamoDB 的群組/角色/使用者。

在 AWS Glue 任務指令碼中擔任角色

現在,您可以登入帳戶 B 並建立 AWS Glue 任務。若要建立任務,請參閱在 中設定 Spark 任務的任務屬性 AWS Glue中的指示。

在任務指令碼中,您需要使用 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()

對於跨區域的跨帳戶讀取(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.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()