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