LAC WATCH

セキュリティとITの最新情報

RSS

株式会社ラック

メールマガジン

サイバーセキュリティや
ラックに関する情報をお届けします。

ラックピープル | 

AWS(S3)にあるデータをBigQuery Omniで処理してみた

近年のマルチクラウド化に伴い、分析したいデータが分散配置され、お困りではないでしょうか?

クラウドベンダが増加し、様々な環境でシステムが構築されています。各クラウドベンダによって特徴があるため、より最適化されたシステムを構築するには、複数のクラウドベンダのサービスを組み合わせたシステムが求められます。

今回はマルチクラウド環境で分散するデータに対して一元的に分析を行うための機能を利用した際に、設定した内容と途中躓いたエラーについて共有します。

今回検証を行う環境ではシステムの主要部分はAWS上で稼働していると想定し、データはAWS上に配置しています。データの管理にはデータ分析基盤に秀でているGoogle Cloudを利用します。利用するサービスとしては、Google CloudのDWH(データウェアハウス)として多くの方が利用するBigQueryのサービス「BigQuery Omni」を利用します。概要図は以下になります。

検証環境の概要図

BigQuery Omniの概要

BigQuery OmniはGoogle Cloudのサービスの1つです。BigQuery Omniでは、Amazon Simple Storage Service(Amazon S3)やAzure Blob Storage上にデータを保存したままデータ分析できるため、BigQueryのインタフェースから統合的なデータ管理が可能です。

データ分析の際にGoogle Cloud上にデータを転送する必要はなく、またクエリの結果を直接外部ストレージに書き込むことも可能です。クラウド間でデータのコピーは行われないため、データ移動にかかる料金を抑え、管理のしやすさやセキュリティ面でも利点があります。

BigQuery Omni の概要 | Google Cloud

AWS側での操作

BigQuery OmniでS3上のデータ分析を行うにあたり、AWS側で必要な作業は以下の通りです。

  • Step1.      Amazon S3バケットを作成し、データを格納
  • Step2.      IAMポリシーとIAMロールの作成

Step1. Amazon S3バケットを作成し、データを格納

Amazon S3バケットの作成

CloudFormationにてS3バケットを作成します。

バケット作成時に注意が必要なAWSリージョンは、2023年12月現在BigQuery Omniにて下記の通り対応しています。

AWSリージョン名 AWSリージョン名 AWS
リージョン
BigQuery
リージョン
AWS - US East
(北バージニア)
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

今回は「米国東部(バージニア北部)us-east-1」リージョンにS3バケットを作成します。

(!)CloudFormationでS3バケット作成した際のトラブル

CloudFormationスタックは作成するリソースと同じリージョンを指定する必要があります。「us-east-1」リージョンにスタックを作成する予定でしたが、間違えて「ap-northeast-1」リージョンに作成してしまったため、削除し再度同名バケットを作成しようとしたところ下記エラーがでました。

A conflicting conditional operation is currently in progress against this resource. Please try again.

エラーの原因はバケット削除リクエスト後に削除キューには入りますが、すぐに完全削除されないためです。
2時間ほど経過してから同名バケットの作成を試みたところ、作成できました。

CloudFormationでS3とIAMのリソース作成用スタックを作成します。CloudFormationのパラメータは以下の通りです。

項目 項目 備考
スタック名 lacw-S3-IAM 任意の値
リージョン us-east-1 作成するリソースと
同じリージョンを指定
#-------------------------------------------------
# S3
#-------------------------------------------------
  S3Bucket:
    Type: AWS::S3::Bucket
    Properties: 
      AccessControl: Private
      BucketEncryption:
        ServerSideEncryptionConfiguration:
          - ServerSideEncryptionByDefault:
              SSEAlgorithm: AES256
      BucketName: lacw-bucket
      LifecycleConfiguration:
        Rules:
        - Id: AutoDelete
          Status: Enabled
          AbortIncompleteMultipartUpload:
            DaysAfterInitiation: 7
          ExpirationInDays: 365
          NoncurrentVersionExpiration:
            NoncurrentDays: 7
      VersioningConfiguration:
        Status: Suspended

データ配置

用意したデータをS3バケットに格納します。今回はCSVで作成したデータを配置しました。

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

CloudFormationにてIAMロールを作成します。

最大セッション時間は12時間としています。ポリシーは、先ほど作成したバケット内のオブジェクトの閲覧、取得を許可しています。

「accounts.google.com:aud」パラメータにはのちに作成する「BigQuery Google ID」を指定します。

accounts.google.com:aud: !Sub ${BigQueryID}
#-------------------------------------------------
# IAM Role
#-------------------------------------------------
# S3 access Role
  S3AccessRole:
    Type: AWS::IAM::Role
    Properties:
      RoleName: lacw-googlecloud-connect-role
      AssumeRolePolicyDocument:
        Version: '2012-10-17'
        Statement:
          - Effect: Allow
            Principal:
              Federated: accounts.google.com
            Action:
              - sts:AssumeRoleWithWebIdentity
            Condition:
              StringEquals:
                accounts.google.com:aud: !Sub ${BigQueryID} 
      MaxSessionDuration: 43200
      Policies:
        - PolicyName: lacw-s3-access-policy
          PolicyDocument:
            Version: "2012-10-17"
            Statement:
              - Effect: Allow
                Action:
                  - s3:ListBucket
                Resource: "arn:aws:s3:::lacw-bucket"
              - Effect: Allow
                Action:
                  - s3:GetObject
                Resource: "arn:aws:s3:::lacw-bucket/*"

IAMロール作成後、Google Cloud側での接続で必要となるIAMロールARNを控えておきます。

