Разработка Serverless Functions для сайта (Google Cloud Functions)
Google Cloud Functions (2nd gen) — serverless-функции на базе Cloud Run. В отличие от 1st gen, 2nd gen поддерживает до 60 минут выполнения, несколько одновременных запросов на один экземпляр и более широкий выбор рантаймов: Node.js, Python, Go, Java, .NET, Ruby, PHP.
Первое поколение vs второе
2nd gen функции используют Cloud Run под капотом. Это даёт: concurrency до 1000 запросов на экземпляр (vs 1 в 1st gen), поддержку VPC Connector, больший лимит памяти (32 GB), кастомные домены без проксирования.
Пример функции: обработка вебхука
import functions_framework
import json
import hmac
import hashlib
from google.cloud import pubsub_v1
publisher = pubsub_v1.PublisherClient()
TOPIC_PATH = "projects/my-project/topics/webhook-events"
@functions_framework.http
def process_webhook(request):
# Проверка подписи
signature = request.headers.get("X-Signature-256", "")
secret = get_secret("webhook-secret")
expected = "sha256=" + hmac.new(
secret.encode(), request.data, hashlib.sha256
).hexdigest()
if not hmac.compare_digest(signature, expected):
return json.dumps({"error": "Invalid signature"}), 401, {"Content-Type": "application/json"}
event = request.get_json()
# Публикуем в Pub/Sub для асинхронной обработки
publisher.publish(TOPIC_PATH, json.dumps(event).encode("utf-8"))
return json.dumps({"received": True}), 200, {"Content-Type": "application/json"}
Функция на Node.js с TypeScript
import { http, HttpFunction } from "@google-cloud/functions-framework";
import { SecretManagerServiceClient } from "@google-cloud/secret-manager";
const secretClient = new SecretManagerServiceClient();
const contactForm: HttpFunction = async (req, res) => {
res.set("Access-Control-Allow-Origin", "https://your-site.com");
if (req.method === "OPTIONS") {
res.set("Access-Control-Allow-Methods", "POST");
res.set("Access-Control-Allow-Headers", "Content-Type");
res.status(204).send("");
return;
}
if (req.method !== "POST") {
res.status(405).json({ error: "Method not allowed" });
return;
}
const { name, email, message } = req.body;
// Получение API-ключа из Secret Manager
const [version] = await secretClient.accessSecretVersion({
name: "projects/my-project/secrets/sendgrid-api-key/versions/latest"
});
const apiKey = version.payload?.data?.toString();
await sendEmail({ name, email, message, apiKey });
res.json({ ok: true });
};
http("contactForm", contactForm);
Деплой
# Node.js
gcloud functions deploy contact-form \
--gen2 \
--runtime nodejs20 \
--region europe-west1 \
--source . \
--entry-point contactForm \
--trigger-http \
--allow-unauthenticated \
--memory 256MB \
--timeout 30s
# Python
gcloud functions deploy process-webhook \
--gen2 \
--runtime python312 \
--region europe-west1 \
--source . \
--entry-point process_webhook \
--trigger-http \
--memory 512MB
Переменные окружения
gcloud functions deploy my-function \
--set-env-vars DATABASE_URL=postgresql://...,NODE_ENV=production
# Или через Secret Manager (рекомендуется для секретов)
gcloud functions deploy my-function \
--set-secrets 'API_KEY=my-secret:latest'
Функция-подписчик Pub/Sub
@functions_framework.cloud_event
def process_pubsub_message(cloud_event):
import base64
data = base64.b64decode(cloud_event.data["message"]["data"]).decode("utf-8")
event = json.loads(data)
# Обработка события: синхронизация с CRM, отправка уведомления, etc.
handle_event(event)
Запускается автоматически при публикации сообщения в топик Pub/Sub.
Подключение к Cloud SQL
Для PostgreSQL/MySQL используйте Cloud SQL Auth Proxy через Unix socket — не TCP:
import sqlalchemy
def create_engine():
return sqlalchemy.create_engine(
f"postgresql+pg8000://user:pass@/dbname",
creator=lambda: pg8000.connect(
user="user",
password="pass",
database="dbname",
unix_sock="/cloudsql/project:region:instance/.s.PGSQL.5432"
)
)
В Cloud Run (и Cloud Functions 2nd gen) Cloud SQL Auth Proxy запускается как sidecar автоматически при указании --add-cloudsql-instances.
CI/CD через Cloud Build
# cloudbuild.yaml
steps:
- name: node:20
entrypoint: npm
args: [install]
- name: node:20
entrypoint: npm
args: [run, build]
- name: gcr.io/google.com/cloudsdktool/cloud-sdk
args:
- gcloud
- functions
- deploy
- contact-form
- --gen2
- --region=europe-west1
- --source=.
- --runtime=nodejs20
- --entry-point=contactForm
- --trigger-http
Сроки
Базовые функции с деплоем и переменными окружения — 2–3 дня. Pub/Sub интеграция и Cloud SQL — плюс 2 дня.







