🦔

Cloud Functionsをローカル環境で実行する

2023/01/31に公開

前提

  • ランタイムはPython
  • ローカル環境を汚さないようにDev Containersを使用してコンテナ内に環境構築しました

環境

  • Windows11
  • Visual Studio Code(1.74.3)
  • Rancher Desktop(1.70)
  • Dev Containers(0.266.1)

やってみる

実装

  • ファイル構成
    sample                     
    ├─ .devcontainer           
    │   ├─ Dockerfile          
    │   └─ devcontainer.json   
    ├─ requirements.txt         
    └─ main.py                
  • .devcontainer/Dockerfile
FROM python:3.9
USER root

ENV ENV_EXAMPLE="sample"

# pythonで必要なライブラリインストール
RUN mkdir -p /root/src
COPY ./requirements.txt /root/src
WORKDIR /root/src
RUN pip install --upgrade pip
RUN pip install -r ./requirements.txt

  • ENV:ここで指定した環境変数はpythonコード内でos.environ["ENV_EXAMPLE"]で取得することができます
  • .devcontainer/devcontainer.json
{
	"name": "sample_python",
	"context": "..",
	// Dockerfileでイメージ・コンテナを作成
	"dockerFile": "Dockerfile",
	// リモート先のVS Codeにインストールする拡張機能
	"extensions": [
		"ms-python.python",
		"ms-python.black-formatter"
	]
}
  • name:任意の名前をつけます
  • context:Dockerfileでcopyで指定するファイルがDockerfileがあるディレクトリより上にある場合エラーが起きるのでその対策として指定します
  • dockerfile:Dev Containersでコンテナを起動するときにDockerfileを元に起動するように指定します
  • extentions:コンテナ内で使用するVisual Studio Codeの拡張機能のIDを指定します
  • requirements.txt
functions-framework==3.*
  • main.py
import functions_framework

@functions_framework.http
def main(request):
    return f'Hi, {request.json.get("name")}\n'

if __name__ == "__main__":
    main()

  • @functions_framework.http:Cloud FunctionsのHTTP関数として立ち上げる時に使用します
  • 必ず引数とreturnで何か値を返すようにします。エラーが起きないようにするためです

実行

  • Visual Studio Codeの左下の緑を押下すると選択肢が表示されるので、「Reopen in Container」を選択してコンテナを立ち上げます
  • ターミナルで下記コマンドを実行してHTTP関数を立ち上げます
functions-framework --target=main
  • ターミナルで上記のコマンドを実行したのとは別のターミナルを開きこの関数を呼び出してみます
curl -X POST -H "Content-Type: application/json" -d '{"name":"太郎"}' http://localhost:8080
  • ターミナルに下記のように結果が返ってくれば成功です
Hi, 太郎

最後に

functions-frameworkではHTTP関数以外にもイベント関数も立ち上げることができるので別の機会にやってみたいと思います

参考

Discussion