Amazon Redshift가 구성된 Aurora 제로 ETL 통합 시작하기 - Amazon Aurora

Amazon Redshift가 구성된 Aurora 제로 ETL 통합 시작하기

Amazon Redshift가 구성된 제로 ETL 통합을 생성하기 전에 필수 파라미터와 권한을 사용하여 Aurora DB 클러스터와 Amazon Redshift 데이터 웨어하우스를 구성합니다. 설정 중에 다음 단계를 완료해야 합니다.

이러한 작업을 완료한 후 Amazon Redshift가 구성된 Amazon Aurora 제로 ETL 통합 생성으로 이동합니다.

AWS SDK를 사용하여 설정 프로세스를 자동화할 수 있습니다. 자세한 내용은 AWS SDK를 사용하여 통합을 설정합니다(Aurora MySQL만 해당). 단원을 참조하십시오.

작은 정보

통합을 생성하는 동안 수동으로 수행하는 대신 RDS가 이러한 설정 단계를 완료하도록 할 수 있습니다. 통합 생성을 바로 시작하려면 Amazon Redshift가 구성된 Amazon Aurora 제로 ETL 통합 생성 섹션을 참조하세요.

1단계: 사용자 지정 DB 클러스터 파라미터 그룹 생성

Amazon Redshift가 구성된 Aurora 제로 ETL 통합은 복제를 제어하는 DB 클러스터 파라미터에 대한 특정 값이 필요합니다. 특히 Aurora MySQL에는 향상된 binlog(aurora_enhanced_binlog)가 필요하고 Aurora PostgreSQL에는 향상된 논리적 복제(aurora.enhanced_logical_replication)가 필요합니다.

이진 로깅 또는 논리적 복제를 구성하려면 먼저 사용자 지정 DB 클러스터 파라미터 그룹을 만든 다음 이를 소스 DB 클러스터와 연결해야 합니다.

소스 DB 엔진에 따라 다음 설정을 사용하여 사용자 지정 DB 클러스터 파라미터 그룹을 생성합니다. 파라미터 그룹을 만드는 방법에 대한 지침은 Amazon Aurora DB 클러스터의 DB 클러스터 파라미터 그룹 섹션을 참조하세요.

Aurora MySQL(aurora-mysql8.0 제품군):

  • aurora_enhanced_binlog=1

  • binlog_backup=0

  • binlog_format=ROW

  • binlog_replication_globaldb=0

  • binlog_row_image=full

  • binlog_row_metadata=full

또한 binlog_transaction_compression 파라미터가 ON으로 설정되어 있지 않고 binlog_row_value_options 파라미터가 PARTIAL_JSON으로 설정되어 있지 않아야 합니다.

Aurora MySQL의 향상된 binlog에 대한 자세한 내용은 Aurora MySQL에 대해 향상된 binlog 설정 섹션을 참조하세요.

Aurora PostgreSQL(aurora-postgresql15 제품군):

참고

Aurora PostgreSQL DB 클러스터의 경우 미국 동부(오하이오)(us-east-2) AWS 리전의 Amazon RDS 데이터베이스 미리 보기 환경 내에 사용자 지정 파라미터 그룹을 생성해야 합니다.

  • rds.logical_replication=1

  • aurora.enhanced_logical_replication=1

  • aurora.logical_replication_backup=0

  • aurora.logical_replication_globaldb=0

향상된 논리적 복제(aurora.enhanced_logical_replication)를 활성화하면 REPLICA IDENTITY 파라미터가 자동으로 FULL로 설정됩니다. 즉, 모든 열 값이 Wrate Ahead Log(WAL)에 기록됩니다. 이렇게 하면 소스 DB 클러스터의 IOPS가 증가합니다.

2단계: 소스 DB 클러스터 선택 또는 생성

사용자 지정 DB 클러스터 파라미터 그룹을 생성한 후 Aurora MySQL 또는 Aurora PostgreSQL DB 클러스터를 선택하거나 생성합니다. 이 클러스터는 Amazon Redshift로의 데이터 복제 소스가 됩니다. DB 클러스터를 만드는 방법에 대한 지침은 Amazon Aurora DB 클러스터 생성 섹션을 참조하세요.

데이터베이스에서 지원되는 DB 엔진 버전을 실행 중이어야 합니다. 지원되는 버전 목록은 Amazon Redshift와 제로 ETL 통합을 지원하는 리전 및 Aurora DB 엔진 섹션을 참조하세요.

