🖐️

BigQuery で AWS Glue 連携データセットを作成する

2023/11/08に公開

こんにちは、クラウドエース データML ディビジョン所属の濱です。

データML ディビジョンでは、Google Cloud が提供しているデータ領域のプロダクトについて、新規リリースをキャッチアップするための調査報告会を毎週実施しています。
新規リリースの中でも、特に重要と考えるリリースを記事としてまとめ、本ページのように公開しています。

今回紹介するリリースは、「AWS Glue 連携データセットの作成」についてです。

概要

2023年9月13日の BigQuery のリリースノートに掲載されたリリースについての解説です。
このリリースの内容を要約すると、AWS Glue で管理しているデータベースを用いて BigQuery から連携データセットを作成するよ、という内容です。
今回は、「連携データセット」をBigQuery で AWS Glue の既存データベースにリンクされたデータセットと定義します。
本記事では主に、連携データセットに関する実装方法や検証を公式ドキュメントに沿って行い、どのような挙動が起こるかを確認します。その後、料金体系をまとめ、どのタイミングでどのサービスに対して料金が発生するか確認します。
なお、この機能はプレビュー段階となっています。

メリット

AWS 内のデータを直接参照するので、クラウド サービス間でデータのコピーを行いません。したがって、パフォーマンスやセキュリティ、コストなどの面で様々なメリットがあります。
また、今までは Amazon S3 の単一データに対してのみ BigQuery Omni を仲介した分析が可能でした。しかし今回のリリースによって、AWS 上の複数データをまとめて管理できる AWS Glue のデータベースをもとに連携データセットを作成することが可能になりました。したがって、連携データセットを通してAWS 上の複数データを一元的に分析できるようになりました。これも大きなメリットです。
他にも、AWS 側でデータの更新があった場合、連携データセットが自動で更新されるのも嬉しいですね。

ユースケース

複数のファイルの管理を AWS 側で行っているが、分析を Google Cloud 側で行いたい場合に最適です。Amazon S3 に保存しているデータを BigQuery で分析、分析結果を Looker Studio で可視化…なんてことも可能です。

システム構成図

今回検証するシステム構成図は以下のようになっています。

Amazon S3 で管理しているデータを、AWS Glue でデータベースとして保存、それを BigQuery Omni で接続可能な状態にして BigQuery で連携データセットを作成します。

サービスの概要

ここでは、今回のリリースに関係のあるサービスを紹介します。
上記のシステム構成図で登場する順に説明します。

Amazon Simple Storage Service (Amazon S3)

Amazon S3 は、データのバックアップ、アーカイブ、ビッグデータ分析など、様々なユースケースに対応したスケーラブルなオブジェクト ストレージ サービスです。今回は検証用データをバケットに保存するだけですが、様々な用途があります。
Amazon S3 の概要

AWS Glue

AWS Glue の中でも、今回使用するサービスはデータカタログです。データカタログによって、AWS 上のデータ ストレージ(Amazon S3、Amazon RDS、Amazon Redshift)のメタデータを自動的に収集、保存することで、AWS 上のデータを一元管理可能です。また AWS Glue を通じて、管理しているデータに対し、クエリも実行できます。
AWS Glue の概要

BigQuery Omni

BigQuery Omni を利用すると、BigLake テーブルを使用して、Amazon S3 または Azure Blob Storage に保存されたデータに対してクエリを実行できます。
利用できるリージョンに制限があるので、実際に使用する場合には下記のリージョンを選択しましょう。
(今回の検証ではaws-us-east-1を選択しています。)

リージョンの説明 リージョン名 同場所の BigQuery リージョン
AWS - 北バージニア aws-us-east-1 us-east4
AWS - オレゴン aws-us-west-2 us-west1
AWS - ソウル aws-ap-northeast-2 asia-northeast3
AWS - アイルランド aws-eu-west-1 europe-west1
Azure - East US 2 azure-eastus2 us-east4

BigQuery Omni の概要

BigQuery

BigQuery は、機械学習、地理空間分析、ビジネス インテリジェンスなどの組み込み機能を使用してデータの管理と分析を支援する、フルマネージドのエンタープライズデータウェアハウスです。
BigQuery とは

AWS Glue へクエリを実行する

