Amazon Redshift からスキーマとデータを移行する

このドキュメントでは、パブリック IP アドレスを使用して Amazon Redshift から BigQuery にデータを移行する方法について説明します。

BigQuery Data Transfer Service を使用して、データを Amazon Redshift データ ウェアハウスから BigQuery にコピーできます。このサービスでは、GKE の移行エージェントとの連携によって、Amazon Redshift から Amazon S3 バケットのステージング領域への unload オペレーションがトリガーされます。その後、BigQuery Data Transfer Service によって Amazon S3 バケットから BigQuery にデータが転送されます。

次の図は、Amazon Redshift データ ウェアハウスと BigQuery の間で移行するデータの全体的な流れを示しています。

Amazon Redshift から BigQuery への移行のワークフロー。

Amazon Redshift インスタンスから Virtual Private Cloud(VPC)を介してプライベート IP アドレスを使用してデータを転送する場合は、VPC による Amazon Redshift データの移行をご覧ください。

始める前に

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. Enable the BigQuery and BigQuery Data Transfer Service APIs.

    Enable the APIs

  5. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  6. Make sure that billing is enabled for your Google Cloud project.

  7. Enable the BigQuery and BigQuery Data Transfer Service APIs.

    Enable the APIs

必要な権限を設定する

Amazon Redshift 転送を作成する前に:

  1. 転送を作成するプリンシパルに、転送ジョブを含むプロジェクトで次のアクセス許可があることを確認します。

    • bigquery.transfers.update(転送を作成する権限)
    • bigquery.datasets.getbigquery.datasets.updateの両方(抽出先データセットに対する権限)

    Identity and Access Management(IAM)の事前定義ロール roles/bigquery.admin には、bigquery.transfers.updatebigquery.datasets.updatebigquery.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-east5 34.162.72.184
34.162.173.185
34.162.205.205
34.162.81.45
34.162.182.149
34.162.59.92
34.162.157.190
34.162.191.145
ダラス us-south1 34.174.172.89
34.174.40.67
34.174.5.11
34.174.96.109
34.174.148.99
34.174.176.19
34.174.253.135
34.174.129.163
アイオワ 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-west10 34.32.28.80
34.32.31.206
34.32.19.49
34.32.33.71
34.32.15.174
34.32.23.7
34.32.1.208
34.32.8.3
フィンランド 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-southwest1 34.175.99.115
34.175.186.237
34.175.39.130
34.175.135.49
34.175.1.49
34.175.95.94
34.175.102.118
34.175.166.114
ミラノ europe-west8 34.154.183.149
34.154.40.104
34.154.59.51
34.154.86.2
34.154.182.20
34.154.127.144
34.154.201.251
34.154.0.104
オランダ 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-west9 34.163.76.229
34.163.153.68
34.155.181.30
34.155.85.234
34.155.230.192
34.155.175.220
34.163.68.177
34.163.157.151
トリノ europe-west12 34.17.15.186
34.17.44.123
34.17.41.160
34.17.47.82
34.17.43.109
34.17.38.236
34.17.34.223
34.17.16.47
ワルシャワ 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
香港 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
中東
ダンマーム me-central2 34.166.20.177
34.166.10.104
34.166.21.128
34.166.19.184
34.166.20.83
34.166.18.138
34.166.18.48
34.166.23.171
ドーハ me-central1 34.18.48.121
34.18.25.208
34.18.38.183
34.18.33.25
34.18.21.203
34.18.21.80
34.18.36.126
34.18.23.252
テルアビブ me-west1 34.165.184.115
34.165.110.74
34.165.174.16
34.165.28.235
34.165.170.172
34.165.187.98
34.165.85.64
34.165.245.97
アフリカ
ヨハネスブルグ africa-south1 34.35.11.24
34.35.10.66
34.35.8.32
34.35.3.248
34.35.2.113
34.35.5.61
34.35.7.53
34.35.3.17

マルチリージョンのロケーション

マルチリージョンの説明 マルチリージョン名 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 に転送するには、ステージング領域として使用する Amazon S3 バケットが必要になります。詳しい手順については、Amazon のドキュメントをご覧ください。

  1. 専用の Amazon IAM ユーザーを作成し、Amazon Redshift に対する読み取り専用アクセス権と、Amazon S3 に対する読み取り / 書き込みアクセス権を付与することをおすすめします。このステップを実現するには、次のポリシーを適用します。

    Amazon Redshift の移行用の Amazon 権限

  2. Amazon IAM ユーザーのアクセスキー ペアを作成します。

分離移行キューによるワークロードの制御を構成する

移行用に Amazon Redshift キューを定義することで、移行に使用されるリソースを限定および分離できます。この移行キューには、同時実行クエリの最大数を指定して構成できます。その後、特定の移行ユーザー グループをキューに関連付けて、BigQuery へのデータ転送を設定する際にそれらの認証情報を使用します。転送サービスは移行キューにのみアクセスできます。

転送情報を収集する

BigQuery Data Transfer Service で移行を設定するために必要な情報を収集します。

  • こちらの手順で JDBC の URL を取得します。
  • Amazon Redshift データベースに対する適切な権限を持つユーザーのユーザー名とパスワードを取得します。
  • Amazon S3 バケットへのアクセスを許可するの手順に従って、AWS アクセスキーのペアを取得します。
  • 転送に使用する Amazon S3 バケットの URI を取得します。このバケットにライフサイクル ポリシーを設定して、不要な課金が発生しないようにすることをおすすめします。すべてのデータを BigQuery に転送するのに十分な時間を確保するため、推奨される有効期限は 24 時間です。