DB 클러스터를 만드는 방법에 대한 지침은 Amazon Aurora DB 클러스터 생성 섹션을 참조하세요.

참고

미국 동부(오하이오)(us-east-2) AWS 리전의 Amazon RDS 데이터베이스 미리 보기 환경 내에 Aurora PostgreSQL DB 클러스터를 생성해야 합니다.

데이터베이스를 생성할 때 추가 구성에서 기본 DB 클러스터 파라미터 그룹을 이전 단계에서 생성한 사용자 지정 파라미터 그룹으로 변경합니다.

참고

Aurora MySQL의 경우, 클러스터가 이미 생성된 후에 DB 클러스터와 파라미터 그룹을 제로 ETL 통합을 만들기 전에 클러스터의 기본 DB 인스턴스를 재부팅하여 변경 사향을 적용해야 합니다. 지침은 Amazon Aurora DB 클러스터 또는 Amazon Aurora DB 인스턴스 재부팅 섹션을 참조하십시오.

Amazon Redshift가 구성된 Aurora PostgreSQL 제로 ETL 통합의 미리 보기 릴리스 중에는 클러스터를 생성하는 동안 클러스터를 사용자 지정 DB 클러스터 파라미터 그룹과 연결해야 합니다. 소스 DB 클러스터를 이미 생성한 후에는 이 작업을 수행할 수 없습니다. 수행하려면 클러스터를 삭제하고 다시 생성해야 합니다.

3단계: 대상 Amazon Redshift 데이터 웨어하우스 생성

소스 DB 클러스터를 생성한 후에는 Amazon Redshift에서 대상 데이터 웨어하우스를 생성하고 구성해야 합니다. 데이터 웨어하우스는 다음 요구 사항을 충족해야 합니다.

  • 미리 보기에서 생성되었습니다(Aurora PostgreSQL 소스만 해당). Aurora MySQL 소스의 경우 프로덕션 클러스터와 작업 그룹을 생성해야 합니다.

    • 미리 보기에서 프로비저닝된 클러스터를 생성하려면 프로비저닝된 클러스터 대시보드의 배너에서 미리 보기 클러스터 생성을 선택합니다. 자세한 내용은 미리 보기 클러스터 생성 섹션을 참조하세요.

      Redshift의 프로비저닝된 클러스터 대시보드 상단에 있는 배너. 미리 보기 클러스터 생성 버튼이 강조 표시됨.

      클러스터를 생성할 때 미리 보기 트랙preview_2023으로 설정하세요.

    • 미리 보기에서 Redshift Serverless 작업 그룹을 만들려면 서버리스 대시보드의 배너에서 미리 보기 작업 그룹 생성을 선택합니다. 자세한 내용은 미리 보기 작업 그룹 생성 섹션을 참조하세요.

      Redshift의 서버리스 대시보드 상단에 있는 배너. 미리 보기 작업 그룹 생성 버튼이 강조 표시됨.
  • 가 있는 RA3 노드 유형 또는 Redshift Serverless를 사용합니다.

  • 암호화되어 있습니다(프로비저닝된 클러스터를 사용하는 경우). 자세한 내용은 Amazon Redshift 데이터베이스 암호화를 참조하세요.

데이터 웨어하우스를 만드는 방법에 대한 지침은 프로비전된 클러스터의 경우 클러스터 생성을, Redshift Serverless의 경우 네임스페이스가 있는 작업 그룹 생성을 참조하세요.

데이터 웨어하우스에서 대/소문자 구분 활성화

통합이 성공하려면 데이터 웨어하우스에서 대/소문자 구분 파라미터(enable_case_sensitive_identifier)를 활성화해야 합니다. 기본적으로 모든 프로비저닝된 클러스터와 Redshift Serverless 작업 그룹에서 대/소문자 구분이 비활성화되어 있습니다.