検証概要

ここでは、実際に連携データセットを作成し、そのデータセットに対してクエリを実行してみます。また環境構築も含め、クエリを実行するまでの手順もご紹介します。
なお、基本的にはGoogle Cloud 公式ドキュメントに沿って作業をしたので、その要約となります。
それぞれの項目で、より詳しい内容を知りたい場合は以下のページを参考にしてください。
Amazon S3 に接続する
AWS Glue 連携データセットを作成する

実装方法

環境を準備する

以下2点を準備します。

  • Google Cloud プロジェクト
  • AWS で IAM ポリシーを変更する権限を持つ AWS アカウント

必要なAPIを有効化する

BigQuery の外部接続を許可するためにBigQuery Connection APIを有効化します。
また、BigQuery Omni の利用には BigQuery Omni with editions と呼ばれる容量ベースの課金を有効にしないといけないようです。それを有効にするためにBigQuery Reservation APIを有効化します。
Google Cloud Console 上の検索バーで「BigQuery Connection」や「BigQuery Reservation」などで検索し、有効化しましょう。
(以下の画像は、BigQuery Reservation API を有効化したときのものです。)

Google Cloud IAM を設定する

検証を行うために必要なロールは以下になります。IAM コンソールから必要なロールを付与しましょう。

  • BigQuery Connection 管理者(roles/bigquery.connectionAdmin
  • BigQuery 管理者(roles/bigquery.admin

Amazon S3 にバケットを作成する

  1. AWS 公式ドキュメントを参考にAmazon S3 バケットを作成します。
    このとき、AWS上の全てのサービスについて、リージョンを統一する必要があります。また連携データセットを作成するには、BigQuery Omni を利用します。したがって、選択するリージョンは、BigQuery Omni を利用できるリージョンにしなければいけません。
    以上を踏まえ、本検証では、AWS リージョンをus-east-1に設定しました。
  2. 先程作成したバケットに、検証用のファイルをアップロードします。
    今回アップしたファイルは、以下のようなCSVファイルです。
purchase_date,purchase_name,fruit,quantity
2023/10/18,A,lemon,10
2023/10/19,B,apple,3
2023/10/20,A,apple,14
2023/10/21,C,lemon,5
2023/10/22,B,peach,10

Amazon S3 バケットとAWS Glue を紐づける

  1. AWS Glue のコンソールに移動します。
    コンソール画面上部のロケーションが書いてある部分(下画像の赤い四角)をus-east-1(バージニア北部)に変更します。
    ここで別ロケーションのまま作業すると上手く動作しません。私はこれに気づかず時間を使ってしまいました。

  2. 「Data Catalog」→「Databases」の順にクリックし、「Add database」から新しいデータベースを作成します。

  3. 作成したデータベースをクリックし、「Add table」から S3 バケットを指定して紐付けを行います。
    プロパティは以下のように設定してください。

プロパティ 設定
Name 任意の名前(私はfruit_dataとしました)
database データベース名
Include path s3のパス。形式はs3://s3バケット名/
Data format CSV
Delimeter Comma(,)
  1. スキーマを指示にしたがって1つずつ設定します。

    また、JSONでのスキーマ指定も可能です。
    注意点として、スキーマを設定しなかった列は、AWS Glue に表示されず、BigQuery 側からも見ることはできません。
    (私は以下のように設定しました。今回の検証は、BigQuery からの接続を主眼としているため、データ型については全てデフォルトの string としました。)
[
  {
    "Name": "date",
    "Type": "string",
    "Comment": ""
  },
  {
    "Name": "name",
    "Type": "string",
    "Comment": ""
  },
  {
    "Name": "fruit",
    "Type": "string",
    "Comment": ""
  },
  {
    "Name": "quantity",
    "Type": "string",
    "Comment": ""
  }
]
  1. 最後に今まで設定した内容をチェックして、「Create」をクリックします。

AWS IAM ロールを作成する

  1. AWS の IAM のコンソールより「ポリシー」をクリックします。
  2. ポリシーエディタで「JSON」をクリックし、以下の内容を記述します。
    AWS アカウントIDはアカウント名の@の後ろにある12桁の数字列です。ハイフンを入れずに入力してください。
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::<バケット名>"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetObject"
            ],
            "Resource": [
                "arn:aws:s3:::<バケット名>",
                "arn:aws:s3:::<バケット名>/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "glue:GetDatabase",
                "glue:GetTable",
                "glue:GetTables",
                "glue:GetPartitions"
            ],
            "Resource": [
                "arn:aws:glue:us-east-1:<AWS アカウントID>:catalog",
                "arn:aws:glue:us-east-1:<AWS アカウントID>:database/<データベース名>",
                "arn:aws:glue:us-east-1:<AWS アカウントID>:table/<データベース名>/*"
            ]
        }
    ]
}
  1. 任意の名前を指定し、「ポリシーを作成」をクリックします。
  2. AWS の IAM のコンソールより「ロール」をクリックします。
  3. 「ロールを作成」をクリックし、エンティティを以下のように設定します。