データを評価する

データ転送の一環として、BigQuery Data Transfer Service は Amazon Redshift から Cloud Storage に CSV ファイルとしてデータを書き込みます。これらのファイルに ASCII 0 文字が含まれていると、BigQuery に読み込めません。データを評価して、これが問題の原因であるかどうかを判断することをおすすめします。その場合は、データを Parquet ファイルとして Amazon S3 にエクスポートし、BigQuery Data Transfer Service を使用してそれらのファイルをインポートすることで、この問題を回避できます。詳細については、Amazon S3 の転送の概要をご覧ください。

Amazon Redshift 転送を設定する

次のオプションのいずれかを選択します。

コンソール

  1. Google Cloud コンソールで [BigQuery] ページに移動します。

    BigQuery に移動

  2. [データ転送] をクリックします。

  3. [転送を作成] をクリックします。

  4. [ソースタイプ] セクションで、[ソース] リストから [移行: Amazon Redshift] を選択します。

  5. [転送構成名] セクションで、[表示名] フィールドに、My migration などの転送の名前を入力します。表示名には、後で修正が必要になった場合に簡単に識別できる任意の名前を使用できます。

  6. [転送先の設定] セクションで、[データセット] リストから作成したデータセットを選択します。

  7. [データソースの詳細] セクションで、次のようにします。

    1. [JDBC connection url for Amazon Redshift] で、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 スキーマを入力します。

    7. [Table name patterns] に、スキーマ内でテーブル名を照合するための名前かパターンを指定します。正規表現を使用して、<table1Regex>;<table2Regex> の形式でパターンを指定できます。このパターンは、Java の正規表現の構文に従っている必要があります。次に例を示します。

      • lineitem;ordertb は、lineitemordertb という名前のテーブルに一致します。
      • .* はすべてのテーブルを照合します。

      指定したスキーマからすべてのテーブルを移行するには、このフィールドを空のままにします。

    8. [VPC and the reserved IP range] は空白のままにします。

  8. [サービス アカウント] メニューで、Google Cloud プロジェクトに関連付けられたサービス アカウントからサービス アカウントを選択します。ユーザー認証情報を使用する代わりに、サービス アカウントを転送に関連付けることができます。データ転送でサービス アカウントを使用する方法の詳細については、サービス アカウントの使用をご覧ください。

    • フェデレーション ID でログインした場合、転送を作成するにはサービス アカウントが必要です。Google アカウントでログインした場合、転送用のサービス アカウントは省略可能です。
    • サービス アカウントには必要な権限が付与されている必要があります。
  9. 省略可: [通知オプション] セクションで、次のようにします。

    1. 切り替えボタンをクリックしてメール通知を有効にします。このオプションを有効にすると、転送の実行が失敗した場合、転送管理者にメール通知が送信されます。
    2. [Pub/Sub トピックを選択してください] で、トピック名を選択するか、[トピックを作成する] をクリックします。このオプションで、Pub/Sub の転送実行通知を構成します。
  10. [保存] をクリックします。

  11. この転送のリソース名を含むすべての転送設定の詳細が Google Cloud コンソールに表示されます。

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 \
    --service_account_name=service_account \
    --params='parameters'

ここで

  • project_id はユーザーの Google Cloud プロジェクト ID です。--project_id を指定しない場合は、デフォルトのプロジェクトが使用されます。
  • data_source は、データソースです。redshift
  • dataset は、転送構成の BigQuery ターゲット データセットです。
  • name は、転送構成の表示名です。転送名には、後で修正が必要になった場合に識別できる任意の名前を使用できます。
  • service_account は、転送の認証に使用されるサービス アカウント名です。サービス アカウントは、転送の作成に使用した project_id が所有している必要があります。また、必要な権限がすべて付与されている必要があります。
  • parameters には、作成される転送構成のパラメータを JSON 形式で指定します。例: --params='{"param":"param_value"}'

Amazon Redshift の転送構成に必要なパラメータは次のとおりです。

  • jdbc_url: 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: 移行対象のすべてのテーブルを含む 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 リソースのインスタンスを指定します。

Java

このサンプルを試す前に、クライアント ライブラリを使用した BigQuery クイックスタートにある Java の設定手順を完了してください。詳細については、BigQuery Java API のリファレンス ドキュメントをご覧ください。

BigQuery に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、クライアント ライブラリの認証情報を設定するをご覧ください。

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 の読み込み割り当て量は、読み込みジョブごと各テーブルあたり 15 TB です。Amazon Redshift は内部でテーブルデータを圧縮するため、エクスポートされたテーブルサイズは、Amazon Redshift で提示されたテーブルサイズより大きくなります。15 TB を超えるテーブルを移行する場合は、まず Cloud カスタマーケアまでお問い合わせください。

このサービスを使用すると、Google の外部で料金が発生する場合があります。詳細については、Amazon RedshiftAmazon S3 の料金ページをご覧ください。

Amazon S3 の整合性モデルのために、一部のファイルが BigQuery に転送されない可能性があります。

次のステップ