BigQuery OmniでAmazon S3のデータをクエリしてみた

記事タイトルとURLをコピーする

G-genの大津です。 Google Cloud (旧称 GCP) において Amazon S3 にあるデータを BigQuery に取り込む方法のひとつとして、BigQuery Omni があります。
BigQuery Omni を使うと、 Amazon S3 を外部データソースとして、 BigQuery からクエリを実行することができます。

今回は BigQuery Omni の使い方や注意点などをまとめてみました。


BigQuery Omni とは

BigQuery Omni とは、 Amazon S3 または Azure blob ストレージに保存されているデータに対して BigQuery からクエリを実行できるサービスです。これにより利用者は AWS や Azure にあるデータを BigQuery に複製することなくクエリを実行し、分析を行うことが可能です。
Amazon Redshift Spectrum の Google Cloud 版と言えばイメージしやすいでしょうか!?

すでに AWS を使用していて、分析の元データは Amazon S3 にあり、データ分析には Google Cloud の BigQuery を使用したいなどのユースケースにおいて、 BigQuery Omni は非常に有効なサービスです。

2022 年 5 月現在、 BigQuery Omni の利用にあたり以下の点にご注意ください。

  1. BigQuery Omni が利用できるAWS対応リージョンは「米国東部(バージニア北部)us-east-1」のみです。AWSの東京リージョン(ap-northeast-1)にあるバケットのデータにはクエリ出来ませんのでご注意ください。
  2. BigQuery Omniは「定額 (BigQuery Reservations)」を利用する必要があります。「オンデマンド」ではご利用できません。

BigQuery Omni の詳細は、以下のページを参照ください。
cloud.google.com

では、実際に BigQuery Omni を使って、 Amazon S3 のデータをクエリしたいと思います。

AWS側での操作

Amazon S3にデータを用意する

まずは Amazon S3 に、元データをアップロードしましょう。
Amazon S3 にデータをアップロードする前に、 Amazon S3 にバケットを作成します。

※今回は「us-east1-sample-data-20220517」という名前を付けています。

バケットを作成するときに、一点注意が必要です。

2022年5月現在、 BigQuery Omni で利用できるリージョンは「米国東部(バージニア北部)us-east-1」のみです。

※今後、BigQuery Omniの対応リージョンが増え「アジアパシフィック (東京) ap-northeast-1」が利用できるようになれば良いですね。

S3バケットのリージョンに注意

IAMポリシーとIAMロールの作成

S3 バケットが作成できたら、次は BigQuery Omni 向けに IAM ポリシーと IAM ロールを作成します。

まずは IAM ポリシーを作成します。
IAM ページにアクセスし、左メニューの「ポリシー」をクリックし「ポリシーの作成」に進みます。ポリシーの作成は「JSON」をクリックして、以下のJSONコードを貼り付けます。

