Mokerの徒然日記2.0

技術系のことをつらつらと。情報に責任は負いません。

【Python】Google Cloud Functionsのデバッグに関するあれこれ

全然まとまった日本語情報が見つからないので、一応未来の自分のためにメモしておく。
という記事を書こうと思ったら、ほぼここにまとまってることに気が付いた。けど書く。

結構deployするのに時間かかるので、できればローカルで実行したいよね、というお話。

いろいろ調べたら、ここ(HTTP 関数のテスト  |  Google Cloud Functions に関するドキュメント)がまとまってて読みやすいことに気が付いたので、そちらを読んだほうが良いかもしれない。

コマンドラインツールgcloud

デプロイとか関数のテストとかがコマンドラインからできるツール。おそらくGoogle Cloud Functionsの開発やるならほぼ必須だと思う。

リンク:gcloud コマンドライン ツールの概要  |  Cloud SDK のドキュメント  |  Google Cloud

まあ、詳細はドキュメントを参照するとして、代表的なコマンドをいくつか…

関数の呼び出し

gcloud functions call [関数名]

関数の呼び出しができる。 GETのパラメータの渡し方がわからなかった。

認証用トークンの取得

gcloud auth print-identity-token

リンク:開発者、関数、エンドユーザーの認証  |  Google Cloud Functions に関するドキュメント

関数を実行するとき、たいていはIAM認証用のトークンが必要なのだが、それをとってきてくれるコマンド。 例えばsubprocessと合わせて、次のようなことが出来る。 これを応用すれば自動テストも可能かもしれない、知らんけど。

url = "関数のURL"
token = subprocess.run(["gcloud", "auth", "print-identity-token"], shell=True, stdout=subprocess.PIPE).stdout.decode()[:-2]    # 最後の改行コードを除く
r = requests.get(url, headers={"Authorization": "bearer " + token})
if r.status_code != 200:
    raise Exception("Communication Error!")

with open("1.pickle", "wb") as f:
    f.write(r.content)

デプロイ

gcloud functions deploy (関数名)

リンク:gcloud functions deploy  |  Cloud SDK のドキュメント  |  Google Cloud

カレントディレクトリ(もしくはオプションで指定したディレクトリ)をまるごとデプロイしてくれる。

Pythonエミュレーターfunctions-framework

リンク:GitHub - GoogleCloudPlatform/functions-framework-python: FaaS (Function as a service) framework for writing portable Python functions

エミュレーター。pipで入れられる。

日本語の情報だと、ここ:GCPのCloud Functionsをローカルでも走らせる方法 | ハックノートとかが参考になるかもしれない。

以上。