プロパティ
信頼されたエンティティタイプ ウェブアイデンティティ
アイデンティティプロバイダー Google
Audience 00000(後で変更します)
  1. 3.で指定した名前を検索しポリシーを選択します。
  2. 任意の名前を指定し「ロールを作成」をクリックします。

BigQuery と AWS Glue の接続を作成する

  1. Google Cloud Console で BigQuery にアクセスします。
  2. 「エクスプローラ」横にある「+追加」をクリックします。
  3. 「外部データソースへの接続」をクリックします。
  4. 外部データソースを以下のように設定します。
プロパティ
接続タイプ AWS 上の BigLake(BigQuery Omni 経由)
接続 ID 任意の文字列
リージョン aws-us-east-1
分かりやすい名前 任意の文字列(設定は任意)
説明 任意の文字列(設定は任意)
AWS ロール ID 作成したロールの ARN(例 arn:aws:iam::<AWS ユーザ ID>:role/<ロール名>
  1. 「接続を作成」をクリックします。
  2. 「エクスプローラ」から「外部接続」をクリックし、aws-us-east-1.接続IDとなっているものをクリックします。
  3. 「接続情報」ペインから BigQuery Google ID をコピーします。
  4. AWS の IAM コンソールより「ロール」をクリックします。
  5. 作成したロール名をクリックします。
  6. 「編集」をクリックして、「最大セッション時間」を「12時間」に設定します。
  7. 「信頼関係」→「信頼ポリシーを編集」の順にクリックし、ポリシーの内容を以下のもので置き換えます。
    ここで"accounts.google.com:sub":の値を先ほどコピーしたBigQuery Google IDに置き換えます。
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Federated": "accounts.google.com"
      },
      "Action": "sts:AssumeRoleWithWebIdentity",
      "Condition": {
        "StringEquals": {
          "accounts.google.com:sub": "<BigQuery Google ID>"
        }
      }
    }
  ]
}

AWS Glue 連携データセットを作成する

  1. Google Cloud Shell を有効にして、以下のコマンドを実行します。
bq --location=aws-us-east-1 mk --dataset \
   --external_source aws-glue://<AWS Glue ソース> \
   --connection_id <Google Cloud プロジェクトID>.aws-us-east-1.<接続ID> \
   <連携データセットの名前>

ここの置換ですが、ややこしいので注意です。

変数名 説明
AWS Glue ソース arn:aws:glue:us-east-1:123456789000:database/<データベース名>
Google Cloud プロジェクトID 最初に作成したGoogle Cloud プロジェクトID そのもの
接続ID BigQuery と AWS Glue の接続を作成する」パートで設定した接続ID
連携データセットの名前 任意の文字列

私の環境では以下のようになりました。

bq  --location=aws-us-east-1  mk  --dataset \
    --external_source aws-glue://arn:aws:glue:us-east-1:<AWS アカウントID>:database/hama-zenn \
    --connection_id <Google Cloud プロジェクトID>.aws-us-east-1.zenn_test \
    bq_to_aws_bucket2

実行後、Dataset '<Google Cloud プロジェクトID>:<連携データセットの名前>' successfully created.と出力されたら連携データセットが作成されています。
ページのリロードを行って連携データセットができたことを確認しましょう。

スキーマに指定した通りにフィールド名が変更されていることが確認できます。

これで連携データセットの作成は完了です。

検証結果