{
"Version": "2012-10-17",
"Statement": [
  {
    "Effect": "Allow",
    "Action": ["s3:ListBucket"],
    "Resource": ["arn:aws:s3:::"上で作成したバケットの名前"]
  },
  {
    "Effect": "Allow",
    "Action": [
      "s3:GetObject"
    ],
    "Resource": ["arn:aws:s3:::"上で作成したバケットの名前"/*"]
  }
]
}

実際の画面では、このような感じになります。

最後に分かりやすい名前とタグを入力して、ポリシーを作成します。

※今回は「Googlecloud-connect」という名前を付けています。

続いて IAM ロールの作成です。以下のパラメータでIAMロールを作成します。

信頼されたエンティティタイプ ウェブアイデンティティ
アイデンティティプロバイダー Google
Audience 0000(あとで正しい値に修正します)

IAMロールの作成画面

次に先程作成したIAMポリシーをアタッチします。
※前述で作成したIAMポリシー「Googlecloud-connect」にチェックを入れます。

最後に分かりやすい名前とタグを入力して、IAMロールを作成します。

※今回は「googlecloud-connect-role」という名前を付けています。

IAMロールを作成後、作成したIAMロールを選択し、詳細画面を確認します。
「編集」をクリックして「最大セッション時間」をデフォルトの1時間から12時間に修正します。

このIAMロールのARNは、このあとの手順で使用しますので、コピーしておきましょう。


Google Cloud 側の操作

BigQuery Connection API を有効にする

BigQuery Omni は BigQuery Connection API を利用します。
ナビゲーションメニューから「APIとサービス」を選択し「有効なAPIとサービス」の画面から「APIとサービスの有効化」から「BigQuery Connection API 」を検索して有効化してください。


BigQuery 外部接続の作成

BigQuery から Amazon S3 に接続するために、まずは外部接続を作成します。

外部接続の作成は、 BigQuery のコンソールから「+データを追加」から「外部データソース」を選択します。

外部データソースは、以下のパラメータを入力し、外部接続を作成します。

接続タイプ AWS
接続 ID この外部接続リソースの名前です。
接続ロケーション aws-us-east1(デフォルトで入力済み)
AWS ロール ID 前述で作成したAWS IAMロールのARNを入力します。

正しく外部接続が作成できると BigQuery のメニューに、作成した外部接続が表示されます。

※今回は「amazon-s3-connect」という名前を付けています

また作成した外部接続の詳細画面から「BigQuery Google ID」が表示されます。
※上記キャプチャ画面ではマスキング処理しています
この「BigQuery Google ID」を、前述で作成したIAMロールの Audience に入力します。


データセットを作成する

次にBigQueryにデータセットを作成します。

作成するデータセットには Amazon S3 を指定したいので「データのロケーション」に「aws-us-east1」を指定します。
※データのロケーションに「aws-us-east1」を指定しない場合、後述するテーブル作成時に外部接続が表示されません。


テーブルを作成する

最後に BigQuery のテーブルを作成します。
前述で作成したデータセットのアクションメニューから「テーブルを作成」を実行します。

テーブルの作成元には「Amazon S3」を選択します。

S3パスには、S3 形式を使用して Amazon S3 のパスを指定します。

ファイル形式は、S3にアップロードしたファイル形式を選択します。
対応しているファイル形式は「csv」「JSONL」「Avro」「Parquet」「ORC」です。

接続IDには、前述で作成した外部接続が表示されますので選択します。


これまでのパラメータが正しく入力できると、以下のようなテーブルが作成されます。


BigQueryからAmazon S3にクエリを実行する

BigQuery Omni を通じて、 Amazon S3 のデータが BigQuery のテーブルとして表示されました。クエリを実行してみましょう!

クエリを実行したところ上記のエラーが表示されました。

BigQuery には「オンデマンド」と「定額 (BigQuery Reservations)」の料金モデルがありますが、BigQuery Omni では「定額」プランでのみ利用可能です。

そのため BigQuery Omni でクエリを実行するには BigQuery Reservations のスロットを購入する必要があります。
しかし、ご安心ください。 BigQuery Reservations には Flex という購入プランがあり、最低 1 分単位で購入可能です。1時間あたり約 600 円程度で検証することが可能です。

BigQuery Reservations については、以下の記事で解説されています。

blog.g-gen.co.jp

BigQuery スロットの購入

BigQuery スロットを購入するには、 BigQuery コンソールの左部メニューから「容量管理」をクリックします。
スロットを購入する際のパラメータは以下の通り。

コミット期間 Flex
ロケーション Amazon US East(N. Virginia)
スロット数 100(最低値)


まとめ

BigQuery Omni を使って、非常に簡単に Amazon S3 のデータを BigQuery の外部テーブルとして表示することができました。しかし、当機能を利用するには BigQuery Reservations を購入する必要があります。
今後 Google Cloud のアップデートでオンデマンドの料金モデルが選択できるようになると、使いやすいサービスになると言えます。

大津 和幸 (記事一覧)

クラウドソリューション部

2022年4月にG-gen にジョイン。
前職まではAWSをはじめインフラ領域全般のなんでも屋。二刀流クラウドエンジニアを目指して、AWSのスキルをGoogle Cloudにマイグレーション中の日々。