arn:aws:iam::{AWSアカウントID}:role/lacw-googlecloud-connect-role

Google Cloud側での操作

BigQuery OmniでS3上のデータ分析を行うにあたり、Google Cloud側で必要な作業は以下の通りです。

  • Step1.     外部データソースの作成
  • Step2.     データセットの作成
  • Step3.     テーブルの作成
  • Step4.     クエリの実行

Step1. 外部データソースの作成

「外部データソースの作成」では「BigQuery Omni経由」を指定し、AWS側で作成したS3にアクセスするためのロールを指定します。またリージョンはAWSと合わせる必要があります。

項目 項目 備考
接続タイプ AWS上のBigLake(BigQuery Omni経由)
接続ID aws-lacw-s3 任意の値
リージョン aws-us-east-1 S3のリージョンに合わせる必要あり
AWSロール
ID
arn:aws:iam::******** AWSで作成したロールを指定
外部データソースの作成
外部データソースの作成

Step2. データセットの作成

「データセットの作成」は以下のように行います。

項目 項目 備考
データセット
ID
test_dataset 任意の値
ロケーションタイプ リージョン(aws-us-east-1) S3のリージョンに合わせる
データセットの作成
データセットの作成

(!)データセット作成時のトラブル

データセット作成時の入力内容は少ないですが、検証時はここでエラーがでました。

データセットを作成できませんでした aws-us-east-1 violates constraint constraints/gcp.resourceLocations on the resource projects/gcp-lac-project-0015/datasets/test

エラーの原因としてはGoogle Cloud側の組織ポリシーでした。リソースのロケーション制限により利用可能なリージョンが制限されています。BigQuery Omniを利用できるリージョンは普段利用していないリージョンであり、今回利用した環境ではそのリージョンの利用が許可されていませんでした。対応としてはロケーション制限のポリシーで許可リストに追加することで解決しました。

リソース ロケーションの制限 | Resource Manager のドキュメント | Google Cloud

Step3. テーブルの作成

「テーブルの作成」では再度AWSに合わせた設定を行います。

「テーブルの作成元」で「Amazon S3」を選択し、「S3パス」では実際に分析を行いたいCSVファイルのパスを指定します。
外部テーブルの接続IDではStep1で作成した外部データソースを指定します。

項目 項目 備考
テーブルの作成元 Amazon S3
S3パスを選択 s3://******** AWS上から取得したパスを指定
ファイル形式 CSV
データセット test-dataset Step2で作成したデータセットを指定
テーブル test-table 任意の値
テーブルタイプ 外部テーブル
接続ID Aws-us-east-1.aws-lacw-s3 Step1で作成した外部接続を選択
スキーマ 自動検出
テーブルの作成
テーブルの作成

(!)テーブル作成時のトラブル

テーブルの作成作業でエラーが発生しました。

権限がありません。管理者にお問い合わせください。元のエラー メッセージ: テーブルを作成できませんでした: Access Denied: Dataset gcp-lac-project-0015:test_dataset: Permission bigquery.tables.create denied on dataset gcp-lac-project-0015:test_dataset (or it may not exist).

内容としてはテーブルを作成しようとしているアカウントでBigQueryに関するロールが付与されていなかったため発生したエラーです。今回は作業していたアカウントに対して「BigQuery Admin」のロールを付与して対応しました。

Step4. クエリの実行

実際にクエリを実行してみます。単純なSelect文ですが実行すればS3上に保存したCSVのデータを取得できました。

また今回取り扱ったデータには日本語が含まれているのですが、文字化けが発生しました。扱っていたファイルがsjisで作成されていたため、UTF-8に変換してS3上にアップロードし直すことで、文字化けは解決して漢字も正しく表示されるようになりました。

クエリの実行
クエリの実行

スキーマの自動検出を有効化したことで、IntやDate型について自動的に判定されました。誤判定される場合は手動で定義する必要があります。

スキーマの自動判定
スキーマの自動判定

別のデータファイルを元に分析したい場合はStep3とStep4を再度行えば複数のテーブルに対してクエリ実行が可能です。

利用料金

BigQuery Omniは以前までは「定額」プランでしか利用できませんでした。利用するには通常のオンデマンドの料金とは別に時間単位で課金が発生するBigQuery Reservationsのスロット購入が必要だったため、少し敷居が高かったように感じます。

しかし2023年12月現在、BigQuery Omniはオンデマンドの料金プランをサポートしています。そのため今回の検証のような少量のデータ処理ではBigQuery Reservationsのスロット購入する必要はなく、BigQueryの利用全体を通じても無料で検証できました。

おわりに

今回の記事では、BigQuery Omniを使ってS3にあるデータをBigQueryに外部テーブルとして表示できました。私自身はAWSしか触ったことがなかったのですが、Google Cloud側の操作も難航することなく検証を進められました。

普段はAWS、Azureしか使用することがないといった方も、BigQueryを使ってデータ分析をしてみてはいかがでしょうか。

プロフィール

CCoE部AWS推進チーム

CCoE部AWS推進チーム
CCoE部AWS推進チームではAWSの各サービスを最大限活用するために日々技術検証や教育プログラムの検討を行っております。その活動のなかで得られた有益な情報を外部へ発信していきます。

この記事は役に立ちましたか?

はい いいえ

関連記事

LAC WATCH

関連記事をご紹介します

  • AWS Control Towerでマルチアカウント環境を構築してみた

  • AWS Configアグリゲータによる収集データを、AWS LambdaからAPIで取得する

  • 4大パブリッククラウドの活用と課題を考える~社内イベント「マルチクラウドNight!」開催レポート