הגדרת יציאה ישירה מ-VPC לפונקציות מהדור השני
תעבורת נתונים יוצאת ישירה מ-VPC מאפשרת לכם לנתב תעבורה מפונקציות Cloud Run (דור שני) ישירות לרשת ה-VPC.
מגבלות
- יציאה ישירה מ-VPC לא זמינה לפונקציות מהדור הראשון.
- אי אפשר להשתמש בו-זמנית בחיבור ישיר ליציאה מרשת (VPC) ובמחברי חיבור לרשת (VPC) מאפליקציית serverless. פרטים נוספים זמינים במאמר בנושא השוואה בין יציאה ישירה מ-VPC לבין מחברי VPC.
- מידע על מגבלות כלליות בשימוש ב-Direct VPC זמין במאמר Direct VPC עם רשת VPC.
לפני שמתחילים
- מפעילים את Cloud Functions API.
- מתקינים את Google Cloud CLI ומאתחלים אותו באמצעות הפקודה
gcloud init. מעדכנים את הרכיבים של
gcloudלגרסה 558.0.0 ואילך:gcloud components update
אם עדיין אין לכם רשת VPC בפרויקט, צריך ליצור אחת.
אופציונלי: אם הפונקציה שלכם צריכה לגשת לשירותים ול-Google APIs באמצעות כתובות ה-IP הפנימיות שלהם, צריך להפעיל גישה פרטית ל-Google ברשת המשנה שבה אתם משתמשים ליציאה ישירה מ-VPC.
הגדרת הרשאות IAM
כדי לאשר יציאה ישירה מ-VPC, צריך לבקש מהאדמין להקצות את התפקיד 'הפעלת Cloud Run' (roles/run.invoker) לחשבון השירות של הפונקציה.
כדי לוודא של-Cloud Run יש גישה לרשת ה-VPC, אפשר להשתמש באחת מהשיטות הבאות:
התפקיד Cloud Run Service Agent: כברירת מחדל, לסוכן השירות של Cloud Run מוקצה התפקיד Cloud Run Service Agent (
roles/run.serviceAgent) שמכיל את ההרשאות הנדרשות.הרשאות בהתאמה אישית: כדי לקבל שליטה מפורטת יותר, צריך לתת לסוכן השירות של Cloud Run את ההרשאות הנוספות הבאות בפרויקט:
compute.networks.getcompute.subnetworks.get-
compute.subnetworks.useבפרויקט או ברשת המשנה הספציפית compute.addresses.getcompute.addresses.list-
compute.addresses.create(נדרש רק עבור רשתות משנה עם מחסנית כפולה ו-IPv6 חיצוני) -
compute.addresses.delete(נדרש רק לרשתות משנה עם מחסנית כפולה ו-IPv6 חיצוני) compute.addresses.createInternalcompute.addresses.deleteInternalcompute.regionOperations.get
התפקיד Compute Network User: אם לא משתמשים בתפקיד ברירת המחדל של סוכן השירות של Cloud Run או בהרשאות בהתאמה אישית, צריך להעניק את התפקיד Compute Network User (
roles/compute.networkUser) בחשבון השירות של סוכן השירות של Cloud Run. ברשתות משנה עם IPv6 חיצוני נדרש גם התפקיד 'אדמין של כתובות IP ציבוריות ב-Compute' (roles/compute.publicIpAdmin).לדוגמה, כדי להעניק את התפקיד Compute Network User, מריצים את הפקודה הבאה:
gcloud projects add-iam-policy-binding PROJECT_ID \ --member "serviceAccount:service-PROJECT_NUMBER@serverless-robot-prod.iam.gserviceaccount.com" \ --role "roles/compute.networkUser"
מחליפים את מה שכתוב בשדות הבאים:
- PROJECT_ID: מזהה הפרויקט.
- PROJECT_NUMBER: מספר הפרויקט שבו אתם פורסים את פונקציית Cloud Run.
הגדרת תעבורת נתונים יוצאת (egress) ישירה מ-VPC
מגדירים תעבורת נתונים יוצאת ישירה מ-VPC לפונקציות חדשות או קיימות מהדור השני.
gcloud
כדי להגדיר תעבורת נתונים יוצאת ישירה מ-VPC כשפורסים פונקציה, משתמשים בפקודה
gcloud functions deployעם דגלים להגדרות הרשת.gcloud functions deploy FUNCTION_NAME \ --source . \ --runtime RUNTIME \ --trigger-http \ --region REGION \ --network=NETWORK \ --subnet=SUBNET \ --network-tags=NETWORK_TAG_NAMES \ --direct-vpc-egress=EGRESS_SETTINGמחליפים את מה שכתוב בשדות הבאים:
- FUNCTION_NAME: השם של הפונקציה.
- RUNTIME: סביבת זמן הריצה של הפונקציה, לדוגמה,
nodejs20. - REGION: האזור שבו פורסים את הפונקציה.
- אופציונלי: NETWORK עם השם של רשת ה-VPC. מציינים רשת VPC או רשת משנה, או את שניהם. אם מציינים רק רשת, רשת המשנה מקבלת את אותו שם כמו הרשת.
- אופציונלי: SUBNET עם השם של רשת המשנה. צריך לציין רשת VPC או רשת משנה, או את שתיהן. אם מציינים רק רשת, רשת המשנה מקבלת את אותו שם כמו הרשת. אפשר לפרוס או להפעיל כמה פונקציות באותה רשת משנה.
- אופציונלי: NETWORK_TAG_NAMES עם השמות המופרדים בפסיקים של תגי הרשת שרוצים לשייך לפונקציה. לכל פונקציה יכולים להיות תגים שונים של רשתות, כמו
network-tag-2. - EGRESS_SETTING עם ערך של הגדרת יציאה:
-
all: ברירת מחדל. שליחת כל התעבורה היוצאת דרך רשת ה-VPC. -
private-ranges-only: שולח תנועה רק לכתובות פנימיות דרך רשת ה-VPC.
-
אופציונלי: כדי להסיר את כל הגדרות תעבורת הנתונים היוצאת (egress) של Direct VPC מפונקציה, צריך לפרוס מחדש את הפונקציה עם הדגלים
--clear-networkו---clear-network-tags.
Terraform
כדי ללמוד איך להחיל הגדרות ב-Terraform או להסיר אותן, ראו פקודות בסיסיות ב-Terraform.
התכונה הזו (תמיכה בשימוש ביציאה ישירה מ-VPC עם פונקציות Cloud Run מהדור השני) מוסיפה את השדות direct_vpc_network_interface.network ו-direct_vpc_egress.
כדי להשתמש בתכונה הזו, צריך לפעול לפי ההנחיות הבאות:
- חובה להשתמש ב-Terraform בגרסה 7.21.0 ואילך.
- אם מבצעים פריסה מחדש של פונקציה עם Direct VPC קיים, עכשיו צריך להגדיר את הערכים באופן מפורש בתצורה.
אפשר להשתמש בדוגמה של יציאה ישירה מ-VPC של פונקציות Cloud Run (דור שני) כנקודת התחלה ולעדכן את השדות הבאים:
-
service_config.direct_vpc_network_interface.network: השם של רשת ה-VPC. -
service_config.direct_vpc_network_interface.subnetwork: השם של רשת המשנה של ה-VPC. -
service_config.direct_vpc_egress: תנועת הנתונים שרוצים לשלוח לרשת ה-VPC. VPC_EGRESS_ALL_TRAFFICשולח את כל תעבורת הנתונים היוצאת דרך רשת ה-VPC. VPC_EGRESS_PRIVATE_RANGES_ONLYשולח תנועה רק לטווחי כתובות IP פרטיות לרשת ה-VPC.
דוגמה: התקשרות לשירות פנימי מפונקציה
בדוגמה הזו מוסבר איך ליצור שירות פנימי של Cloud Run ואז להפעיל אותו מפונקציית Cloud Run (דור שני) שמשתמשת ביציאה ישירה מ-VPC.
יצירת שירות פנימי לקצה העורפי
יוצרים ספרייה חדשה לשירות לקצה העורפי ועוברים אליה:
mkdir backend-service cd backend-serviceיוצרים קובץ
package.jsonעם התוכן הבא:{ "name": "backend-service", "version": "1.0.0", "description": "", "scripts": { "start": "node index.js" }, "dependencies": { "express": "^4.18.1" } }יוצרים קובץ
index.jsעם התוכן הבא:const express = require('express'); const app = express(); app.get('/', (req, res) => { res.send("hello world"); }); const port = parseInt(process.env.PORT) || 8080; app.listen(port, () => { console.log(`helloworld: listening on port ${port}`); });פורסים את השירות ב-Cloud Run עם תעבורת נתונים נכנסת פנימית:
gcloud run deploy backend \ --source . \ --no-allow-unauthenticated \ --region=REGION \ --ingress internalמחליפים את
REGIONבאזור שלכם, לדוגמה,us-west1.שומרים את כתובת ה-URL של השירות החדש. תצטרכו אותו בקטע הבא.
יצירה ופריסה של הפונקציה
יוצרים ספרייה חדשה לפונקציה ועוברים אליה:
cd .. mkdir dvpc-function cd dvpc-functionיוצרים קובץ
package.jsonעם התוכן הבא:{ "name": "sample-http", "version": "0.0.1", "dependencies": { "axios": "0.21.1", "@google-cloud/functions-framework": "^3.0.0" } }יוצרים קובץ
index.jsעם התוכן הבא. הקוד הזה שולח בקשה מאומתת לשירות הקצה העורפי הפנימי.const axios = require('axios'); const functions = require('@google-cloud/functions-framework'); const callVPCService = async (req, res) => { const backendUrl = process.env.BACKEND_URL; if (!backendUrl) { console.error('BACKEND_URL environment variable not set.'); res.status(500).send('BACKEND_URL not configured.'); return; } try { const metadataServerURL = 'http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/identity?audience='; const tokenUrl = metadataServerURL + backendUrl; const tokenResponse = await axios.get(tokenUrl, { headers: { 'Metadata-Flavor': 'Google', }, }); const token = tokenResponse.data; const response = await axios.get(backendUrl, { headers: { Authorization: `bearer ${token}`, }, }); res.status(200).send(`Response from backend: ${response.data}`); } catch (error) { console.error(`Error calling backend service: ${error.message}`); res.status(500).send(`Error calling backend: ${error.message}`); } }; functions.http('callVPCService', callVPCService);פורסים את הפונקציה עם תעבורת נתונים יוצאת (egress) ישירה מ-VPC שמוגדרת לניתוב כל התעבורה לרשת ה-VPC שמוגדרת כברירת מחדל:
gcloud functions deploy my-2ndgen-function \ --source . \ --runtime nodejs20 \ --trigger-http \ --entry-point callVPCService \ --network=default \ --subnet=default \ --direct-vpc-egress=all \ --region=REGION \ --allow-unauthenticated \ --set-env-vars BACKEND_URL=BACKEND_URLמחליפים את מה שכתוב בשדות הבאים:
-
REGION: האזור שבו פרסתם את שירות לקצה העורפי. BACKEND_URL: כתובת ה-URL של שירות לקצה העורפי שיצרתם.
-
אחרי שפורסים את הפונקציה, מפעילים אותה על ידי כניסה לכתובת ה-URL שלה. הפונקציה קוראת לשירות הפנימי לקצה העורפי ומחזירה את התגובה שלו.
המאמרים הבאים
- מידע נוסף על תעבורת נתונים יוצאת ישירה מ-VPC ועל הקצאת כתובות IP
- מידע על הגדרת רשת משנה עם פרוטוקול כפול
- טיפים לפתרון בעיות
- השוואה בין שיטות יציאה מופיעה במאמר חיבור לרשת VPC.
- אפשר לעיין בחומרי העזר של הפקודה
gcloud functions deploy.