Posted at

Cloud Functions(Python)でコードファイルを分割する


概要

Cloud FunctionsでPython(Bata)を利用する場合、関数のエントリーポイントは必ずmain.py ファイルである必要があります。

Cloud Functions The Python Runtime

https://cloud.google.com/functions/docs/concepts/python-runtime


Your function's entrypoint must be contained in a Python source file named main.py.


素直にmain.py に関数を追加していくと、きっと肥大化して悲しくなります。

なので、ファイル分割できないか試してみました。


実装

デプロイするファイルを準備します。

> mkdir 任意のディレクトリ

> cd 任意のディレクトリ
> mkdir src
> touch main.py
> touch hoge.py
> touch src/huge.py


main.py

from hoge import *

from src.huge import huge_huge



hoge.py

from flask import make_response

def hoge_hoge(request):
return make_response('hoge!', 200)



src/huge.py

from flask import make_response

def huge_huge(request):
return make_response('huge!', 200)


はい。

見てのとおりで、import ファイル名 from * とインポートすることで、実現できました。

import ファイル名 from 関数名 とすることも可能です。


検証

実際にデプロイして実行できるか、試してみます。


デプロイ

> gcloud functions deploy hoge_hoge --runtime=python37 --trigger-http

> gcloud functions deploy huge_huge --runtime=python37 --trigger-http

デプロイできたら実行してみます。

> gcloud functions call hoge_hoge --data "{}"

executionId: m10cogh13tx8
result: hoge!

> gcloud functions call huge_huge --data "{}"

executionId: 2adly82qzlts
result: huge!

やったぜ。

これで、main.py には実装を含めず、エントリーポイントとしての役割に特化させることができます。

まだ試していませんが、おそらくは規模が大きくなった場合、パッケージ化することで、さらにすっきりさせることができそうです。


参考

Cloud Functions The Python Runtime

https://cloud.google.com/functions/docs/concepts/python-runtime

簡単なPythonのパッケージを作る方法

https://qiita.com/himenoglyph/items/77f2534bc32eaad494dc