Use Cases

Claude Code × GCP Cloud Functions संपूर्ण गाइड | सर्वरलेस फंक्शन तेज़ी से विकसित करें

Claude Code से GCP Cloud Functions को ऑप्टिमाइज़ करें। HTTP/Pub/Sub/Firestore ट्रिगर, लोकल टेस्टिंग और डिप्लॉयमेंट ऑटोमेशन — Masa के व्यावहारिक अनुभव से रियल कोड उदाहरणों के साथ।

Cloud Run बहुत जटिल था — इसलिए मैंने Cloud Functions चुना

मैं Masa हूं, claudecode-lab.com का डेवलपर।

जब मैंने GCP Serverless का उपयोग शुरू किया, तो मैंने Cloud Run पर विचार किया। लचीला और कंटेनर-आधारित — लेकिन “सिर्फ एक Webhook प्राप्त करने” या “रात में एक बार batch चलाने” जैसे कामों के लिए यह स्पष्ट रूप से अत्यधिक जटिल था। इसलिए मैंने Cloud Functions Gen2 को अपनाया।

Claude Code के साथ, मेरे 90% से अधिक Cloud Functions कोड स्वचालित रूप से जनरेट होते हैं।


चरण 1: HTTP ट्रिगर फंक्शन

import { http, HttpFunction } from "@google-cloud/functions-framework";
import { Request, Response } from "express";
import { Firestore } from "@google-cloud/firestore";

const db = new Firestore();
const VALID_TOKEN = process.env.API_SECRET_TOKEN;

interface ActionRequest {
  userId: string;
  action: string;
}

const handleAction: HttpFunction = async (req: Request, res: Response) => {
  // CORS हेडर सेट करें
  res.set("Access-Control-Allow-Origin", "*");
  if (req.method === "OPTIONS") {
    res.set("Access-Control-Allow-Methods", "POST");
    res.set("Access-Control-Allow-Headers", "Authorization, Content-Type");
    res.status(204).send("");
    return;
  }

  // केवल POST की अनुमति दें
  if (req.method !== "POST") {
    res.status(405).json({ success: false, message: "Method Not Allowed" });
    return;
  }

  // Bearer टोकन सत्यापित करें
  const authHeader = req.headers.authorization ?? "";
  if (!authHeader.startsWith("Bearer ") || authHeader.slice(7) !== VALID_TOKEN) {
    res.status(401).json({ success: false, message: "अनधिकृत" });
    return;
  }

  const body = req.body as Partial<ActionRequest>;
  if (!body.userId || !body.action) {
    res.status(400).json({ success: false, message: "userId और action आवश्यक हैं" });
    return;
  }

  try {
    const logRef = await db.collection("action_logs").add({
      userId: body.userId,
      action: body.action,
      timestamp: new Date(),
      ip: req.ip,
    });
    res.status(200).json({ success: true, message: "एक्शन लॉग हुआ", logId: logRef.id });
  } catch (err) {
    console.error("Firestore लिखने में त्रुटि:", err);
    res.status(500).json({ success: false, message: "आंतरिक सर्वर त्रुटि" });
  }
};

http("handleAction", handleAction);

चरण 2: Pub/Sub ट्रिगर फंक्शन

import { cloudEvent, CloudEvent } from "@google-cloud/functions-framework";
import { MessagePublishedData } from "@google/events/cloud/pubsub/v1/MessagePublishedData";
import { Storage } from "@google-cloud/storage";

const storage = new Storage();

interface ImageUploadedMessage {
  bucketName: string;
  filePath: string;
}

cloudEvent<MessagePublishedData>("handleImageUploaded", async (event: CloudEvent<MessagePublishedData>) => {
  const base64Data = event.data?.message?.data;
  if (!base64Data) {
    console.warn("कोई संदेश डेटा नहीं मिला, छोड़ रहा है");
    return;
  }

  const rawJson = Buffer.from(base64Data, "base64").toString("utf-8");
  let payload: ImageUploadedMessage;
  try {
    payload = JSON.parse(rawJson) as ImageUploadedMessage;
  } catch {
    console.error("Pub/Sub संदेश में अमान्य JSON:", rawJson);
    return;
  }

  const { bucketName, filePath } = payload;
  try {
    const [metadata] = await storage.bucket(bucketName).file(filePath).getMetadata();
    console.log("फ़ाइल मेटाडेटा:", { नाम: metadata.name, आकार: metadata.size });
  } catch (err) {
    // एक्सेप्शन थ्रो करने पर Pub/Sub संदेश को दोबारा कोशिश करेगा
    console.error(`${filePath} की प्रोसेसिंग विफल:`, err);
    throw err;
  }
});

चरण 3: लोकल टेस्टिंग और डिप्लॉयमेंट

# लोकल स्टार्ट
npm run build
npx @google-cloud/functions-framework --target=handleAction --port=8080

# टेस्ट रिक्वेस्ट भेजें
curl -X POST http://localhost:8080 \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer test-token" \
  -d '{"userId": "user-123", "action": "login"}'

# GCP पर डिप्लॉय करें
gcloud functions deploy handleAction \
  --gen2 \
  --runtime=nodejs22 \
  --region=asia-south1 \
  --source=. \
  --entry-point=handleAction \
  --trigger-http \
  --allow-unauthenticated \
  --memory=512Mi \
  --timeout=60s \
  --set-secrets="API_SECRET_TOKEN=api-secret-token:latest"

4 सामान्य समस्याएं

समस्याकारणसमाधान
Cold Start लेटेंसीनिष्क्रिय इंस्टेंस से 2–5 सेकंड की देरीमहत्वपूर्ण फंक्शन के लिए --min-instances=1
Timeout सीमाअधिकतम 9 मिनट (540 सेकंड)Pub/Sub से बड़े कामों को विभाजित करें
Secret Manager अनुमतिरनटाइम पर Permission deniedsecretmanager.secretAccessor रोल दें
मेमोरी की कमीभारी प्रोसेसिंग में OOM--memory=2Gi --cpu=2 सेट करें

सारांश

ट्रिगरउपयोग का मामलामुख्य बात
HTTPWebhook, API एंडपॉइंटAuthentication, CORS
Pub/Subअसंक्रमिक इवेंट प्रोसेसिंगbase64 डिकोड, retry डिज़ाइन
Firestoreडेटा बदलाव पर प्रतिक्रियाअनंत लूप से बचें
Cloud Schedulerनिर्धारित batch जॉबOIDC सत्यापन, टाइमज़ोन

संबंधित लेख

#claude-code #gcp #cloud-functions #typescript #serverless #pubsub
मुफ़्त

मुफ़्त PDF: 5 मिनट में Claude Code चीटशीट

बस अपना ईमेल दर्ज करें और हम तुरंत A4 एक-पृष्ठ चीटशीट PDF भेज देंगे।

हम आपकी व्यक्तिगत जानकारी की सुरक्षा करते हैं और स्पैम नहीं भेजते।

अपने Claude Code वर्कफ़्लो को अगले स्तर पर ले जाएँ

Claude Code में तुरंत कॉपी-पेस्ट करने योग्य 50 आज़माए हुए प्रॉम्प्ट टेम्पलेट।

Masa

लेखक के बारे में

Masa

Claude Code का गहराई से उपयोग करने वाले इंजीनियर। claudecode-lab.com चलाते हैं, जो 10 भाषाओं में 2,000 से अधिक पेजों वाला टेक मीडिया है।