将数据移动到 Amazon Redshift 以及从中移动数据 - AWS Glue
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

将数据移动到 Amazon Redshift 以及从中移动数据

当将数据移动到 Amazon Redshift 集群以及从中移动数据时,AWS Glue 作业会对 Amazon Redshift 发出 COPY 和 UNLOAD 语句以实现最大吞吐量。这些命令要求 Amazon Redshift 集群访问 Amazon Simple Storage Service (Amazon S3) 作为暂存目录。默认情况下,AWS Glue 会传入使用您指定的角色创建的临时凭证来运行作业。出于安全原因,这些凭证在 1 小时后过期,这可能会导致长时间运行的作业失败。

要解决此问题,您可以使一个或多个 IAM 角色与 Amazon Redshift 集群本身相关联。COPY 和 UNLOAD 可以使用角色,Amazon Redshift 将根据需要刷新凭证。有关将角色与 Amazon Redshift 集群关联的更多信息,请参阅COPY、UNLOAD 和 CREATE LIBRARY 的 IAM 权限中的Amazon Redshift 数据库开发人员指南。确保与您的集群关联的角色有权从您在作业中指定的 Amazon S3 临时目录中读取和写入该目录。

在为集群设置角色后,您需要在 AWS Glue 脚本中的 ETL(提取、转换和加载)语句中指定它。语法取决于您的脚本如何读取和写入您的动态帧。如果您的脚本从 AWS Glue 数据目录表中读取,则您可以按以下所示指定角色。

glueContext.create_dynamic_frame.from_catalog( database = "database-name", table_name = "table-name", redshift_tmp_dir = args["TempDir"], additional_options = {"aws_iam_role": "arn:aws:iam::account-id:role/role-name"})

类似地,如果您的脚本写入动态帧并从数据目录读取,则您可以按以下所示指定角色。

glueContext.write_dynamic_frame.from_catalog( database = "database-name", table_name = "table-name", redshift_tmp_dir = args["TempDir"], additional_options = {"aws_iam_role": "arn:aws:iam::account-id:role/role-name"})

在这些示例中,角色名称是您与您的 Amazon Redshift 集群关联的角色,数据库名称table-name请参阅您的数据目录中的 Amazon Redshift 表格。

您也可以在使用动态帧和使用 copy_from_options 时指定角色。语法类似,但您需要在connection_options地图。

my_conn_options = { "url": "jdbc:redshift://host:port/redshift database name", "dbtable": "redshift table name", "user": "username", "password": "password", "redshiftTmpDir": args["TempDir"], "aws_iam_role": "arn:aws:iam::account id:role/role name" } df = glueContext.create_dynamic_frame_from_options("redshift", my_conn_options)

在写入 Amazon Redshift 时,选项类似。

my_conn_options = { "dbtable": "redshift table name", "database": "redshift database name", "aws_iam_role": "arn:aws:iam::account id:role/role name" } glueContext.write_dynamic_frame.from_jdbc_conf( frame = input dynamic frame, catalog_connection = "connection name", connection_options = my_conn_options, redshift_tmp_dir = args["TempDir"])

默认情况下,AWS Glue 在从 Amazon Redshift 表中读取数据时使用的临时文件夹中的数据将使用 SSE-S3 加密进行加密。要使用 AWS Key Management Service (AWS KMS) 中的客户托管密钥加密您的数据,您必须指定extraunloadoptionsadditional_options,并提供 AWS KMS 中的密钥 ID,如以下示例中所示:

datasource0 = glueContext.create_dynamic_frame.from_catalog( database = "database-name", table_name = "table-name", redshift_tmp_dir = args["TempDir"], additional_options = {"extraunloadoptions":"ENCRYPTED KMS_KEY_ID 'CMK key ID'"}, transformation_ctx = "datasource0" )