みーのぺーじ

みーが趣味でやっているPCやソフトウェアについて.Python, Javascript, Processing, Unityなど.

快適なCloud Functionsの開発環境を整える

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に簡単にデプロイできるようになりました.