はじめに
LambdaからBigQueryのクエリを発行します。その調査記録です。
基本はAWSを使用していますが、定期的にGCPのBigQueryを参照する機会がありました。
簡単にLambdaで実行すると便利かと思いました。
環境の概要
LambdaのPythonから、GCPのSDKを使用します。
GCPのSDKはレイヤーに保持します。
AWS側に、GCPの認証を設定する必要があります。
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が使えるようになったので、以下の赤枠のボタンからポチっと。
実行手順を記載します。<>の箇所は、自分の値を設定します。
# 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に戻ります。
- レイヤーを作成します。
ランタイムは、Python 3.7
、Python 3.8
を追加しました。
- 関数にレイヤーを追加します。
-
レイヤーを選択して、
レイヤーの追加
を押します。名前は、「お客様のレイヤー」から選択。バージョンは作成したものを選択。
レイヤーを追加すれば、S3のファイルは削除してしまって大丈夫です。
GCPの認証ファイルを取得する。
- 認証を追加する必要があります。
GCPの認証ファイルを、Lambdaに登録する。
jsonはNew File
から、テキストをコピー&ペーストで追加しました。
環境変数GOOGLE_APPLICATION_CREDENTIALS
を追加します。
テスト実行
Lambdaコンソールからテスト実行できました!
つまった点
protobufが無いとエラーが出て困りました・・・
StackOverflowで事例を検索して解決しました。
おわりに
いろいろこれでいいのかと思うところはありますが、実行出来たので掲載しました!
-
SDKはpython直下に置くべきか、site-packagesに置くべきか。
Pythonのバージョンが固定されないよう、Python直下にしました。 -
SDKの作り方はこれでよいのか。
zipに追加するところ -
GCPの認証ファイルはもっと隠せないのか。
環境変数、KMS、パラメータストアなどで。 -
2020.12.16
- CloudShellで実行する記載にしました。動作確認しました。