BigQueryとAmazon S3を接続するコネクションを構築してみる

2024.03.27

Google Cloudデータエンジニアのはんざわです。
この記事では、BigQueryとAmazon S3を接続するコネクションをGUIから構築してみたいと思います。

コネクションを構築する目的

BigQueryとAmazon S3のコネクションを作成することでs3をデータソースとするBigLakeテーブルを作成することができます。

制限事項

s3をデータソースとするBigLakeテーブルを作成する場合、BigQuery Omniという機能を使用する必要があります。

2024年3月27日の時点でBigQuery Omniがサポートしているリージョンは以下の通りです。
まだまだサポートしているリージョンが少なく、東京リージョンもサポートしておりません...
今後のアップデートに期待です!

リージョンの詳細 リージョン名 同一のBQリージョン
AWS - US East (N. Virginia) aws-us-east-1 us-east4
AWS - US West (Oregon) aws-us-west-2 us-west1
AWS - Asia Pacific (Seoul) aws-ap-northeast-2 asia-northeast3
AWS - Europe (Ireland) aws-eu-west-1 europe-west1

AWS側の操作

早速、コネクションの構築を試してみたいと思います。
構築の手順は以下の公式ドキュメントを参考にしています。

s3バケットの作成

コンソールのサービス一覧からs3を選択し、バケットを作成を選択します。

バケットの名前をcm-bigquery-omni-testとし、リージョンはus-east-1に設定しています。
それ以外の設定はデフォルトでバケットを作成しました。

BigQueryのAWS IAMポリシーを作成

コンソールからIAMを選択し、ポリシーを選択します。

続いて、ポリシーを作成を選択します。

ポリシーエディタの右にあるJSONを選択し、以下の内容を入力し、次へを選択します。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::cm-bigquery-omni-test"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetObject"
            ],
            "Resource": [
                "arn:aws:s3:::cm-bigquery-omni-test",
                "arn:aws:s3:::cm-bigquery-omni-test/*"
            ]
        }
    ]
}

最後にポリシー名をbq_omni_read_onlyとし、それ以外はデフォルトのままポリシーを作成を選択します。

BigQueryのAWS IAMロールを作成

コンソールからIAMを選択し、ロールを選択します。

続いて、ロールを作成を選択します。

信頼されたエンティティタイプにウェブアイデンティティを選択し、アイデンティティプロバイダーにGoogleを選択します。
Audienceはとりあえず00000と入力し、次へを選択します。この値はあとで変更します。

BigQueryのAWS IAMポリシーの作成のセクションで作成したbq_omni_read_onlyのポリシーを検索し、チェックを入れ、次へを選択します。

最後にロール名をBQ_Read_Onlyとし、それ以外はデフォルトのままロールを作成を選択します。

作成したIAMロールのIDはGoogle Cloud側の設定をする際に使用するので控えておきましょう。
例: arn:aws:iam::<AWS_ACCOUNT_ID>:role/BQ_Read_Only

これでAWS側の設定は終了です。
続いて、Google Cloud側の設定を進めます。

Google Cloud側の操作

BigQuery Connectionsを作成

BigQuery Studioのコンソールから追加を選択し、さらに外部データソースへの接続を選択します。

接続タイプにAWS上のBigLake(BigQuery Omni 経由)を選択し、リージョンはs3と同じus-east-1を選択しました。
また、接続IDは適当にbq-s3-connection-testとし、AWSロールIDに先ほど控えたIAMロールのIDを入力し、接続を作成を選択します。

作成したコネクションは以下の通りでBigQuery Google IDは後ほど使用するので控えておきましょう。

もう一度AWS側の操作

IAM ロールに信頼関係を追加

再度、コンソールからIAMを選択し、ロールを選択し、BigQueryのAWS IAMロールを作成で作成したIAMロールを選択します。

続いて、赤枠の編集を選択します。

最大セッション時間を1時間から12時間に変更します
これにより、最大で12時間かかるクエリを実行できるようになります。
BigQueryで各クエリは最大で6時間実行することが可能で、12時間に設定することで再試行を1回実行できる見込みとなっています。

さらに信頼関係のページを開き、信頼ポリシーを編集を選択します。

以下のようにaccounts.google.com:audの箇所を先ほど控えたBigQuery Google IDに書き換え、ポリシーを更新を選択します。

まとめ

今回の記事では、BigQueryとAmazon S3を接続するコネクションを構築してみました。
次回以降はs3と接続したBigLakeテーブルでBigQueryからs3バケットのソースデータに直接クエリを実行してみたいと思います。