AWS Glue for Apache Spark ネイティブ接続を使用して BigQuery のデータを Amazon S3 に転送する

2024.05.17

こんにちは!よしななです。
今回は、AWS が提供している AWS Glue for Apache Spark ネイティブ接続を使用して、BigQuery のデータを Amazon S3 に転送する処理を試してみました。

目次

  • やりたいこと
  • 事前準備 : Google Cloud
    • サービスアカウントの作成
    • クレデンシャルファイルのダウンロード
    • BigQuery テーブル作成
  • 事前準備 : AWS
    • クレデンシャルの登録
    • IAM ロールの作成
    • S3 バケットの作成
  • AWS Glue for Apache Spark ネイティブ接続を使用してデータ転送処理を試してみる
    • Connector の作成
    • ジョブの作成
  • 実行結果
    • 作業終了時の注意点

やりたいこと

今回やりたいこととしては、以下に示した構成図の通り BigQuery のデータを Amazon S3 に転送する処理を試します。

BigQuery と AWS Glue を接続するために、2023/10/19 にサポートされた AWS Glue for Apache Spark ネイティブ接続を使用します。

URL : https://aws.amazon.com/jp/about-aws/whats-new/2023/10/aws-glue-apache-spark-connectivity-google-bigquery/

事前準備 : Google Cloud

サービスアカウントの作成

AWS Glue と BigQuery を接続するために、Google Cloud コンソールからサービスアカウントを作成します。

入力項目

  • サービス アカウントの詳細
    • サービス アカウント名
      • 任意のサービスアカウント名を入力 今回はglue_connectionを入力
      • 作成して続行をクリック
  • このサービス アカウントにプロジェクトへのアクセスを許可する
    • ロールの選択
      • 作成するサービスアカウントに付与する IAM ロールを選択 今回はBigQuery 管理者を選択
      • 完了をクリック

クレデンシャルファイルのダウンロード

作成したサービスアカウントから、クレデンシャルファイルをダウンロードします。
キーのタイプ:JSON を選択し作成をクリックすると、JSON 形式のクレデンシャルファイルがダウンロードされます。

BigQuery テーブル作成

Glueジョブから抽出するためのデータをBigQueryにロードしておきます。
データは Video Game Sales (by Kaggle) vgsales.csvを使用します。

入力項目

  • ファイルを選択
    • ダウンロードした Video Game Sales (by Kaggle) データをアップロード
  • データセット
    • 新しいデータセットの作成からデータセットを新規作成
  • テーブル名
    • 任意のテーブル名を入力 今回はvgsalesを入力
  • スキーマ
    • 自動検出チェックボックスにチェックを入れる
    • ここまで入力したらテーブルを作成をクリック

作成したテーブル:

事前準備 : AWS

クレデンシャルの登録

Google Cloud 側の事前準備で作成 / ダウンロードしたJSON クレデンシャルファイルを AWS Secrets Manager に登録します。 AWS Secrets Manager から新しいシークレットを作成します。

入力項目

  • シークレットのタイプ
    • その他のシークレットのタイプを選択
  • キー / 値のペア
    • キー:credentialsを指定
    • 値:クレデンシャルファイルの中身を base64 エンコードした値を設定
      • 値に改行、スペースが含まれているとエラーになるため注意
$ base64 gcp-credential.json
ewoXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.....

IAM の作成

Glue ジョブが利用する IAM ロールを作成します。

glue.amazonaws.comと信頼関係を持つ IAM ロールを作成し、以下4つのマネージドポリシーを割り当てます。

  • AmazonS3FullAccess
  • AWSGlueServiceRole
  • SecretsManagerReadWrite

S3 バケットの作成

BigQuery から抽出したデータのアップロード先バケットを作成します。
bigquery-glue-testをバケット名に指定し、作成します。

AWS Glue for Apache Spark ネイティブ接続を使用してデータ転送処理を試してみる

Connector の作成

BigQuery と AWS を接続するための Connector を設定します。

設定項目

  • Choose data source
    • Google BigQueryを選択
  • Configure connection
    • Connection details
      • 先ほど作成した AWS Secrets Manager を入力

ジョブの作成

事前準備が整ったので、BigQuery からデータを取得し、Amazon S3 にアップロードするジョブを Glue Studio にて作成します。
Visual ETLをクリックします。

SourceからGoogle BigQueryを選択します。

Source 設定項目

  • Google BigQuery connection
    • 作成した Connector 名を入力
  • Parent project
    • BigQuery テーブルを作成したプロジェクト名を入力
  • Table
    • BigQuery テーブルを作成したデータセット名、テーブル名を入力
    • {データセット名}.{テーブル名}の形式で入力
  • IAM role
    • 作成した IAM ロール名を選択

Sourceの設定が完了したら、次にTargetの設定をします。
TargetからAmazon S3を選択します。

Target 設定項目

  • Node parents
    • Google BigQueryを選択
  • S3 Target Location
    • 作成した S3 バケット名を選択
  • Format
    • 今回は BigQuery に保存されたデータを parquet 形式に変換するため、parquet に設定

以上で設定が完了になります。作成したジョブを実行します。
Glue Studio 画面右上のRunをクリックします。

実行結果

ジョブの実行状態はRunから確認できます。

ジョブの実行が完了したため、S3 バケットを確認します。
BigQuery のデータが parquet 形式に変換され、S3 バケットに保存されているのを確認しました!

作業終了時の注意点

一通り検証が完了したら、Interactive Sessionsを確認しておきます。 Data previewが起動し、裏でInteractive Sessionが起動している可能性があるため、StatusReadyになっていたらStop sessionしておきます。思わぬ課金を防ぐためです。

以上で、AWS Glue for Apache Spark ネイティブ接続を使用して BigQuery のデータを Amazon S3 に転送する は完了となります。ここまで読んでいただきありがとうございました!

参考

https://docs.aws.amazon.com/ja_jp/glue/latest/dg/aws-glue-programming-etl-connect-bigquery-home.html
https://dev.classmethod.jp/articles/aws-glue-connector-for-google-bigquery-bigquery-to-s3/