LoginSignup
15
12

More than 3 years have passed since last update.

LambdaからBigQueryを実行する

Last updated at Posted at 2019-11-24

はじめに

LambdaからBigQueryのクエリを発行します。その調査記録です。
基本はAWSを使用していますが、定期的にGCPのBigQueryを参照する機会がありました。
簡単にLambdaで実行すると便利かと思いました。

環境の概要

LambdaのPythonから、GCPのSDKを使用します。
GCPのSDKはレイヤーに保持します。
AWS側に、GCPの認証を設定する必要があります。

スクリーンショット 2019-11-16 17.55.25.png

SDKと言っているのは、Pythonのクライアントライブラリーのことです。
https://googleapis.dev/python/bigquery/latest/generated/google.cloud.bigquery.client.Client.html

手順

前提条件

AWSアカウントを所有している。
GCPアカウントを所有している。APIからBigQueryを使える。
BigQueryテーブルは作成済み。
AWSのアクセスキーを所有している

Lambda関数を作成する。

BigQueryを実行するのみのPythonコードです。まずは、これを動かします。

  • Lambda関数の設定は以下です。
    • 新規作成
    • Python3.8
    • アクセス権限は自動生成のCloudWatch Logsのみ。
    • タイムアウトは30秒にしました。
    • レイヤーと環境変数は後ほど。
    • <>は自分の値を設定します。
import json
from google.cloud import bigquery

def lambda_handler(event, context):
    client = bigquery.Client()
    sql = """
        SELECT *
        FROM `<my-project>.<my-dataset>.<my-table>`
        LIMIT 10
    """

    # Run a Standard SQL query using the environment's default project
    results = client.query(sql).result()
    for row in results:
        print(row)

    return {
        'statusCode': 200,
        'body': json.dumps('Hello from Lambda!')
    }

Lambdaのレイヤーに登録するための、GCPのSDKを作成する。

LambdaのPythonでimport bigquery を使用するために、SDKをレイヤーに追加します。
pipで取得してzipで固めます。
CloudShellが使えるようになったので、以下の赤枠のボタンからポチっと。

image.png

実行手順を記載します。<>の箇所は、自分の値を設定します。

# pipのインストール
curl -O https://bootstrap.pypa.io/get-pip.py
python3 get-pip.py

ここ、CloudShellの初期設定そのままでpip install ...だとpipが見つからず・・
pip3 install ...とすると、うまくいきませんでした😭
ですので、pipをインストールしています。

# sdkのインストール&zip化
pip install google-cloud-bigquery -t ./python/
zip -r google-cloud-bigquery.zip python
# protobufが必要なため追加
pip install protobuf --upgrade -t ./python/
zip -r google-cloud-bigquery.zip ./python/google/protobuf
# s3に保存
aws s3 mb s3://<my-bucket>
aws s3 cp google-cloud-bigquery.zip s3://<my-bucket>

作成したライブラリをLambdaのレイヤーに登録する。

Lambdaに戻ります。

  • レイヤーを作成します。 スクリーンショット 2019-11-24 11.18.55.png

ランタイムは、Python 3.7Python 3.8を追加しました。

  • 関数にレイヤーを追加します。
    スクリーンショット 2019-11-24 11.11.29.png

    • レイヤーを選択して、レイヤーの追加を押します。

    名前は、「お客様のレイヤー」から選択。バージョンは作成したものを選択。
    スクリーンショット 2019-11-24 11.22.41.png
    - レイヤーが追加されました。
    image.png

レイヤーを追加すれば、S3のファイルは削除してしまって大丈夫です。

GCPの認証ファイルを取得する。

  • 認証を追加する必要があります。

  • jsonのサービスアカウントキーを作成します。

    上記リンク中の[サービス アカウントキーの作成] ページに移動から。
    役割は「BigQuery管理者」を選択しました。
    image.png

GCPの認証ファイルを、Lambdaに登録する。

jsonはNew Fileから、テキストをコピー&ペーストで追加しました。
環境変数GOOGLE_APPLICATION_CREDENTIALSを追加します。

image.png

テスト実行

Lambdaコンソールからテスト実行できました!

つまった点

protobufが無いとエラーが出て困りました・・・
StackOverflowで事例を検索して解決しました。

おわりに

いろいろこれでいいのかと思うところはありますが、実行出来たので掲載しました!

  • SDKはpython直下に置くべきか、site-packagesに置くべきか。
    Pythonのバージョンが固定されないよう、Python直下にしました。

  • SDKの作り方はこれでよいのか。
    zipに追加するところ

  • GCPの認証ファイルはもっと隠せないのか。
    環境変数、KMS、パラメータストアなどで。

  • 2020.12.16

    • CloudShellで実行する記載にしました。動作確認しました。
15
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
12