🚛

S3からBigQueryへのデータ転送方法所感メモ

2024/06/21に公開

モチベーション

  • 所用のスポット集計でAWSのS3に吐かれたデータをBigQueryへ転送したい場面があった
  • 「GCSを経由する方法しかしたことなかったけど、S3に直接アクセスできる方法あるっぽいし楽なのでは?」で試した所感をまとめておきたい

(実際の構築方法は全く同じ内容の記事やドキュメントが充実しているので省略し、感想ベースで書いています)

調査した方法

1. GCSを経由する

StorageTransferService(STS)を利用してS3からGCSに転送※し、GCSからBigQueryにLOAD DATA文や外部テーブルを利用してロードする方法
https://cloud.google.com/storage-transfer/docs/source-amazon-s3?hl=ja

※ STSを使わずに gcloud storage sync 等を適当なマシンで実行でも良い

特徴・感想

  • GCSへの転送が若干無駄手間感ある※
  • AWSの認証はセキュリティキーの他にIAMロールも利用できる
  • (試せていないが)CloudFrontが利用できるので大規模データ時に費用やパフォーマンス面で有利になりそう

※構築が多少手間だがSTSのイベントドリブン転送を利用すると、S3とGCSを同期できるのでオペ時の手間は削減可能

採用理由

他の2つが利用できなかったため

2. Amazon S3 BigQuery Omniを利用する

Amazon S3 BigQuery OmniでBigQuery上に外部接続を作成し、LOAD DATA文等でロードする方法
https://cloud.google.com/bigquery/docs/omni-aws-create-connection?hl=ja

特徴・感想

不採用理由

データが吐き出されるS3がBigquery Omniのリージョン外だったため

3. BigQueryのデータ転送サービス(Data Transfer Service)を利用する

BigQueryのデータ転送サービスを利用する方法
https://cloud.google.com/bigquery/docs/s3-transfer?hl=ja

特徴・感想

  • S3から直接BigQueryにロードできる
  • AWSの認証はセキュリティキーのみ
  • BigQueryへのロードのオプションに制限がある(自動スキーマが設定できなかったり、圧縮の項目がなかったり)
    https://cloud.google.com/bigquery/docs/s3-transfer?hl=ja#limitations
  • ロード先のテーブルを用意しておく必要がある

不採用理由

圧縮ファイルの対応と自動スキーマのオプションが対応していなかったため

感想

S3から直接読む方法はなんだかんだ何かしらの制約があり、GCSを経由する方法になりました。。
また、もしデータ基盤等の運用が必要なシステムで組み込むにしても、データ転送サービスのロードのオプションの制限やBigQuery Omniのリージョンの制限は結構引っかかるかもなあと思ったり。

Discussion