대/소문자 구분을 활성화하려면 데이터 웨어하우스 유형에 따라 다음 단계를 수행하세요.

  • 프로비저닝된 클러스터 - 프로비저닝된 클러스터에서 대/소문자 구분을 활성화하려면 enable_case_sensitive_identifier 파라미터가 활성화된 사용자 지정 파라미터 그룹을 생성합니다. 그런 다음 이 파라미터 그룹을 클러스터와 연결합니다. 자세한 지침은 콘솔을 사용한 파라미터 그룹 관리 또는 AWS CLI를 사용한 파라미터 값 구성을 참조하세요.

    참고

    사용자 지정 파라미터 그룹을 연결한 후 클러스터를 재부팅해야 합니다.

  • Serverless 작업 그룹 - Redshift Serverless 작업 그룹에서 대/소문자 구분을 활성화하려면 AWS CLI를 사용해야 합니다. Amazon Redshift 콘솔은 현재 Redshift Serverless 파라미터 값 수정을 지원하지 않습니다. 다음 update-workgroup 업데이트 요청을 보냅니다.

    aws redshift-serverless update-workgroup \ --workgroup-name target-workgroup \ --config-parameters parameterKey=enable_case_sensitive_identifier,parameterValue=true

    작업 그룹의 파라미터 값을 수정한 후 작업 그룹을 재부팅할 필요가 없습니다.

데이터 웨어하우스에 대한 권한 부여 구성

데이터 웨어하우스를 만든 후에는 소스 Aurora DB 클러스터를 승인된 통합 소스로 구성해야 합니다. 자세한 지침은 Amazon Redshift 데이터 웨어하우스에 대한 권한 부여 구성을 참조하세요.

AWS SDK를 사용하여 통합을 설정합니다(Aurora MySQL만 해당).

각 리소스를 수동으로 설정하는 대신 다음 Python 스크립트를 실행하여 필요한 리소스를 자동으로 설정할 수 있습니다. 코드 예제에서는 AWS SDK for Python (Boto3)을 사용하여 소스 Aurora MySQL DB 클러스터와 대상 Amazon Redshift 데이터 웨어하우스를 생성합니다. 각각 필수 파라미터 값이 있습니다. 그런 다음 데이터베이스 간에 제로 ETL 통합을 생성하기 전에 데이터베이스를 사용할 수 있을 때까지 기다립니다. 설정해야 하는 리소스에 따라 다양한 함수를 주석 처리할 수 있습니다.

필요한 종속성을 설치하려면 다음 명령을 실행합니다.

pip install boto3 pip install time

스크립트 내에서 필요에 따라 소스, 대상 및 파라미터 그룹의 이름을 수정할 수 있습니다. 최종 함수는 리소스 설정에 따라 my-integration 이름이 지정된 통합을 생성합니다.

