繁体   English   中英

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

[英]AWS Glue job to pull the data from DynamoDB in another account

我使用 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 表和 S3 存储桶读取数据的 Glue 作业在账户 B(DW 账户)中转储数据。 我不知道是否可以使用我的脚本,但提供跨账户 Glue 访问权限,以便它可以从账户 A 读取 DynamoDB 表

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

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

{
    "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"
            ]
        }
    ]
}

在账户 A( Dynamo DB 表账户)的上述 IAM 角色中配置信任策略以允许 Glue 代入它。

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

在为账户 B(不拥有表)中的 Glue 作业配置的 IAM 角色中,包括一个权限策略,使其承担账户 A( Dynamo DB 表所有者账户)中的 IAM 角色。

    {
        "Sid": "DelegateDynamoDBTablesOwnerRoleArn",
        "Effect": "Allow",
        "Action": "sts:AssumeRole",
        "Resource": "arn:aws:iam::dynamo-db-table-owner-role-arn:role/*"
    }

参考

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

我认为这不适用于 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 存储桶的跨帐户访问权限,以便在生产帐户中运行的 Glue 可以承担在DW 帐户中写入目标 S3 存储桶的角色。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM