Amazon Redshift에서 스키마 및 데이터 마이그레이션

이 문서에서는 공개 IP 주소를 사용하여 Amazon Redshift에서 BigQuery로 데이터를 마이그레이션하는 프로세스를 설명합니다.

BigQuery Data Transfer Service를 사용하여 Amazon Redshift 데이터 웨어하우스의 데이터를 BigQuery로 복사할 수 있습니다. 이 서비스는 GKE의 마이그레이션 에이전트와 연결되어 Amazon Redshift에서 Amazon S3 버킷의 스테이징 영역으로 언로드 작업을 트리거합니다. 그런 다음 BigQuery Data Transfer Service는 Amazon S3 버킷의 데이터를 BigQuery로 전송합니다.

다음 다이어그램은 마이그레이션 중에 Amazon Redshift 데이터 웨어하우스와 BigQuery 사이의 전체적인 데이터 흐름을 나타낸 것입니다.

Amazon Redshift에서 BigQuery로의 마이그레이션 워크플로

비공개 IP 주소를 사용하여 Virtual Private Cloud(VPC)를 통해 Redshift 인스턴스의 데이터를 전송하려면 VPC로 Amazon Redshift 데이터 마이그레이션을 참조하세요.

시작하기 전에

  1. Google Cloud 계정에 로그인합니다. Google Cloud를 처음 사용하는 경우 계정을 만들고 Google 제품의 실제 성능을 평가해 보세요. 신규 고객에게는 워크로드를 실행, 테스트, 배포하는 데 사용할 수 있는 $300의 무료 크레딧이 제공됩니다.
  2. Google Cloud Console의 프로젝트 선택기 페이지에서 Google Cloud 프로젝트를 선택하거나 만듭니다.

    프로젝트 선택기로 이동

  3. Google Cloud 프로젝트에 결제가 사용 설정되어 있는지 확인합니다.

  4. API BigQuery and BigQuery Data Transfer Service 사용 설정

    API 사용 설정

  5. Google Cloud Console의 프로젝트 선택기 페이지에서 Google Cloud 프로젝트를 선택하거나 만듭니다.

    프로젝트 선택기로 이동

  6. Google Cloud 프로젝트에 결제가 사용 설정되어 있는지 확인합니다.

  7. API BigQuery and BigQuery Data Transfer Service 사용 설정

    API 사용 설정

필수 권한 설정

Amazon Redshift 전송을 생성하기 전에 할 일

  1. 전송을 만드는 주 구성원에게 전송 작업이 포함된 다음 권한이 있는지 확인하세요.

    • 전송을 만들 bigquery.transfers.update 권한
    • 대상 데이터 세트에 대한 bigquery.datasets.getbigquery.datasets.update 권한

    roles/bigquery.admin 사전 정의된 Identity and Access Management(IAM)역할에는 bigquery.transfers.update, bigquery.datasets.update, bigquery.datasets.get 권한이 포함됩니다. BigQuery Data Transfer Service의 IAM 역할에 대한 자세한 내용은 액세스 제어를 참조하세요.

  2. Amazon S3의 문서를 참조하여 전송을 사용 설정하는 데 필요한 권한을 구성했는지 확인합니다. Amazon S3 소스 데이터에 최소한 AWS 관리 정책 AmazonS3ReadOnlyAccess가 적용되어야 합니다.

데이터 세트 만들기

데이터를 저장할 BigQuery 데이터세트를 만듭니다. 테이블을 만들 필요는 없습니다.

Amazon Redshift 클러스터에 대한 액세스 권한 부여

SQL 클라이언트의 인바운드 규칙 구성의 안내에 따라 다음 IP 주소를 허용 목록에 추가합니다. 데이터 세트의 위치에 해당하는 IP 주소를 허용 목록에 포함하거나 아래 표의 모든 IP 주소를 허용 목록에 포함할 수 있습니다. 이 Google 소유의 IP 주소는 Amazon Redshift 데이터 마이그레이션용으로 예약되어 있습니다.

리전 위치

리전 설명 리전 이름 IP 주소
미주
아이오와 us-central1 34.121.70.114
34.71.81.17
34.122.223.84
34.121.145.212
35.232.1.105
35.202.145.227
35.226.82.216
35.225.241.102
라스베이거스 us-west4 34.125.53.201
34.125.69.174
34.125.159.85
34.125.152.1
34.125.195.166
34.125.50.249
34.125.68.55
34.125.91.116
로스앤젤레스 us-west2 35.236.59.167
34.94.132.139
34.94.207.21
34.94.81.187
34.94.88.122
35.235.101.187
34.94.238.66
34.94.195.77
몬트리올 northamerica-northeast1 34.95.20.253
35.203.31.219
34.95.22.233
34.95.27.99
35.203.12.23
35.203.39.46
35.203.116.49
35.203.104.223
북 버지니아 us-east4 35.245.95.250
35.245.126.228
35.236.225.172
35.245.86.140
35.199.31.35
35.199.19.115
35.230.167.48
35.245.128.132
35.245.111.126
35.236.209.21
오리건 us-west1 35.197.117.207
35.199.178.12
35.197.86.233
34.82.155.140
35.247.28.48
35.247.31.246
35.247.106.13
34.105.85.54
솔트레이크시티 us-west3 34.106.37.58
34.106.85.113
34.106.28.153
34.106.64.121
34.106.246.131
34.106.56.150
34.106.41.31
34.106.182.92
상파울루 southamerica-east1 35.199.88.228
34.95.169.140
35.198.53.30
34.95.144.215
35.247.250.120
35.247.255.158
34.95.231.121
35.198.8.157
산티아고 southamerica-west1 34.176.188.48
34.176.38.192
34.176.205.134
34.176.102.161
34.176.197.198
34.176.223.236
34.176.47.188
34.176.14.80
사우스캐롤라이나 us-east1 35.196.207.183
35.237.231.98
104.196.102.222
35.231.13.201
34.75.129.215
34.75.127.9
35.229.36.137
35.237.91.139
토론토 northamerica-northeast2 34.124.116.108
34.124.116.107
34.124.116.102
34.124.116.80
34.124.116.72
34.124.116.85
34.124.116.20
34.124.116.68
유럽
벨기에 europe-west1 35.240.36.149
35.205.171.56
34.76.234.4
35.205.38.234
34.77.237.73
35.195.107.238
35.195.52.87
34.76.102.189
핀란드 europe-north1 35.228.35.94
35.228.183.156
35.228.211.18
35.228.146.84
35.228.103.114
35.228.53.184
35.228.203.85
35.228.183.138
프랑크푸르트 europe-west3 35.246.153.144
35.198.80.78
35.246.181.106
35.246.211.135
34.89.165.108
35.198.68.187
35.242.223.6
34.89.137.180
런던 europe-west2 35.189.119.113
35.189.101.107
35.189.69.131
35.197.205.93
35.189.121.178
35.189.121.41
35.189.85.30
35.197.195.192
네덜란드 europe-west4 35.204.237.173
35.204.18.163
34.91.86.224
34.90.184.136
34.91.115.67
34.90.218.6
34.91.147.143
34.91.253.1
바르샤바 europe-central2 34.118.72.8
34.118.45.245
34.118.69.169
34.116.244.189
34.116.170.150
34.118.97.148
34.116.148.164
34.116.168.127
취리히 europe-west6 34.65.205.160
34.65.121.140
34.65.196.143
34.65.9.133
34.65.156.193
34.65.216.124
34.65.233.83
34.65.168.250
아시아 태평양
델리 asia-south2 34.126.212.96
34.126.212.85
34.126.208.224
34.126.212.94
34.126.208.226
34.126.212.232
34.126.212.93
34.126.212.206
Hong Kong asia-east2 34.92.245.180
35.241.116.105
35.220.240.216
35.220.188.244
34.92.196.78
34.92.165.209
35.220.193.228
34.96.153.178
자카르타 asia-southeast2 34.101.79.105
34.101.129.32
34.101.244.197
34.101.100.180
34.101.109.205
34.101.185.189
34.101.179.27
34.101.197.251
멜버른 australia-southeast2 34.126.196.95
34.126.196.106
34.126.196.126
34.126.196.96
34.126.196.112
34.126.196.99
34.126.196.76
34.126.196.68
뭄바이 asia-south1 34.93.67.112
35.244.0.1
35.200.245.13
35.200.203.161
34.93.209.130
34.93.120.224
35.244.10.12
35.200.186.100
오사카 asia-northeast2 34.97.94.51
34.97.118.176
34.97.63.76
34.97.159.156
34.97.113.218
34.97.4.108
34.97.119.140
34.97.30.191
서울 asia-northeast3 34.64.152.215
34.64.140.241
34.64.133.199
34.64.174.192
34.64.145.219
34.64.136.56
34.64.247.158
34.64.135.220
싱가포르 asia-southeast1 34.87.12.235
34.87.63.5
34.87.91.51
35.198.197.191
35.240.253.175
35.247.165.193
35.247.181.82
35.247.189.103
시드니 australia-southeast1 35.189.33.150
35.189.38.5
35.189.29.88
35.189.22.179
35.189.20.163
35.189.29.83
35.189.31.141
35.189.14.219
타이완 asia-east1 35.221.201.20
35.194.177.253
34.80.17.79
34.80.178.20
34.80.174.198
35.201.132.11
35.201.223.177
35.229.251.28
35.185.155.147
35.194.232.172
도쿄 asia-northeast1 34.85.11.246
34.85.30.58
34.85.8.125
34.85.38.59
34.85.31.67
34.85.36.143
34.85.32.222
34.85.18.128
34.85.23.202
34.85.35.192