連携データセットに対して、クエリを実行したときの挙動を確認してみましょう。

  1. BigQuery の「クエリ」タブより、以下のクエリを実行します。
    これは「fruit = 'lemon'である行を出力するSQL文です。
SELECT *
 FROM `<Google Cloud プロジェクトID>.bq_to_aws_bucket2.fruit_test`
where fruit = 'lemon'
;
  1. クエリ結果を確認します。

    fruit = 'lemon'を満たす全ての行が出力されています。
    この挙動は、BigQuery にデータを保存しているときと同じ挙動を示しています。

これで、BigQuery 自体に保存しているデータに対する分析と同じ感覚で、AWS Glueで管理しているデータに対し、分析を行うことができました。

料金体系

最後に料金体系をまとめます。リージョンごとに料金が変わることがあるので、実際に使用する前に公式ドキュメントで調べましょう。

BigQuery

実装方法パートに関して、BigQuery は連携データセットの作成と保存を行っています。これらについて、BigQuery では「ストレージ料金」の課金が発生します。詳細は以下の公式ドキュメントをご覧ください。
BigQuery のストレージ料金
また、検証結果パートではクエリの実行を行いました。これについては、BigQuery の「分析料金」が発生します。詳細は以下の公式ドキュメントをご覧ください。
BigQuery の分析料金

BigQuery Omni

BigQuery Omni はワークロードとニーズに応じて2種類の料金体系から選択できます。

従量課金制

こちらは消費したバイト数で料金が決まる体系です。公式ドキュメントでは1TiB当たりの料金が記載されています。以下のような料金体系となっています。

リージョン 料金(1TiB当たり)
aws-us-east-1 $7.82
aws-ap-northeast-2 $10.00
aws-us-west-2 $7.82
aws-eu-west-1 $8.60
azure-eastus2 $9.13

BigQuery Omni with editions(Enterprise Edition)

専用または自動スケーリングされたクエリ処理能力に対して、一定期間で料金を支払う体系です。以下のような料金体系となっています。

aws-us-east-1
コミットメントモデル 1時間当たりの料金 スロット数
PAYG(コミットメントなし) $7.50 (1分単位の課金。秒数以下は切り上げ) 100
1年コミットメント $6.00 (1年単位の課金) 100
3年コミットメント $4.50 (3年単位の課金) 100

BigQuery Omni の料金はクエリ実行時のみ課金が発生し、ストレージの費用には適用されません。接続して連携データセットを作成するだけなら BigQuery Omni に課金は発生しないと捉えることができます。
BigQuery Omni の料金

Amazon S3

今回、Amazon S3 を用いてテーブルの保存を行いました。
テーブルの保存については、従量課金制となっており、以下の公式ドキュメントに料金体系がまとめられています。非常に多くの料金体系があるため、公式ドキュメントをご覧ください。
Amazon S3 の料金

AWS Glue

AWS Glue には様々な機能がありますが、今回は「データカタログの保存とリクエスト」分野の料金体系を取り上げます。
以下のような料金体系となっています。

us-east-1

操作 無料枠 課金条件 料金
ストレージ 最初の100万個のオブジェクト保存 月100万個を超えると、10万個のオブジェクト毎に $1.00
リクエスト 最初の100万回のリクエスト 月100万回を超えると、100万回のリクエスト毎に $1.00

公式ドキュメントに料金の例が記載されているので、そちらを見ることで詳細にイメージできるかと思います。
AWS Glue の「データカタログの保存とリクエスト」関連の料金

料金体系のまとめ

連携データセットを作成するとき、Google Cloud 側の課金対象は、連携データセットを保存するときの BigQuery ストレージです。
また、AWS 側の課金対象は 元データを保存するときの Amazon S3 と AWS Glue となります。
クエリを実行した場合、それらに BigQuery Omni の料金が追加される形になります。
また、1つのサービスに様々な料金体系が存在するので、最適な料金体系を選べるようにしましょう。

まとめ

今回は、BigQuery と AWS Glue の連携データセットについてのメリットや実装方法、料金体系について調査しました。
まだプレビュー段階なので、GAになったときにより詳しいドキュメントがあがるのではないかと考えています。
今後、関連記事には注目していきたいと思います。

Discussion