GCPのfunctions_frameworkでPyCharmのデバッガを使えるようにする!

GCP

この記事について

PythonでGCP Cloud Functionsのコードを書いていた時に、デバッガで変数の値や型を確認したくてしょうがなかったときの解決法をまとめたメモ。

解決法

functions_frameworkにPyCharmのデバッガをアタッチできるようにするには、実行環境を以下のように構成すればよい。

  • function_frameworkモジュールを選択
  • パラメーターにポート、ターゲット、functionのタイプ(オプション)を指定

Functionのコード

webhook URLを含むJSON NがPOSTされたらFirestore内データをupdateするAPIを作っていく。

import functions_framework
from flask import make_response
import validators

@functions_framework.http def update_data(request): request_json = request.get_json() request_id=uuid.uuid4() log(request_json,request_id)
if not request_json or not request_json['webhook_url'] or not validators.url(request_json['webhook_url']): response = make_response("Bad request.", 400) response.headers['X-REQUEST-CODE'] = request_id return response update(request_json['webhook_url']) return "{} has been successfully inserted.".format(request_json['webhook_url'])
def log(request_json,request_id): pass def update(webhook_url): pass

functionsフレームワークの実行

functionsフレームワークでPythonの関数を呼び出すにはターミナルからオプション付きで以下のコマンドを実行する。

 % functions_framework --target update_data --port 8080 --signature-type http

データのPOST

クライアントからcurlで以下のJSONをPOSTするとURLの形式がvalidatorにひかっかりエラーとなる。そんなとき、入っている値を確認しようにもターミナルでの実行だとデバッガが使えず、もどかしい思いをしたことはないだろうか。

# curl -X POST localhost:8080 -H "Content-Type: application/json" -d '{"webhook_url":"https://localohst"}'
Bad request.

PyCharmの実行環境変更

大事なのは二点

  • main.pyではなく、function_frameworkモジュールを選択する
  • パラメーターにポート、ターゲット、functionのタイプ(オプション)を指定する

これでPyCharm上でfunctionフレームワークを実行できるのでデバッグし放題になる。 file

Apple Siliconでのエラー

M2 Macだと以下のようなエラーがでて出て、サブプロセスにデバッガをアタッチできなかった。(Rosettaはオフ) エラーが出るものの、デバッガはアタッチはできてブレークポイントも動作した。

Connected to pydev debugger (build 223.8214.51)
Error loading: /Applications/PyCharm CE.app/Contents/plugins/python-ce/helpers/pydev/pydevd_attach_to_process/attach_x86_64.dylib

Jetbrainsのほうでも同じ事象を訴えている人たちがいるのでそのうちなおるだろう。 https://youtrack.jetbrains.com/issue/PY-48163

なお、Intel版Macではこのエラーは発生しなかったので、同様のエラーで悩まされている人がいたらx86環境で試してみてほしい。

タイトルとURLをコピーしました