다중 리전 위치

멀티 리전 설명 멀티 리전 이름 IP 주소
유럽 연합 회원국의 데이터 센터1 EU 34.76.156.158
34.76.156.172
34.76.136.146
34.76.1.29
34.76.156.232
34.76.156.81
34.76.156.246
34.76.102.206
34.76.129.246
34.76.121.168
미국의 데이터 센터 US 35.185.196.212
35.197.102.120
35.185.224.10
35.185.228.170
35.197.5.235
35.185.206.139
35.197.67.234
35.197.38.65
35.185.202.229
35.185.200.120

1 EU 멀티 리전에 있는 데이터는 europe-west2(런던) 또는 europe-west6(취리히) 데이터 센터에 저장되지 않습니다.

Amazon S3 버킷에 대한 액세스 권한 부여

Amazon Redshift 데이터를 BigQuery로 전송할 때 스테이징 영역으로 사용할 S3 버킷이 있어야 합니다. 자세한 내용은 Amazon 문서를 참조하세요.

  1. 전용 Amazon IAM 사용자를 만들고 이 사용자에게만 Amazon Redshift에 대한 읽기 액세스 권한과 S3에 대한 읽기/쓰기 액세스 권한을 부여하는 것이 좋습니다. 이 단계를 수행하려면 다음 정책을 적용할 수 있습니다.

    Amazon Redshift 마이그레이션 Amazon 권한

  2. Amazon IAM 사용자 액세스 키 쌍을 만듭니다.

별도의 마이그레이션 큐로 워크로드 제어 구성

선택적으로 마이그레이션용 Amazon Redshift 큐를 정의하여 마이그레이션에 사용되는 리소스를 제한하고 구분할 수 있습니다. 최대 동시 실행 쿼리 수를 사용하여 이 마이그레이션 큐를 구성할 수 있습니다. 그런 다음 특정 마이그레이션 사용자 그룹을 큐와 연결하고 BigQuery로 데이터를 전송하도록 마이그레이션을 설정할 때 이러한 사용자 인증 정보를 사용할 수 있습니다. 전송 서비스만 마이그레이션 큐에 액세스할 수 있습니다.

전송 정보 수집

BigQuery Data Transfer Service로 마이그레이션을 설정하는 데 필요한 정보를 수집합니다.

  • 이 지침을 따라 JDBC URL을 확인하세요.
  • Amazon Redshift 데이터베이스에 대한 적절한 권한이 있는 사용자의 사용자 이름과 비밀번호를 가져옵니다.
  • S3 버킷에 대한 액세스 권한 부여의 안내에 따라 AWS 액세스 키 쌍을 가져옵니다.
  • 전송에 사용할 Amazon S3 버킷의 URI를 가져옵니다. 불필요한 비용이 발생하지 않도록 이 버킷에 대해 라이프 사이클 정책을 설정하는 것이 좋습니다. 모든 데이터를 BigQuery로 전송하는 데 충분한 시간을 확보하려면 만료 시간을 24시간으로 설정하는 것이 좋습니다.

Amazon Redshift 전송 설정

다음 옵션 중 하나를 선택합니다.

Console

  1. Console에서 BigQuery 페이지로 이동합니다.

    BigQuery로 이동

  2. 데이터 전송을 클릭합니다.

  3. 전송 만들기를 클릭합니다.

  4. 소스 유형 섹션의 소스 목록에서 마이그레이션: Amazon Redshift를 선택합니다.

  5. 전송 구성 이름 섹션에서 전송 이름(예: My migration)을 표시 이름 필드에 입력합니다. 표시 이름은 나중에 수정해야 할 경우에 대비해 전송을 식별할 수 있는 값이면 됩니다.

  6. 대상 설정 섹션의 데이터 세트 목록에서 만든 데이터 세트를 선택합니다.

  7. 데이터 소스 세부정보 섹션에서 다음을 수행합니다.

    1. Amazon Redshift의 JDBC 연결 URL에 Amazon Redshift 클러스터에 액세스하는 데 사용할 JDBC URL을 입력합니다.
    2. Username of your database(데이터베이스 사용자 이름)에 마이그레이션하려는 Amazon Redshift 데이터베이스의 사용자 이름을 입력합니다.
    3. Password of your database(데이터베이스 비밀번호)에 데이터베이스 비밀번호를 입력합니다.

    4. 액세스 키 ID보안 비밀 액세스 키S3 버킷에 대한 액세스 권한 부여에서 확인한 액세스 키 쌍을 입력합니다.

    5. Amazon S3 URI에 스테이징 영역으로 사용할 S3 버킷의 URI를 입력합니다.

    6. Amazon Redshift Schema에 마이그레이션하려는 Amazon Redshift Schema를 입력합니다.

    7. Table name patterns(테이블 이름 패턴)에 스키마에서 테이블 이름 일치에 사용할 이름이나 패턴을 지정합니다. 정규식을 사용하여 패턴을 <table1Regex>;<table2Regex> 형식으로 지정할 수 있습니다. 이 패턴은 자바 정규 표현식 구문을 따라야 합니다. 예를 들면 다음과 같습니다.

      • lineitem;ordertblineitemordertb라는 테이블과 일치합니다.
      • .*은 모든 테이블을 찾습니다.

      지정된 스키마에서 모든 테이블을 마이그레이션하려면 이 필드를 비워 둡니다.

    8. VPC 및 예약된 IP 범위의 경우 필드를 비워 둡니다.

  8. 선택사항: 알림 옵션 섹션에서 다음을 수행합니다.

    1. 전환을 클릭하여 이메일 알림을 사용 설정합니다. 이 옵션을 사용 설정하면 전송 실행이 실패할 때 전송 관리자에게 이메일 알림이 발송됩니다.
    2. Pub/Sub 주제 선택에서 주제 이름을 선택하거나 주제 만들기를 클릭합니다. 이 옵션은 전송에 대한 Pub/Sub 실행 알림을 구성합니다.
  9. 저장을 클릭합니다.

  10. Console은 이 전송에 대한 리소스 이름을 포함하여 모든 전송 설정 세부사항을 표시합니다.

