Cloud Functions の開発を行う際に毎回 Cloud Functions にデプロイするのが大変だったので、ローカル環境で実行する方法を調べました。
ファイル構成
$ tree . ├── Makefile ├── README.md ├── docker │ └── Dockerfile └── package ├── config ├── lib │ └── sample.py ├── main.py └── requirements.txt
サンプルコード
Makefile
MAKE=make --no-print-directory SHELL=/bin/bash .SHELLFLAGS = -o pipefail -c export UID = $(shell id -u) export GID = $(shell id -g) include .env export $(shell cat .env | tr -d '"' | sed 's/=.*//') # 内部変数 GCLOUD_RUN_CMD=gcloud functions call ${GCLOUD_NAME} \ --region=${GCLOUD_REGION} --gen2 \ --data '{"dry_run":false}' GCLOUD_DEPLOY_CMD=gcloud beta functions deploy ${GCLOUD_NAME} \ --gen2 --trigger-http \ --region=${GCLOUD_REGION} \ --runtime=${GCLOUD_RUNTIME} \ --memory=${GCLOUD_MEMORY} \ --source=${GCLOUD_SOURCE} \ --entry-point=${GCLOUD_ENTRY_POINT} DOCKER_COMPOSE_BUILD_CMD=docker-compose up \ --build \ --remove-orphans DOCKER_COMPOSE_UP_CMD=docker-compose up LOCAL_RUN_CMD=curl -X POST -H "Content-Type: application/json" \ -d '{"dry_run":false}' \ http://${DOCKER_IPV4}:${DOCKER_PORT} .PHONY: run run: @${GCLOUD_RUN_CMD} .PHONY: deploy deploy: .env @${GCLOUD_DEPLOY_CMD} .PHONY: local_build local_build: .env @${DOCKER_COMPOSE_BUILD_CMD} .PHONY: local_up local_up: .env @${DOCKER_COMPOSE_UP_CMD} .PHONY: local_clean local_clean: docker system prune -a .PHONY: local_run local_run: ${LOCAL_RUN_CMD}
env
DOCKER_IMAGE={{dockeイメージ}} DOCKER_CONTAINER_NAME={{コンテナ名}} DOCKER_IPV4=0.0.0.0 DOCKER_PORT=8080 GCLOUD_NAME={{ファンクション名}} GCLOUD_REGION=asia-northeast1 GCLOUD_RUNTIME=python312 GCLOUD_MEMORY=512MB GCLOUD_SOURCE=./package GCLOUD_ENTRY_POINT=main
docker-compose.yaml
version: '3' services: cloud_functions: restart: always build: . container_name: "${DOCKER_CONTAINER_NAME}" user: "${UID}:${GID}" working_dir: '/root/' tty: true ports: - "${DOCKER_PORT}:${DOCKER_PORT}" network_mode: "host" volumes: - ./:/root/ command: > /bin/sh -c ' cd package && echo "Running on http://${DOCKER_IPV4}:${DOCKER_PORT}/ (Press CTRL+C to quit)" && functions-framework --target=main'
Dockerfile
FROM python:3.12.2 WORKDIR /app COPY package/ ./ ENV PIP_ROOT_USER_ACTION=ignore RUN pip install --upgrade pip RUN pip install -r requirements.txt
使い方
make deploy
Cloud Functionsにデプロイします。
$ make deploy
make run
cloud functionで作成した関数を実行します。
$ make run
make local_up
ローカル環境でサーバを立ち上げます。
$ make local_up Starting sample_container ... done Attaching to sample_container sample_container | Running on http://0.0.0.0:8080/ (Press CTRL+C to quit)
make local_run
ローカル環境でcloud functionで作成した関数を実行します。
$ make local_run curl -X POST -H "Content-Type: application/json" -d '{"dry_run":false}' http://0.0.0.0:8080