BigQueryデータをAmazon S3に移行する方法を紹介します。
いくつか方法はありますが、本手順ではAWS Glue JobでBigQueryに対しクエリを実行することでデータを移行します。
本手順を取り入れることで、BigQuery上の大規模なデータの移行・加工処理がサーバーレスで構築できます。
- 転送対象のデータの準備(Google Cloud)
- マテリアライズドビュー用のデータセットの作成(Google Cloud)
- IAMロールの作成(Google Cloud)
- サービスアカウントの作成(Google Cloud)
- データセットへのアクセス権付与(Google Cloud)
- AWS Secrets Managerでサービスアカウントキーを管理(AWS)
- AWS Glue用のIAMロールの作成(AWS)
- AWS Glue Connectionの作成(AWS)
- AWS Glue Jobの作成・実行(AWS)
- 参考
転送対象のデータの準備(Google Cloud)
まずはBigQueryデータを用意しましょう。
データセットとテーブルを作成し、クエリが実行できていればOKです。

マテリアライズドビュー用のデータセットの作成(Google Cloud)
マテリアライズドビューを書き込むことができるデータセットを作成します。
データ移行の度に書き込まれるので、専用のものを用意しましょう。

IAMロールの作成(Google Cloud)
以下の権限を持つIAMロールを作成します。
最小権限の原則から、役割に応じて3つのIAMロールを作成することを推奨します。
テーブル参照用
bigquery.tables.get
bigquery.tables.getData
マテリアライズドビュー書き込み用
bigquery.tables.get
bigquery.datasets.get
bigquery.tables.create
bigquery.tables.delete
bigquery.tables.get
bigquery.tables.getData
bigquery.tables.update
bigquery.tables.updateData
セッション作成用
bigquery.jobs.create
bigquery.readsessions.create
bigquery.readsessions.getData
サービスアカウントの作成(Google Cloud)
サービスアカウントを作成します。
先ほど作成したセッション作成用のIAMロールを割り当ててください。
作成後は、サービスアカウントキーをjson形式で出力してください。
※後ほどAWS Secrets Managerを使用して管理します。ダウンロードしたファイルが流出しないよう取り扱いにはご注意ください。
データセットへのアクセス権付与(Google Cloud)
それぞれのデータセットに以下のアクセス権を付与します。
転送対象のデータがあるデータセット
プリンシパル:先ほど作成したサービスアカウントのメールアドレス
ロール:先ほど作成したテーブル参照用のIAMロール
マテリアライズドビュー用のデータセット
プリンシパル:先ほど作成したサービスアカウントのメールアドレス
ロール:先ほど作成したマテリアライズドビュー書き込み用のIAMロール

AWS Secrets Managerでサービスアカウントキーを管理(AWS)
新しいシークレットを作成します。
シークレットのタイプ:その他のシークレットのタイプ
キー/値のペア:先ほど作成したjson形式のサービスアカウントキーをプレーンテキストとして貼り付け
AWS Glue用のIAMロールの作成(AWS)
新しいIAMロールを作成します。
Glue Jobの実行やs3へのデータ格納に加え、以下のポリシーを追加してください。
{
"Effect": "Allow",
"Action": "secretsmanager:GetSecretValue",
"Resource": "先ほど作成したシークレットのARN"
}
AWS Glue Connectionの作成(AWS)
新しいGlue Connectionを作成します。
Data sources:Google BigQuery
ProjectId:転送対象のデータがあるGoogleCloudプロジェクトのID
IAM Role ARN:先ほど作成したGlue用のIAMロールのARN
Authentication:Select secret from this accountを選択し、先ほど作成したシークレットのARNを選択

AWS Glue Jobの作成・実行(AWS)
新しいGlue Jobを作成します。
Job detailsから以下を設定してください。
Basic properties
Job name:任意
IAM Role :先ほど作成したGlue用のIAMロール
Advanced properties
Connections:先ほど作成したGlue Connection
以下のスクリプトを編集し、Scriptに貼り付けてください。
import sys
from awsglue.utils import getResolvedOptions
from pyspark.context import SparkContext
from awsglue.context import GlueContext
from awsglue.job import Job
args = getResolvedOptions(sys.argv, ['JOB_NAME'])
sc = SparkContext()
glueContext = GlueContext(sc)
job = Job(glueContext)
job.init(args['JOB_NAME'])
query = '実行したいクエリ'
bigquery_read = glueContext.create_dynamic_frame.from_options(
connection_type="bigquery",
connection_options={
"connectionName": '先ほど作成したGlue Connection',
"parentProject": '転送対象のデータがあるGoogleCloudプロジェクトのID',
"materializationDataset": "マテリアライズドビュー用のデータセット",
"viewsEnabled": "true",
"sourceType": "query",
"query": query
}
)
glueContext.write_dynamic_frame.from_options(
frame=bigquery_read,
connection_type="s3",
connection_options={
"path": '出力先のs3パス',
},
format="parquet"
)
job.commit()
スクリプト例
import sys
from awsglue.utils import getResolvedOptions
from pyspark.context import SparkContext
from awsglue.context import GlueContext
from awsglue.job import Job
args = getResolvedOptions(sys.argv, ['JOB_NAME'])
sc = SparkContext()
glueContext = GlueContext(sc)
job = Job(glueContext)
job.init(args['JOB_NAME'])
query = """
SELECT
*
FROM `sample-project.sample-dataset.sample-table`
"""
bigquery_read = glueContext.create_dynamic_frame.from_options(
connection_type="bigquery",
connection_options={
"connectionName": "sample-connection",
"parentProject": "sample-project",
"materializationDataset": "sample-materialize-dataset",
"viewsEnabled": "true",
"sourceType": "query",
"query": query
}
)
glueContext.write_dynamic_frame.from_options(
frame=bigquery_read,
connection_type="s3",
connection_options={
"path": "s3://sample-bucket/sample-prefix/",
},
format="parquet"
)
job.commit()
Save、Runを押下することでGlue Jobが実行され、BigQueryデータがAmazon S3に転送されます。
参考
AWS公式サイト docs.aws.amazon.com