bq

bq mk 명령어를 입력하고 전송 생성 플래그 --transfer_config를 지정합니다. 다음 플래그도 필요합니다.

  • --project_id
  • --data_source
  • --target_dataset
  • --display_name
  • --params
bq mk \
    --transfer_config \
    --project_id=project_id \
    --data_source=data_source \
    --target_dataset=dataset \
    --display_name=name \
    --params='parameters'

각 항목의 의미는 다음과 같습니다.

  • project_id는 Google Cloud 프로젝트 ID입니다. --project_id를 지정하지 않으면 기본 프로젝트가 사용됩니다.
  • data_source는 데이터 소스(redshift)입니다.
  • dataset는 전송 구성을 위한 BigQuery 대상 데이터 세트입니다.
  • name은 전송 구성의 표시 이름입니다. 전송 이름은 나중에 수정해야 할 경우에 전송을 식별할 수 있는 값이면 됩니다.
  • parameters에는 JSON 형식으로 생성된 전송 구성의 매개변수가 있습니다. 예를 들면 --params='{"param":"param_value"}'입니다.

Amazon Redshift 전송 구성에 필요한 매개변수는 다음과 같습니다.

  • jdbc_url: Amazon Redshift 클러스터를 찾는 데 사용할 JDBC 연결 URL
  • database_username: 지정된 테이블을 언로드하기 위해 데이터베이스에 액세스하는 데 사용할 사용자 이름
  • database_password: 지정된 테이블을 언로드하기 위해 데이터베이스에 액세스하는 데 사용할 사용자 이름의 비밀번호
  • access_key_id: AWS에 대한 요청에 서명하기 위한 액세스 키 ID
  • secret_access_key: AWS에 대한 요청에 서명하기 위한 액세스 키 ID에 사용되는 보안 비밀 액세스 키
  • s3_bucket: 's3://'로 시작하며 사용할 임시 파일의 프리픽스를 지정하는 Amazon S3 URI
  • redshift_schema: 마이그레이션할 모든 테이블이 포함된 Amazon Redshift 스키마
  • table_name_patterns: 세미콜론(;)으로 구분된 테이블 이름 패턴. 테이블 패턴은 마이그레이션할 테이블의 정규 표현식입니다. 지정하지 않을 경우 데이터베이스 스키마의 모든 테이블이 마이그레이션됩니다.

예를 들어 다음 명령어는 이름이 mydataset인 대상 데이터세트와 ID가 google.com:myproject인 프로젝트를 사용하여 My Transfer라는 Amazon Redshift 전송을 만듭니다.

bq mk \
    --transfer_config \
    --project_id=myproject \
    --data_source=redshift \
    --target_dataset=mydataset \
    --display_name='My Transfer' \
    --params='{"jdbc_url":"jdbc:postgresql://test-example-instance.sample.us-west-1.redshift.amazonaws.com:5439/dbname","database_username":"my_username","database_password":"1234567890","access_key_id":"A1B2C3D4E5F6G7H8I9J0","secret_access_key":"1234567890123456789012345678901234567890","s3_bucket":"s3://bucket/prefix","redshift_schema":"public","table_name_patterns":"table_name"}'

API

projects.locations.transferConfigs.create 메서드를 사용하고 TransferConfig 리소스의 인스턴스를 지정합니다.

자바

이 샘플을 사용해 보기 전에 BigQuery 빠른 시작: 클라이언트 라이브러리 사용의 자바 설정 안내를 따르세요. 자세한 내용은 BigQuery 자바 API 참조 문서를 확인하세요.

import com.google.api.gax.rpc.ApiException;
import com.google.cloud.bigquery.datatransfer.v1.CreateTransferConfigRequest;
import com.google.cloud.bigquery.datatransfer.v1.DataTransferServiceClient;
import com.google.cloud.bigquery.datatransfer.v1.ProjectName;
import com.google.cloud.bigquery.datatransfer.v1.TransferConfig;
import com.google.protobuf.Struct;
import com.google.protobuf.Value;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

