P - Cloud StorageとBigQueryのリージョン変更を自動化してみた


動機

GCPの魅力の一つに(料金は別にして)データのコピー、移動の手軽さ、簡単さがあります。
これらはBigQueryとCloud Storage, Cloud StorageとFirestoreなどサービス間の連携に関しても同様で一度味をシメたらなかなか抜け出せなくなる魅力があります。

私が所属するプロジェクトでは業務システムをGCPのサービスを使って構築しているのですが、データストレージを東京リージョンからUSリージョンへ移行しました。
先に述べた通り、GCPのサービス間連携は非常に使い勝手がよいのですが、リージョン間連携となると勝手が違ったため、私が担当したのはCloud Storageのリージョン移行とBigQueryのリージョン移行について知見を共有したいと思います。

Cloud Storageのデータ移行

Cloud Storge(GCS)とBigQueryは双子の兄弟のような硬い絆で結ばれている関係です。
GCPでBigQueryを利用している方の大半はGCSも利用していると思います。
実は今回のリージョン移行に関してもBigQuery自身がリージョン間を跨いだクエリ生成ができなかったためBigQueryのリージョンを変更したいという要件が先にありました。
Cloud StorageとBigQueryは同一リージョンでなければ連携できないため、Cloud Storageもお引っ越しをすることになりました。

概要

  • 1. 転送先バケットを作成

転送先バケットを作成する

gsutil mb -p {project} -c STANDARD -l {location} -b on gs://{bucket_name}/

Storage管理者へサービスアカウントを追加

gsutil iam ch {member_type}:{member_name}:{iam_role} gs://{bucket_name}
  • 2. 転送先バケットへオブジェクトを転送

オブジェクトを転送する

gsutil -m cp gs://{bucket_name}/\* gs://{destination_bucket_name}/

BigQueryのデータ移行

BigQueryのデータセットのデータの移行はリージョンをまたぐ移行には制約がありました。
詳しくは「データのロケーションと転送」を確認していただきたいのですが、今回の要件ではGCPが提供するリージョン間の転送サービスが利用できなかったため自作することになりました。

概要

  • 1. 転送先データセットの作成
bq --location={location} mk \
            --dataset \
            --default_table_expiration {integer1} \
            {project}:{dataset}
  • 2. 転送先テーブルの作成
mk = 'bq mk -t --expiration=0 --schema="{schema}"  \
                --time_partitioning_expiration="{time_partitioning_expiration}" \
                --description="{description}" \
                {project}:{dataset}.{table}
  • 3 転送元データをCloud Storageへエクスポート
bq --location={location} extract \
                --destination_format CSV \
                --compression GZIP \
                --print_header=true \
                {project}:{dataset}.{table} \
                gs://{bucket}/{dataset}/{table}/*.csv.gz
  • 4 Cloud Storageのデータを転送
gsutil -m cp -r gs://{source_bucket}/\* gs://{destination_bucket}/
  • 5 転送先テーブルへデータをインポート
bq --location={location} load \
              --skip_leading_rows=1 \
              --source_format=CSV \
              {project}:{dataset}.{table} \
              {path_to_source} \
              {schema}

Cloud StorageとBigQueryのリージョン移行自動化

上記の手順を自動化したものをGithubにあげてあります。
設定ファイルに設定項目を設定することで移行を自動化してくれます。(詳しくはREADMEを参照してくだいさい)
Cloud StorageとBigQueryのデータ移行自動化スクリプト