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 と同じ様な便利さを想像して使うには現段階では少し厳しいかなと感じました。
ディスカッション
コメント一覧
まだ、コメントがありません