import boto3 import time # Build the client using the default credential configuration. # You can use the CLI and run 'aws configure' to set access key, secret # key, and default Region. rds = boto3.client('rds') redshift = boto3.client('redshift') sts = boto3.client('sts') source_cluster_name = 'my-source-cluster' # A name for the source cluster source_param_group_name = 'my-source-param-group' # A name for the source parameter group target_cluster_name = 'my-target-cluster' # A name for the target cluster target_param_group_name = 'my-target-param-group' # A name for the target parameter group def create_source_cluster(*args): """Creates a source Aurora MySQL DB cluster""" response = rds.create_db_cluster_parameter_group( DBClusterParameterGroupName=source_param_group_name, DBParameterGroupFamily='aurora-mysql8.0', Description='For Aurora MySQL zero-ETL integrations' ) print('Created source parameter group: ' + response['DBClusterParameterGroup']['DBClusterParameterGroupName']) response = rds.modify_db_cluster_parameter_group( DBClusterParameterGroupName=source_param_group_name, Parameters=[ { 'ParameterName': 'aurora_enhanced_binlog', 'ParameterValue': '1', 'ApplyMethod': 'pending-reboot' }, { 'ParameterName': 'binlog_backup', 'ParameterValue': '0', 'ApplyMethod': 'pending-reboot' }, { 'ParameterName': 'binlog_format', 'ParameterValue': 'ROW', 'ApplyMethod': 'pending-reboot' }, { 'ParameterName': 'binlog_replication_globaldb', 'ParameterValue': '0', 'ApplyMethod': 'pending-reboot' }, { 'ParameterName': 'binlog_row_image', 'ParameterValue': 'full', 'ApplyMethod': 'pending-reboot' }, { 'ParameterName': 'binlog_row_metadata', 'ParameterValue': 'full', 'ApplyMethod': 'pending-reboot' } ] ) print('Modified source parameter group: ' + response['DBClusterParameterGroupName']) response = rds.create_db_cluster( DBClusterIdentifier=source_cluster_name, DBClusterParameterGroupName=source_param_group_name, Engine='aurora-mysql', EngineVersion='8.0.mysql_aurora.3.05.2', DatabaseName='myauroradb', MasterUsername='username', MasterUserPassword='Password01**' ) print('Creating source cluster: ' + response['DBCluster']['DBClusterIdentifier']) source_arn = (response['DBCluster']['DBClusterArn']) create_target_cluster(target_cluster_name, source_arn, target_param_group_name) response = rds.create_db_instance( DBInstanceClass='db.r6g.2xlarge', DBClusterIdentifier=source_cluster_name, DBInstanceIdentifier=source_cluster_name + '-instance', Engine='aurora-mysql' ) return(response) def create_target_cluster(target_cluster_name, source_arn, target_param_group_name): """Creates a target Redshift cluster""" response = redshift.create_cluster_parameter_group( ParameterGroupName=target_param_group_name, ParameterGroupFamily='redshift-1.0', Description='For Aurora MySQL zero-ETL integrations' ) print('Created target parameter group: ' + response['ClusterParameterGroup']['ParameterGroupName']) response = redshift.modify_cluster_parameter_group( ParameterGroupName=target_param_group_name, Parameters=[ { 'ParameterName': 'enable_case_sensitive_identifier', 'ParameterValue': 'true' } ] ) print('Modified target parameter group: ' + response['ParameterGroupName']) response = redshift.create_cluster( ClusterIdentifier=target_cluster_name, NodeType='ra3.4xlarge', NumberOfNodes=2, Encrypted=True, MasterUsername='username', MasterUserPassword='Password01**', ClusterParameterGroupName=target_param_group_name ) print('Creating target cluster: ' + response['Cluster']['ClusterIdentifier']) # Retrieve the target cluster ARN response = redshift.describe_clusters( ClusterIdentifier=target_cluster_name ) target_arn = response['Clusters'][0]['ClusterNamespaceArn'] # Retrieve the current user's account ID response = sts.get_caller_identity() account_id = response['Account'] # Create a resource policy specifying cluster ARN and account ID response = redshift.put_resource_policy( ResourceArn=target_arn, Policy=''' { \"Version\":\"2012-10-17\", \"Statement\":[ {\"Effect\":\"Allow\", \"Principal\":{ \"Service\":\"redshift.amazonaws.com\" }, \"Action\":[\"redshift:AuthorizeInboundIntegration\"], \"Condition\":{ \"StringEquals\":{ \"aws:SourceArn\":\"%s\"} } }, {\"Effect\":\"Allow\", \"Principal\":{ \"AWS\":\"arn:aws:iam::%s:root\"}, \"Action\":\"redshift:CreateInboundIntegration\"} ] } ''' % (source_arn, account_id) ) return(response) def wait_for_cluster_availability(*args): """Waits for both clusters to be available""" print('Waiting for clusters to be available...') response = rds.describe_db_clusters( DBClusterIdentifier=source_cluster_name ) source_status = response['DBClusters'][0]['Status'] source_arn = response['DBClusters'][0]['DBClusterArn'] response = rds.describe_db_instances( DBInstanceIdentifier=source_cluster_name + '-instance' ) source_instance_status = response['DBInstances'][0]['DBInstanceStatus'] response = redshift.describe_clusters( ClusterIdentifier=target_cluster_name ) target_status = response['Clusters'][0]['ClusterStatus'] target_arn = response['Clusters'][0]['ClusterNamespaceArn'] # Every 60 seconds, check whether the clusters are available. if source_status != 'available' or target_status != 'available' or source_instance_status != 'available': time.sleep(60) response = wait_for_cluster_availability( source_cluster_name, target_cluster_name) else: print('Clusters available. Ready to create zero-ETL integration.') create_integration(source_arn, target_arn) return def create_integration(source_arn, target_arn): """Creates a zero-ETL integration using the source and target clusters""" response = rds.create_integration( SourceArn=source_arn, TargetArn=target_arn, IntegrationName='my-integration' ) print('Creating integration: ' + response['IntegrationName']) def main(): """main function""" create_source_cluster(source_cluster_name, source_param_group_name) wait_for_cluster_availability(source_cluster_name, target_cluster_name) if __name__ == "__main__": main()

다음 단계

소스 Aurora DB 클러스터와 Amazon Redshift 대상 데이터 웨어하우스가 있으므로, 이제 제로 ETL 통합을 생성하고 데이터를 복제할 수 있습니다. 지침은 Amazon Redshift가 구성된 Amazon Aurora 제로 ETL 통합 생성 단원을 참조하세요.