ものづくりのブログ

うちのネコを題材にしたものづくりができたらいいなと思っていろいろ奮闘してます。

【Google】Cloud Functions ローカル環境で実行

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