// Sample to create redshift transfer config
public class CreateRedshiftTransfer {

  public static void main(String[] args) throws IOException {
    // TODO(developer): Replace these variables before running the sample.
    final String projectId = "MY_PROJECT_ID";
    String datasetId = "MY_DATASET_ID";
    String datasetRegion = "US";
    String jdbcUrl = "MY_JDBC_URL_CONNECTION_REDSHIFT";
    String dbUserName = "MY_USERNAME";
    String dbPassword = "MY_PASSWORD";
    String accessKeyId = "MY_AWS_ACCESS_KEY_ID";
    String secretAccessId = "MY_AWS_SECRET_ACCESS_ID";
    String s3Bucket = "MY_S3_BUCKET_URI";
    String redShiftSchema = "MY_REDSHIFT_SCHEMA";
    String tableNamePatterns = "*";
    String vpcAndReserveIpRange = "MY_VPC_AND_IP_RANGE";
    Map<String, Value> params = new HashMap<>();
    params.put("jdbc_url", Value.newBuilder().setStringValue(jdbcUrl).build());
    params.put("database_username", Value.newBuilder().setStringValue(dbUserName).build());
    params.put("database_password", Value.newBuilder().setStringValue(dbPassword).build());
    params.put("access_key_id", Value.newBuilder().setStringValue(accessKeyId).build());
    params.put("secret_access_key", Value.newBuilder().setStringValue(secretAccessId).build());
    params.put("s3_bucket", Value.newBuilder().setStringValue(s3Bucket).build());
    params.put("redshift_schema", Value.newBuilder().setStringValue(redShiftSchema).build());
    params.put("table_name_patterns", Value.newBuilder().setStringValue(tableNamePatterns).build());
    params.put(
        "migration_infra_cidr", Value.newBuilder().setStringValue(vpcAndReserveIpRange).build());
    TransferConfig transferConfig =
        TransferConfig.newBuilder()
            .setDestinationDatasetId(datasetId)
            .setDatasetRegion(datasetRegion)
            .setDisplayName("Your Redshift Config Name")
            .setDataSourceId("redshift")
            .setParams(Struct.newBuilder().putAllFields(params).build())
            .setSchedule("every 24 hours")
            .build();
    createRedshiftTransfer(projectId, transferConfig);
  }

  public static void createRedshiftTransfer(String projectId, TransferConfig transferConfig)
      throws IOException {
    try (DataTransferServiceClient client = DataTransferServiceClient.create()) {
      ProjectName parent = ProjectName.of(projectId);
      CreateTransferConfigRequest request =
          CreateTransferConfigRequest.newBuilder()
              .setParent(parent.toString())
              .setTransferConfig(transferConfig)
              .build();
      TransferConfig config = client.createTransferConfig(request);
      System.out.println("Cloud redshift transfer created successfully :" + config.getName());
    } catch (ApiException ex) {
      System.out.print("Cloud redshift transfer was not created." + ex.toString());
    }
  }
}

할당량 및 한도

BigQuery에는 테이블별 로드 작업당 15TB의 로드 할당량이 있습니다. 내부적으로 Amazon Redshift는 테이블 데이터를 압축하므로 내보낸 테이블 크기는 Amazon Redshift가 보고한 테이블 크기보다 큽니다. 15TB보다 큰 테이블을 마이그레이션하려면 먼저 Cloud Customer Care에 문의하시기 바랍니다.

이 서비스를 사용하면 Google 외부에서 비용이 발생할 수 있습니다. 자세한 내용은 Amazon RedshiftAmazon S3 가격 책정 페이지를 참조하세요.

Amazon S3의 일관성 모델로 인해 일부 파일이 BigQuery로의 전송에 포함되지 않을 수 있습니다.

다음 단계