AWS Glue作业从另一个帐户中的DynamoDB中提取数据

时间:2020-03-21 14:21:52

标签: amazon-web-services amazon-s3 amazon-dynamodb aws-glue

我使用AWS Glue将数据从DynamoDB复制到S3。我编写了以下代码,将DyanmoDB表复制到同一帐户中的S3。它工作正常,可以复制6亿条记录到我的表中而没有任何问题。大约需要20分钟。

from pyspark.context import SparkContext
from awsglue.context import GlueContext
from datetime import datetime

# inputs
dataset_date = datetime.strftime(datetime.now(), '%Y%m%d')
table_name = "table-name"
read_percentage = "0.5"
output_location = 's3://'+dataset_date
fmt ="json" 

# glue setup
sc = SparkContext()
glueContext = GlueContext(sc)

# scan the DDB table
table = glueContext.create_dynamic_frame.from_options("dynamodb",
                                                  connection_options={
                                                                      "dynamodb.input.tableName": table_name,
                                                                      "dynamodb.throughput.read.percent": read_percentage,
                                                                      "dynamodb.splits": "100"
                                                                      }
                                                )

# write to S3
glueContext.write_dynamic_frame.from_options(frame=table,
                                         connection_type="s3",
                                         connection_options={"path": output_location},
                                         format=fmt,
                                         transformation_ctx="datasink"
                                        )

但是现在我想使用上述脚本进行跨帐户S3转储。 DynamoDB表位于帐户A(产品帐户)中,从DynamoDB表读取的Glue作业和要转储该数据的S3存储桶位于帐户B(DW帐户)中。我不知道是否可以使用我的脚本,但可以授予跨帐户Glue访问权限,以便它可以从帐户A读取DynamoDB表。

2 个答案:

答案 0 :(得分:0)

在帐户A( DynamoDB表所有者帐户)中创建IAM角色,该角色允许Glue作为 Principal 来读取表。

为帐户A( DynamoDB表所有者帐户)中的IAM角色配置权限策略,该策略允许读取表中的数据。您可以根据以下示例进行构建:

public function add(Request $request){$save_no = $request->input('save_no');
    $save_id = $request->input('save_id');
    $save_name = $request->input('save_name');
    $save_money = $request->input('save_money');$data_save=array(
        'mem_died_id'=>$mem_died_id,
        'save_no'=>$save_no,
        'save_id'=>$save_id,
        'save_name'=>$save_name,
        'save_money'=>$save_money);
    DB::table('died_save')->insert($data_save);return back();

在帐户A( Dynamo数据库表帐户)的上述IAM角色中配置信任策略,以允许Glue承担该信任策略。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "ListAndDescribe",
            "Effect": "Allow",
            "Action": [
                "dynamodb:List*",
                "dynamodb:DescribeReservedCapacity*",
                "dynamodb:DescribeLimits",
                "dynamodb:DescribeTimeToLive"
            ],
            "Resource": "*"
        },
        {
            "Sid": "AllTables",
            "Effect": "Allow",
            "Action": [
                "dynamodb:BatchGet*",
                "dynamodb:DescribeStream",
                "dynamodb:DescribeTable",
                "dynamodb:Get*",
                "dynamodb:Query",
                "dynamodb:Scan"
            ],
            "Resource": [
                "arn:aws:dynamodb:*:*:table/table-1",
                "arn:aws:dynamodb:*:*:table/table-2"
            ]
        }
    ]
}

在为帐户B(不拥有表格)中的胶水作业配置的IAM角色中, 包括允许其在帐户A( Dynamo DB表所有者帐户)中担任IAM角色的权限策略。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "glue.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

参考文献

  1. https://docs.aws.amazon.com/glue/latest/dg/cross-account-access.html#cross-account-calling-etl

答案 1 :(得分:0)

我认为这不适用于DW帐户中运行的胶水脚本。

GlueContext使用表名连接到DynamoDB:

https://docs.aws.amazon.com/glue/latest/dg/aws-glue-programming-etl-connect.html#aws-glue-programming-etl-connect-dynamodb

您应该探索的是在 Prod 帐户中运行胶水脚本,并为您的DW存储桶提供跨帐户访问权限,以便在prod帐户中运行的Glue可以承担编写目标S3的角色 DW帐户中的存储桶。