Cloud Functions をローカルで試せる functions-framework を使ってみる

ローカルのデータを GCS に入れるだけの Cloud Functions をロールで動かして見たいと思います。

参考

インストール

/usr/local/bin/python -m pip install --upgrade pip
pip install functions-framework

階層

下記のように cloud functions で実行するファイル main.py とライブラリインストールようの requirements.txt と GCS にアップロードする hoge.txt を用意してみました。

.
├── hoge.txt
├── requirements.txt
└── main.py

requirements.txt

google-cloud-storage==2.8.0

main.py

import os
from google.cloud import storage

def upload_to_gcs(request):

    BUCKET_NAME = os.environ.get('BUCKET_NAME', None)

    input_path = "./hoge.txt"
    output_path = "./hoge.txt"

    client = storage.Client()
    bucket = client.bucket(BUCKET_NAME)
    blob_gcs = bucket.blob(input_path)
    blob_gcs.upload_from_filename(output_path)

    return f"Something..."

環境変数

バケット名を設定します。

export BUCKET_NAME=bucket-name

実行

ターゲットの引数に関数名を指定するよう。

functions-framework --target upload_to_gcs

この状態で「localhost:8080」に接続すると関数が実行される。

エラーが出る

Credentials が設定されていないのでエラーがでる。

raise exceptions.DefaultCredentialsError

バケットに接続しようとしているが権限がないのでエラーが出ている。
キーが無いので下記の通りにしたら動くはず。。。

client = storage.Client()

credentials = service_account.Credentials.from_service_account_file(KEY_PATH)
client = storage.Client(
    credentials=credentials,
    project=credentials.project_id,
)

ただ実行される GCP 環境の場合は、キーはいらないのでローカルの為に余計なコードは入れなくない。

なので gcloud auth application-default login を使う。

gcloud auth application-default login

これで「~/.config/gcloud/application_default_credentials.json」に認証情報ファイルが作成され、Cloud SDK が実行されるようになるとのこと。

無事ローカルで実行できました。

デプロイする

デプロイします。

gcloud functions deploy upload_to_gcs \
--region=asia-northeast1 \
--runtime=python38 \
--source=. \
--entry-point=upload_to_gcs \
--set-env-vars BUCKET_NAME=bucket-name \
--trigger-http

追加

先日使ってみた Serverless Framework でも Cloud Functions を作って見ようかとも思ったのですが、こちらの記事 によると少々不便との事。

Serverless Framework の開発自体も AWS 向けがメインになっているみたいなので、AWS と同じ様な便利さを想像して使うには現段階では少し厳しいかなと感じました。