Amazon Redshift 간 데이터 이동 - AWS Glue

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 클러스터와 역할 연결에 대한 자세한 내용은 Amazon Redshift Database Developer GuideIAM Permissions for COPY, UNLOAD, and CREATE LIBRARY를 참조하세요. 클러스터와 연결하는 역할이 작업에 지정한 Amazon S3 임시 디렉터리에(서) 쓰고 읽을 수 있는 권한이 있는지 확인합니다.

클러스터에 대한 역할을 설정한 후에는 AWS Glue 스크립트의 ETL(추출, 변환 및 로드) 문에서 해당 역할을 지정해야 합니다. 구문은 스크립트가 동적 프레임을 읽고 쓰는 방식에 따라 달라집니다. 스크립트가 AWS Glue Data Catalog 테이블에서 읽는 경우 다음과 같이 역할을 지정할 수 있습니다.

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"})

마찬가지로, 스크립트가 동적 프레임을 쓰고 Data Catalog에서 읽는 경우 다음과 같이 해당 역할을 지정할 수 있습니다.

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"})

이러한 예제에서 role name은 Amazon Redshift 클러스터와 연결한 역할이고, database-nametable-name은 Data Catalog에서 정의된 기존 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"])

Amazon Redshift 테이블에서 데이터를 읽을 때 AWS Glue가 사용하는 임시 폴더의 데이터는 기본값으로 SSE-S3 암호화를 사용하여 암호화됩니다. AWS Key Management Service(AWS KMS)의 고객 관리형 키를 사용하여 데이터를 암호화하려면 다음 예와 같이 additional_optionsextraunloadoptions를 지정하고 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" )