Google Cloud PlatformのFaaSであるCloud Functionsを利用したサービスを開発する時のために,できるだけ快適に開発できるようにするために工夫したことをまとめます.
環境
- Python3.8
- macOS 10.15.7
ローカルで実行するためにFunctions Framework for Pythonを使う
Functions Framework for Pythonを使うと,Cloud Functionsで実行する関数をローカルでそのまま実行することができます.
Dockerfileを書きたくない
Dockerfileを作成するのは面倒です.Packerを使うと,自動でいい感じのDocker imageが作成できます.
pack build \ --builder gcr.io/buildpacks/builder:v1 \ --env GOOGLE_FUNCTION_SIGNATURE_TYPE=http \ --env GOOGLE_FUNCTION_TARGET=run \ runner
これでrunner:latestというDocker imageが完成しますので,実行するだけです.docker-composeならば以下の設定でupすれば,http://0.0.0.0:8001/ にサーバーが起動します.環境変数も設定しやすいので便利です.
docker-compose.yaml
version: "3" services: crawler: image: runner:latest ports: - "8001:8001" environment: - ENV=development - PORT=8001 - DEBUG=1 volumes: - ./:/workspace tty: true
hot-reloadする
Functions Framework for Pythonは,内部でFlaskを使っているので,flaskのdebugオプションを有効にすれば,hot-reloadが有効になります.上記のdocker-composeのようにDEBUG=1と指定します.
また,対象となるファイルがDocker imageに反映されるよう,volumesを設定します.packして作成したDocker imageの/workspace
というフォルダーにプロジェクトのファイルが一式コピーされるので,上記のように./:/workspace
などとします.
CloudBuildでデプロイする
GitHubにpushしたらCloudBuildが実行され,Cloud Functionsがデプロイされるようにすると便利です.
cloudbuild.yaml
steps: - name: gcr.io/google.com/cloudsdktool/cloud-sdk entrypoint: gcloud args: - functions - deploy - runner - --region - asia-northeast1 - --entry-point - run - --memory - 128MB - --runtime - python38 - --trigger-http - --timeout - "10"
以上で,ローカルで快適に開発したPython関数をCloud Functionsに簡単にデプロイできるようになりました.