

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

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

## 授予角色存取權
<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 任務。若要建立任務，請參閱[在 中設定 Spark 任務的任務屬性 AWS Glue](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()
```

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