פתרון בעיות בפונקציות Cloud Run
במסמך הזה מוסבר איך לפתור בעיות שקשורות לפונקציות Cloud Run באמצעות פתרון בעיות בהודעות שגיאה. אם יצרתם או פרסתם פונקציה באמצעות Cloud Run, כדאי לעיין במאמר פתרון בעיות ב-Cloud Run.
פריסה
בקטע הזה מפורטות בעיות שאתם עלולים להיתקל בהן במהלך הפריסה, ומוצעות דרכים לפתרון כל אחת מהן. רבות מהבעיות שאתם עלולים להיתקל בהן במהלך הפריסה קשורות לתפקידים ולהרשאות או להגדרה שגויה.
משתמשים בניהול זהויות והרשאות גישה כדי לתת זהויות הרשאה לבצע פעולות ניהול בפונקציות שנוצרו באמצעות Cloud Functions v2 API – לדוגמה, באמצעות gcloud functions, API בארכיטקטורת REST או Terraform. פעולות ניהול כוללות יצירה, עדכון ומחיקה של פונקציות. מידע נוסף מופיע במאמר איך מאשרים גישה באמצעות IAM.
למשתמש חסרות הרשאות בחשבון השירות של זמן הריצה במהלך פריסת פונקציה
כל פונקציה משויכת לחשבון שירות שמשמש כזהות שלה כשהיא ניגשת למשאבים אחרים. חשבון השירות בזמן הריצה יכול להיות חשבון השירות שמוגדר כברירת מחדל או חשבון שירות בניהול המשתמשים. בסביבות שבהן כמה פונקציות ניגשות למשאבים שונים, נהוג להשתמש בזהויות לכל פונקציה עם חשבונות שירות בעלי שם בזמן הריצה, במקום בחשבון השירות שמוגדר כברירת מחדל בזמן הריצה (PROJECT_NUMBER-compute@developer.gserviceaccount.com).
כדי להשתמש בחשבון שירות בזמן ריצה, למשתמש שפורס את האפליקציה צריכה להיות ההרשאה iam.serviceAccounts.actAs בחשבון השירות הזה. משתמש שיוצר חשבון שירות של זמן ריצה שאינו ברירת המחדל מקבל את ההרשאה הזו באופן אוטומטי, אבל משתמשים אחרים שפורסים צריכים לקבל את ההרשאה הזו ממשתמש.
מקצים את ההרשאה iam.serviceAccounts.actAs בחשבון השירות של זמן הריצה למשתמש עם התפקיד 'צפייה בפרויקט', 'מפתח Cloud Functions' או 'אדמין Cloud Functions'.
הודעת השגיאה
המסוף
You must have the iam.serviceAccounts.actAs permission on the selected service account. To obtain this permission, you can grant a role that includes it like the Service Account User role, on the project.
gcloud
חשבון השירות שמוגדר כברירת מחדל:
ERROR: (gcloud.functions.deploy) ResponseError: status=[403], code=[Ok], message=[Caller is missing permission 'iam.serviceaccounts.actAs' on service account projects/-/serviceAccounts/PROJECT_NUMBER-compute@developer.gserviceaccount.com.Grant the role 'roles/iam.serviceAccountUser' to the caller on the service account projects/-/serviceAccounts/PROJECT_NUMBER-compute@developer.gserviceaccount.com.You can do that by running 'gcloud iam service-accounts add-iam-policy-binding projects/-/serviceAccounts/PROJECT_NUMBER-compute@developer.gserviceaccount.com --member MEMBER --role roles/iam.serviceAccountUser'where MEMBER has a prefix like 'user:' or 'serviceAccount:'
חשבון שירות שלא מוגדר כברירת מחדל:
ERROR: (gcloud.functions.deploy) ResponseError: status=[403], code=[Ok], message=[Caller is missing permission 'iam.serviceaccounts.actAs' on service account projects/-/serviceAccounts/
SERVICE_ACCOUNT_NAME@PROJECT_ID
.iam.gserviceaccount.com.Grant the role 'roles/iam.serviceAccountUser' to the caller on the service account projects/-/serviceAccounts/
SERVICE_ACCOUNT_NAME@PROJECT_ID
.iam.gserviceaccount.com.You can do that by running 'gcloud iam service-accounts add-iam-policy-binding projects/-/serviceAccounts/
SERVICE_ACCOUNT_NAME@PROJECT_ID
.iam.gserviceaccount.com --member MEMBER --role roles/iam.serviceAccountUser'where MEMBER has a prefix like 'user:' or 'serviceAccount:'
הפתרון
מקצים למשתמש את התפקיד Service Account User (roles/iam.serviceAccountUser) בחשבון השירות של זמן הריצה שמוגדר כברירת מחדל או בחשבון שירות אחר. התפקיד הזה כולל את ההרשאה iam.serviceAccounts.actAs.
חסרות הרשאות Pub/Sub לחשבון השירות של הפריסה כשפורסים פונקציה מבוססת-אירועים
שירות Cloud Functions משתמש בחשבון השירות של סוכן השירות של Cloud Functions (service-PROJECT_NUMBER@gcf-admin-robot.iam.gserviceaccount.com) כשמבצעים פעולות ניהול. כברירת מחדל, לתפקיד הזה מוקצה התפקיד cloudfunctions.serviceAgent של Cloud Functions. כדי לפרוס פונקציות מבוססות-אירועים, שירות Cloud Functions צריך גישה ל-Pub/Sub כדי להגדיר נושאים ומינויים. אם משנים את התפקיד שמוקצה לחשבון השירות בלי לתת את ההרשאות המתאימות, שירות Cloud Functions לא יכול לגשת ל-Pub/Sub והפריסה נכשלת.
הודעת השגיאה
המסוף
Validation failed for trigger projects/PROJECT_ID/locations/LOCATION/triggers/FUNCTION_NAME-EVENTARC_ID: Permission "iam.serviceAccounts.ActAs" denied on "EndUserCredentials to PROJECT_NUMBER-compute@developer.gserviceaccount.com"
gcloud
ERROR: (gcloud.functions.deploy) ResponseError: status=[403], code=[Ok], message=[Validation failed for trigger projects/test-project-356312/locations/LOCATION/triggers/FUNCTION_NAME-EVENTARC_ID: Permission "iam.serviceAccounts.ActAs" denied on "EndUserCredentials to PROJECT_NUMBER-compute@developer.gserviceaccount.com"]
הפתרון
אפשר לאפס את חשבון השירות לתפקיד ברירת המחדל cloudfunctions.serviceAgent.
חשבון השירות שמוגדר כברירת מחדל בזמן הריצה לא קיים
אם לא מציינים חשבון שירות של זמן ריצה בניהול המשתמש, Cloud Functions משתמש בחשבון השירות שמוגדר כברירת מחדל לחישוב כחשבון השירות של זמן הריצה. פריסות נכשלות אם מוחקים את חשבון ברירת המחדל בלי לציין חשבון בניהול משתמש.
הודעת השגיאה
gcloud
ERROR: (gcloud.functions.deploy) ResponseError: status=[404], code=[Ok], message=[Service account projects/-/serviceAccounts/PROJECT_NUMBER-compute@developer.gserviceaccount.com was not found.]
הפתרון
כדי לפתור את הבעיה, אפשר לנסות את הפתרונות הבאים:
לפני שמפעילים את הפונקציה, צריך לציין חשבון שירות של זמן ריצה שמנוהל על ידי משתמש.
ביטול מחיקה של חשבון השירות לפי המזהה המספרי של חשבון השירות שמוגדר כברירת מחדל.
במהלך פריסת פונקציה, לחשבון השירות של סוכן השירות של Cloud Functions חסרות הרשאות לקטגוריית פרויקט
אפשר להפעיל פונקציות Cloud Run רק באמצעות אירועים מקטגוריות Cloud Storage באותו פרויקט של פלטפורמת Google Cloud . בנוסף, לחשבון השירות של סוכן השירות של Cloud Functions (service-PROJECT_NUMBER@gcf-admin-robot.iam.gserviceaccount.com) צריך להיות תפקיד cloudfunctions.serviceAgent בפרויקט.
הודעת השגיאה
המסוף
ERROR: (gcloud.functions.deploy) ResponseError: status=[403], code=[Ok], message=[Validation failed for trigger projects/PROJECT_ID/locations/LOCATION/triggers/FUNCTION_NAME-EVENTARC_ID: Permission "iam.serviceAccounts.ActAs" denied on "EndUserCredentials to PROJECT_NUMBER-compute@developer.gserviceaccount.com"]
gcloud
ERROR: (gcloud.functions.deploy) ResponseError: status=[403], code=[Ok], message=[Validation failed for trigger projects/<project-id>/locations/LOCATION/triggers/FUNCTION_NAME-EVENTARC_ID: Permission "iam.serviceAccounts.ActAs" denied on "EndUserCredentials to PROJECT_NUMBER-compute@developer.gserviceaccount.com"]
הפתרון
כדי לפתור את הבעיה, צריך לאפס את חשבון השירות הזה לתפקיד ברירת המחדל.
משתמש עם הרשאת עריכה בפרויקט לא יכול להגדיר פונקציה כציבורית
לתפקיד 'עורך פרויקט' יש הרשאות רחבות לניהול משאבים בפרויקט, אבל הוא לא מעניק באופן מובנה את היכולת להפוך את Cloud Functions לציבורי. המשתמש או השירות שמבצעים את הפריסה של הפונקציה צריכים את ההרשאה run.services.setIamPolicy.
הודעת השגיאה
gcloud
ERROR: (gcloud.run.services.add-iam-policy-binding) PERMISSION_DENIED: Permission 'run.services.setIamPolicy' denied on resource 'projects/PROJECT_ID/locations/LOCATION/functions/FUNCTION_NAME' (or resource may not exist).
הפתרון
אתם יכולים :
מקצים לפורס את התפקיד Project Owner או אדמין של Cloud Functions.
אפשר להעניק את ההרשאה באופן ידני על ידי יצירת תפקיד בהתאמה אישית.
בודקים אם הגבלת השיתוף בדומיין נאכפת בפרויקט.
פריסת פונקציה נכשלת כשמשתמשים במדיניות ארגונית של הגבלת מיקום משאבים
אם בארגון שלכם מוגדרת מדיניות של מגבלות על מיקומי המשאבים, אי אפשר לפרוס פונקציות באזורים שמוגבלים על ידי המדיניות. במסוף Google Cloud , האזור המוגבל לא יהיה זמין בתפריט הנפתח של האזור במהלך פריסת פונקציה.
הודעת השגיאה
gcloud
ResponseError: status=[400], code=[Ok], message=["LOCATION" violates constraint "constraints/gcp.resourceLocations" on the resource "projects/PROJECT_ID/locations/LOCATION/functions/FUNCTION_NAME".]
הפתרון
כדי שהפריסה תצליח, אפשר להוסיף או להסיר מיקומים מהרשימות allowed_values או denied_values של אילוץ מיקומי משאבים.
פריסת הפונקציה נכשלת במהלך ביצוע ההיקף הגלובלי של הפונקציה
השגיאה הזו מציינת שהייתה בעיה בקוד. תהליך הפריסה סיים את פריסת הפונקציה, אבל נכשל בשלב האחרון – שליחת בדיקת תקינות לפונקציה. בדיקת התקינות הזו נועדה להפעיל היקף גלובלי של פונקציה, שיכול להיות שמוחזר ממנה חריג, שהיא קורסת או שהיא מגיעה לזמן קצוב לתפוגה. ההיקף הגלובלי הוא המקום שבו בדרך כלל טוענים ספריות ומפעילים לקוחות.
הודעת השגיאה
ביומנים של Cloud Logging:
Could not create or update Cloud Run service FUNCTION_NAME, Container Healthcheck failed. Revision REVISION_NAMEE is not ready and cannot serve traffic. The user-provided container failed to start and listen on the port defined provided by the PORT=8080 environment variable. Logs for this revision might contain more information.
הפתרון
כדי לפתור את הבעיה, אפשר לנסות את הפתרונות הבאים:
כדי לראות הודעת שגיאה מפורטת יותר, אפשר לעיין ביומני הבנייה של הפונקציה.
אם לא ברור למה הפונקציה לא הצליחה להפעיל את ההיקף הגלובלי שלה, כדאי להעביר את הקוד באופן זמני להפעלת הבקשה, באמצעות אתחול עצל של המשתנים הגלובליים. כך תוכלו להוסיף הצהרות יומן נוספות לספריות הלקוח, שיכול להיות שהן יפסיקו לפעול בגלל חוסר תגובה בזמן ההפעלה שלהן (במיוחד אם הן קוראות לשירותים אחרים), יקרסו או יגרמו לחריגות.
בנוסף, כדאי לנסות להגדיל את הזמן הקצוב לתפוגה של הפונקציה. הגדלת מגבלות הזמן הקצוב לתפוגה בפונקציות של Cloud Run מאפשרת יותר זמן לאתחול, ומציעה הקצאת משאבים יותר ניתנת להרחבה בסביבת Cloud Run. כך אפשר לצמצם את הבעיה הזו אם היא נגרמת כתוצאה ממיצוי משאבים.
קוד המקור צריך להכיל פונקציית נקודת כניסה שהוגדרה בצורה נכונה בפריסה, דרך המסוף או gcloud.
משתמש עם הרשאת צפייה לא יכול לפרוס פונקציה
למשתמשים עם התפקיד Project Viewer או Cloud Functions Viewer יש גישת קריאה בלבד לפונקציות ולפרטי הפונקציות, והם לא יכולים לפרוס פונקציות חדשות. התכונה Create function מושבתת במסוףGoogle Cloud עם השגיאה הבאה:
הודעת השגיאה
gcloud
ERROR: (gcloud.functions.deploy) ResponseError: status=[403], code=[Ok], message=[Permission 'cloudfunctions.functions.generateUploadUrl' denied on 'projects/PROJECT_ID/locations/LOCATION/functions']
הפתרון
מקצים למשתמש את התפקיד Cloud Functions Developer.
חסרות הרשאות לחשבון השירות של Build
הודעת השגיאה
יכול להיות שתופיע אחת מהשגיאות הבאות בשגיאה של פריסת הפונקציה או ביומני הבנייה:
The service account running this build does not have permission to write logs. To fix this, grant the Logs Writer (roles/logging.logWriter) role to the service account.
Step #0 - "fetch": failed to Fetch: failed to download archive gs://gcf-v2-sources-PROJECT_NUMBER-LOCATION/FUNCTION_NAME/version-VERSION_NUMBER/function-source.zip: Access to bucket gcf-v2-sources-PROJECT_NUMBER-LOCATION denied. You must grant Storage Object Viewer permission to PROJECT_NUMBER-compute@developer.gserviceaccount.com.
Step #2 - "build": ERROR: failed to create image cache: accessing cache image "LOCATION-docker.pkg.dev/PROJECT/gcf-artifacts/FUNCTION_NAME/cache:latest": connect to repo store "LOCATION-docker.pkg.dev/PROJECT/gcf-artifacts/FUNCTION_NAME/cache:latest": GET https://LOCATION-docker.pkg.dev/v2/token?scope=repository%3APROJECT%2Fgcf-artifacts%2FFUNCTION_NAME%2Fcache%3Apull&service=: DENIED: Permission "artifactregistry.repositories.downloadArtifacts" denied on resource "projects/PROJECT/locations/LOCATION/repositories/gcf-artifacts" (or it may not exist)
Could not build the function due to a missing permission on the build service account. If you didn't revoke that permission explicitly, this could be caused by a change in the organization policies.
הפתרון
לחשבון השירות של ה-build צריכה להיות הרשאת קריאה מקטגוריית המקור והרשאות קריאה וכתיבה במאגר של Artifact Deployment. יכול להיות שתיתקלו בשגיאה הזו בגלל שינוי בהתנהגות ברירת המחדל של השימוש בחשבונות שירות ב-Cloud Build, שמפורט במאמר בנושא שינוי בחשבונות השירות שמשמשים כברירת מחדל ב-Cloud Build.
כדי לפתור את הבעיה, אפשר לנסות אחד מהפתרונות הבאים:
- יוצרים חשבון שירות בהתאמה אישית לבנייה לפריסות של פונקציות.
- מוסיפים את התפקיד של חשבון השירות ב-Cloud Build (
roles/cloudbuild.builds.builder) לחשבון השירות שמוגדר כברירת מחדל ב-Compute. - כדאי לעיין בהנחיות של Cloud Build בנושא שינויים בחשבון השירות שמוגדר כברירת מחדל ולבטל את ההסכמה לשינויים האלה.
השבתה של חשבון שירות לבנייה
הודעת השגיאה
Could not build the function due to disabled service account used by Cloud Build. Please make sure that the service account is active.
הפתרון
כדי לפרוס פונקציה, צריך להפעיל את חשבון השירות של שירות ה-Build. יכול להיות שתיתקלו בשגיאה הזו בגלל שינוי בהתנהגות ברירת המחדל של Cloud Build בנוגע לשימוש בחשבונות שירות, שמפורט במאמר בנושא שינוי בחשבונות השירות שמשמשים כברירת מחדל ב-Cloud Build.
כדי לפתור את הבעיה, אפשר לנסות אחד מהפתרונות הבאים:
- יוצרים חשבון שירות בהתאמה אישית לבנייה לפריסות של פונקציות.
- מפעילים את חשבון השירות של Compute שמוגדר כברירת מחדל.
- כדאי לעיין בהנחיות של Cloud Build בנושא שינויים בחשבון השירות שמוגדר כברירת מחדל ולבטל את ההסכמה לשינויים האלה.
השרת ממלא את הבקשה
בקטע הזה מפורטות בעיות בהצגת מודעות שאתם עלולים להיתקל בהן, ומוצעות דרכים לפתרון כל אחת מהן.
שגיאת הרשאה להצגת מודעות בגלל שהפונקציה דורשת אימות
פונקציות HTTP ללא הפעלת האפשרות Allow unauthenticated invocations, מגבילות את הגישה למשתמשי קצה ולחשבונות שירות שאין להם הרשאות מתאימות. הודעת השגיאה הזו מציינת שליישות הקוראת אין הרשאה להפעיל את הפונקציה.
הודעת השגיאה
קוד תגובת שגיאת HTTP: 403 Forbidden (403 הגישה אסורה)
התוכן של תגובת שגיאת HTTP:
Error: Forbidden Your client does not have permission
to get URL /FUNCTION_NAME from this server.
הפתרון
כדי לפתור את הבעיה, אפשר לנסות את הפתרונות הבאים:
מקצים למשתמש את התפקיד Cloud Run Invoker Cloud IAM עבור הפונקציה הספציפית.
אם הארגון שלכם תומך בכך, אפשר לפרוס מחדש את הפונקציה כדי לאפשר גישה ציבורית. האפשרות הזו שימושית לבדיקות.
שגיאה בהצגת המודעה בגלל הגדרה של allow internal traffic only
הגדרות Ingress מגבילות את האפשרות להפעיל פונקציית HTTP על ידי משאבים מחוץ לפרויקט Google Cloud או לגבולות גזרה לשירות של VPC Service Controls.
כשמגדירים את האפשרות allow internal traffic only (אפשר תנועה פנימית בלבד) לרשתות תעבורת נתונים נכנסת (ingress), הודעת השגיאה הזו מציינת שמותרות רק בקשות מרשתות VPC באותו פרויקט או ב-perimeter של VPC Service Controls. יכול להיות גם שמדובר בשגיאת 404 בכתובת ה-URL שמוגדרת כברירת מחדל functions.net.
הודעת השגיאה
קוד תגובת שגיאת HTTP: 404 NOT FOUND
הפתרון
כדי לפתור את השגיאה, אפשר לנסות את הפתרונות הבאים:
מוודאים שהבקשה מגיעה מהפרויקט Google Cloud או מגבולות הגזרה לשירות של VPC Service Controls.
משנים את הגדרות הכניסה לallow all traffic (התרת כל התנועה) עבור הפונקציה.
קוד המקור של פונקציות Cloud Run יכול גם להחזיר שגיאת 404 בגלל כתובת URL שגויה של הפונקציה, שיטות HTTP, שגיאות לוגיות וכו'.
להפעלת הפונקציה חסרים פרטי כניסה תקינים לאימות
כדי להפעיל פונקציה של Cloud Run שהוגדרה עם גישה מוגבלת, צריך אסימון מזהה. אסימוני גישה או אסימוני רענון לא עובדים.
הודעת השגיאה
קוד תגובת שגיאת HTTP: 401 Unauthorized
התוכן של תגובת שגיאת HTTP:
Your client does not have permission to the requested URL 'FUNCTION_NAME'
הפתרון
כדי לפתור את השגיאה, אפשר לנסות את אחד מהפתרונות הבאים:
מוודאים שהבקשות כוללות כותרת
Authorization: Bearer ID_TOKEN, ושהאסימון הוא אסימון מזהה ולא אסימון גישה או אסימון רענון. אם יוצרים את האסימון הזה באופן ידני באמצעות מפתח פרטי של חשבון שירות, צריך להחליף את אסימון ה-JWT בחתימה עצמית באסימון זהות בחתימת Google.מפעילים את פונקציית ה-HTTP באמצעות פרטי אימות בכותרת הבקשה. לדוגמה, אפשר לקבל טוקן זהות באמצעות
gcloudבאופן הבא:curl -H "Authorization: Bearer $(gcloud auth print-identity-token)"
https://REGION-PROJECT_ID.cloudfunctions.net/FUNCTION_NAMEאם הארגון שלכם תומך בהפעלות לא מאומתות, צריך לפרוס מחדש את הפונקציה כדי לאפשר אותן. האפשרות הזו שימושית לבדיקות.
חשוב לוודא שהשדה
audience (aud)באסימון האינטרנט מסוג JSON (JWT) זהה בדיוק לכתובת ה-URL של הפונקציה שמוצגת במסוף Google Cloud . כל אי התאמה, כולל נתיב יחסי נוסף, גורמת לכשל באימות ולתשובה 401.
הפונקציה מפסיקה באמצע ההרצה או ממשיכה לפעול אחרי שהקוד מסתיים
חלק מסביבות זמן הריצה של פונקציות Cloud Run מאפשרות למשתמשים להריץ משימות אסינכרוניות. אם הפונקציה יוצרת משימות כאלה, היא צריכה גם להמתין במפורש עד שהמשימות האלה יושלמו. אם לא תעשו זאת, יכול להיות שהפונקציה תפסיק לפעול בזמן הלא נכון.
התנהגות השגיאה
הפונקציה שלכם מציגה אחת מההתנהגויות הבאות:
- הפונקציה מסתיימת בזמן שמשימות אסינכרוניות עדיין פועלות, אבל לפני שחלף פרק הזמן שהוגדר לטיימאאוט.
- הפונקציה לא מפסיקה לפעול כשהמשימות האלה מסתיימות, והיא ממשיכה לפעול עד שתקופת הזמן הקצוב לתפוגה חלפה.
הפתרון
אם הפונקציה מסתיימת מוקדם מהצפוי, צריך לוודא שכל המשימות האסינכרוניות של הפונקציה הושלמו לפני שהפונקציה מבצעת אחת מהפעולות הבאות:
- החזרת ערך
- פתרון או דחייה של אובייקט
Promiseשהוחזר (פונקציות Node.js בלבד) - הקפצת הודעת שגיאה (throw) לחריגים או לשגיאות שלא נתפסו
- שליחת תגובת HTTP
- הפעלת פונקציית קריאה חוזרת
אם הפונקציה לא מסתיימת אחרי השלמת משימות אסינכרוניות, צריך לוודא שהפונקציה מסמנת נכון את פונקציות Cloud Run אחרי שהיא מסתיימת. חשוב במיוחד לבצע אחת מהפעולות שצוינו קודם ברגע שהפונקציה מסיימת את המשימות האסינכרוניות שלה.
שגיאת זמן ריצה כשניגשים למשאבים שמוגנים על ידי VPC Service Controls
כברירת מחדל, פונקציות Cloud Run משתמשות בכתובות IP ציבוריות כדי לשלוח בקשות יוצאות לשירותים אחרים. אם הפונקציות שלכם לא נמצאות בתוך גבולות גזרה של VPC Service Controls, יכול להיות שהן יקבלו תגובות HTTP 403 כשהן ינסו לגשת לשירותים שמוגנים על ידי VPC Service Controls, בגלל דחיות של גבולות גזרה לשירות. Google Cloud
הודעת השגיאה
ביומנים של משאבים שנבדקו, רשומה כמו זו:
"protoPayload": {
"@type": "type.googleapis.com/google.cloud.audit.AuditLog",
"status": {
"code": 7,
"details": [
{
"@type": "type.googleapis.com/google.rpc.PreconditionFailure",
"violations": [
{
"type": "VPC_SERVICE_CONTROLS",
...
"authenticationInfo": {
"principalEmail": "CLOUD_FUNCTION_RUNTIME_SERVICE_ACCOUNT",
...
"metadata": {
"violationReason": "NO_MATCHING_ACCESS_LEVEL",
"securityPolicyInfo": {
"organizationId": "ORGANIZATION_ID",
"servicePerimeterName": "accessPolicies/NUMBER/servicePerimeters/SERVICE_PERIMETER_NAME"
...
הפתרון
כדי לפתור את השגיאה, אפשר לנסות את אחד מהפתרונות הבאים:
הפונקציה צריכה לנתב את כל התנועה היוצאת דרך רשת ה-VPC. מידע נוסף זמין בקטע פריסת פונקציות שתואמות ל-VPC Service Controls.
לחלופין, אפשר לתת לחשבון השירות של סביבת זמן הריצה של הפונקציה גישה לגבולות הגזרה. אפשר לעשות את זה על ידי יצירת רמת גישה והוספת רמת הגישה לגבולות גזרה לשירות, או על ידי יצירת מדיניות תעבורת נתונים נכנסת בגבולות הגזרה. מידע נוסף זמין במאמר שימוש ב-VPC Service Controls.
מדרגיות
בקטע הזה מפורטות בעיות שקשורות למדרגיות, ומוצעות הצעות לפתרון כל אחת מהן.
שגיאות ב-Cloud Logging שקשורות לביטולים של בקשות בתור בהמתנה
כשלים בהרחבת הקיבולת יכולים להתרחש בתרחישים הבאים:
- עלייה פתאומית ומשמעותית בנפח התנועה.
- זמן הפעלה ארוך במצב התחלתי (cold start).
- זמן עיבוד הבקשה ארוך.
- שיעור שגיאות גבוה בפונקציה.
- הגעתם למגבלת המכונות המקסימלית, והמערכת לא יכולה להגדיל את הקיבולת.
- גורמים חולפים שמשויכים לשירות Cloud Run Functions.
בכל אחד מהמקרים האלה, יכול להיות שהפונקציות של Cloud Run לא יתבצעו מספיק מהר כדי לנהל את התנועה.
הודעת השגיאה
The request was aborted because there was no available instance-
severity=WARNING( קוד תגובה: 429 ) אי אפשר לשנות את קנה המידה של פונקציות Cloud Run בגלל המגבלהmax-instancesשהגדרתם במהלך ההגדרה. -
severity=ERROR( קוד תגובה: 500 ) פונקציות Cloud Run לא יכולות לנהל את קצב התנועה.
-
הפתרון
כדי לפתור את הבעיה, צריך לטפל בגורמים שצוינו קודם.
בפונקציות שמבוססות על טריגר HTTP, הלקוח צריך להטמיע נסיגה מעריכית וניסיונות חוזרים לבקשות שאסור להפסיק. אם מפעילים פונקציות Cloud Run מ-Workflows, אפשר להשתמש בתחביר
try/retryכדי לעשות זאת.פונקציות Cloud Run תומכות במסירה של הודעות לפחות פעם אחת עבור פונקציות ברקע או פונקציות מבוססות-אירועים. גם בלי להפעיל במפורש ניסיון חוזר, האירוע מועבר מחדש באופן אוטומטי והפעלת הפונקציה תתבצע מחדש. מידע נוסף זמין במאמר בנושא ניסיון חוזר של פונקציות מבוססות-אירועים.
אם הסיבה הבסיסית לבעיה היא תקופה של שגיאות זמניות מוגברות שמשויכות רק לפונקציות של Cloud Run, או אם אתם צריכים עזרה בפתרון הבעיה, אתם יכולים לפנות לתמיכה.
במקרים של הפעלה במצב התחלתי (cold start), כדאי להגדיר מספר מינימלי של מופעים כדי לצמצם את מספר ההפעלות במצב התחלתי, שיש להן השלכות על החיוב.
רישום ביומן
בקטע הבא מוסבר על בעיות שקשורות לרישום ביומן ואיך לפתור אותן.
רשומות ביומן לא כוללות רמות חומרה או שהן שגויות
פונקציות Cloud Run כוללות רישום ביומן בזמן ריצה כברירת מחדל. יומנים שנכתבים אל
stdout או אל stderr מופיעים אוטומטית ב-Cloud Logging.
אבל כברירת מחדל, רשומות היומן האלה מכילות רק הודעות מחרוזת.
הודעת השגיאה
רמות החומרה ביומנים לא קיימות או שגויות.
הפתרון
כדי לכלול חומרת יומן, צריך לשלוח רשומה מובנית ביומן.
טיפול בחריגות או רישום שלהן ביומן באופן שונה במקרה של קריסה
יכול להיות שתרצו להתאים אישית את האופן שבו אתם מנהלים ומתעדים את פרטי הקריסה.
הפתרון
כדי להתאים אישית את הטיפול בחריגים ואת רישום מעקב המחסנית, עוטפים את הפונקציה בבלוק try.
דוגמה
import logging
import traceback
def try_catch_log(wrapped_func):
def wrapper(*args, **kwargs):
try:
response = wrapped_func(*args, **kwargs)
except Exception:
# Replace new lines with spaces so as to prevent several entries which
# would trigger several errors.
error_message = traceback.format_exc().replace('\n', ' ')
logging.error(error_message)
return 'Error';
return response;
return wrapper;
#Example hello world function
@try_catch_log
def python_hello_world(request):
request_args = request.args
if request_args and 'name' in request_args:
1 + 's'
return 'Hello World!'
היומנים גדולים מדי ב-Node.js 10+, Python 3.8, Go 1.13 ו-Java 11
הגודל המקסימלי של רשומה רגילה ביומן בזמני הריצה האלה הוא 105KiB.
הפתרון
שליחת רשומות ביומן שקטנות מהמגבלה הזו.
יומנים חסרים למרות שפונקציות Cloud Run מחזירות שגיאות
פונקציות Cloud Run מזרימות יומנים של פונקציות Cloud Run לדלי שמוגדר כברירת מחדל. כשיוצרים פרויקט, פונקציות Cloud Run יוצרות ומפעילות את דלי ברירת המחדל. אם דלי ברירת המחדל מושבת או אם היומנים של פונקציות Cloud Run נמצאים במסנן ההחרגה, היומנים לא יופיעו בכלי Logs Explorer.
הפתרון
הפעלת יומנים שמוגדרים כברירת מחדל.
רישומים של פונקציות Cloud Run לא מופיעים בכלי Logs Explorer
חלק מספריות הלקוח של Cloud Logging משתמשות בתהליך אסינכרוני כדי לכתוב רשומות ביומן. אם פונקציה קורסת או מסתיימת מסיבה אחרת, יכול להיות שחלק מיומני הרישום עדיין לא נכתבו, והם עשויים להופיע מאוחר יותר. יכול להיות שחלק מהיומנים יאבדו ולא יופיעו ב-Logs Explorer.
הפתרון
כדי לרוקן מידע (Flush) את רשומות היומן שנשמרו במאגר הנתונים הזמני לפני היציאה מהפונקציה, צריך להשתמש בממשק של ספריית הלקוח, או להשתמש בספרייה כדי לכתוב רשומות ביומן באופן סינכרוני. אפשר גם לכתוב יומנים באופן סינכרוני ישירות אל stdout או אל stderr.
חסרים יומנים של פונקציות Cloud Run כשמשתמשים ביעד של Log Router
היעדים של יומני Log Router מנותבים לרשומות יומן שונות.

מסנני ההחרגה מגדירים רשומות שאפשר להשליך.
הפתרון
הסרת קבוצת מסנני ההחרגה של resource.type = "cloud_run_revision".
חיבורים למסד נתונים
יכולות להיות כמה בעיות כשמתחברים למסד נתונים, ורבות מהן קשורות לחריגה ממגבלות החיבור או לפסק זמן. אם מופיעה אזהרה לגבי Cloud SQL ביומנים, למשל Context deadline exceeded, יכול להיות שתצטרכו לשנות את הגדרות החיבור. מידע נוסף זמין במאמר בנושא שיטות מומלצות לשימוש ב-Cloud SQL.
Networking
בקטע הזה מפורטות בעיות ברשת ומוצעות הצעות לפתרון כל אחת מהן.
קישוריות רשת
אם כל הבקשות היוצאות מפונקציית Cloud Run נכשלות גם אחרי שמגדירים את הגדרות היציאה, אפשר להריץ בדיקות קישוריות כדי לזהות בעיות בסיסיות בקישוריות לרשת. מידע נוסף זמין במאמר בנושא יצירה והרצה של בדיקות קישוריות.
מחבר הגישה ל-VPC מאפליקציית serverless לא מוכן או לא קיים
אם מחבר Serverless VPC Access נכשל, יכול להיות שהוא לא משתמש במסכת רשת משנה /28שמוקדשת למחבר, כפי שנדרש.
הודעת השגיאה
Problem connecting to VPC Connector projects/xxxxx/locations/REGION/connectors/xxxx: Serverless VPC Access is not found.
כשפונקציות Cloud Run נפרסות עם מחבר במצב לא תקין בגלל הרשאה חסרה בחשבון השירות סוכן שירות של Google APIs PROJECT_NUMBER@cloudservices.gserviceaccount.com, מתקבלת השגיאה הבאה:
הודעת השגיאה
Failed to prepare VPC connector. Please try again later.
הפתרון
מציגים את רשימת רשתות המשנה כדי לבדוק אם המחבר משתמש במסכת רשת משנה /28. אם המחבר לא משתמש במסכת רשת המשנה /28, צריך ליצור מחדש מחבר או ליצור מחבר חדש.
כדי לפתור את הבעיה, אפשר לנסות את הפתרונות הבאים:
אם יוצרים מחדש את מחבר, לא צריך לפרוס מחדש פונקציות אחרות. יכול להיות שהחיבור לרשת ינותק בזמן שיוצרים מחדש את המחבר.
אם יוצרים מחבר חלופי חדש, צריך לפרוס מחדש את הפונקציות כדי להשתמש במחבר החדש, ואז למחוק את המחבר המקורי. השיטה הזו מאפשרת להימנע מהפרעות ברשת.
מוודאים שפונקציות Cloud Run והמחבר המשויך להן נפרסו באותו אזור.
בהגדרת VPC משותף:
חשוב לוודא שלחשבונות השירות
SERVICE_PROJECT_NUMBER@cloudservices.gserviceaccount.comו-service-SERVICE_PROJECT_NUMBER@gcp-sa-vpcaccess.iam.gserviceaccount.comשמשמשים את VPC Connector להקצאת משאבים בפרויקט יש את ההרשאות הנדרשות. לחשבונות השירות האלה צריך להיות התפקידroles/compute.networkUserבפרויקט המארח של תצורת ה-VPC המשותף, כשהמחבר נמצא בפרויקט השירות.אם המחבר נוצר בפרויקט המארח, מוודאים שהתפקיד
Serverless VPC Access Userהוקצה לסוכן השירות של Cloud Run בפרויקט המארח.
אם סטטוס המחבר הוא
Connector is in a bad state, manual deletion recommendederror וGoogle APIs Service Agent לא קיבל את ההרשאות הנדרשות להקצאת משאבי מחשוב בפרויקט של המחבר, צריך להעניק את ההרשאהroles/compute.adminלחשבון השירותPROJECT_NUMBER@cloudservices.gserviceaccount.com. במקרים מסוימים, יכול להיות שתצטרכו ליצור מחדש את המחבר אחרי הוספת ההרשאות האלה.
תנועת SMTP לכתובות IP חיצוניות של יעד באמצעות יציאת TCP 25 חסומה
כדי לשפר את האבטחה, Google Cloud החיבורים ליעד של יציאת TCP 25
חסומים כששולחים אימיילים מפונקציות.
הפתרון
כדי לבטל את החסימה של החיבורים האלה, אפשר לנסות את הפתרונות הבאים:
מתחברים לשרת ה-SMTP ביציאה אחרת, כמו יציאת TCP
587או465.
שגיאת 404 בכתובת ה-URL של ברירת המחדל functions.net
השבתת כתובת ה-URL run.app ב-Cloud Run מונעת גם גישה לכתובת ה-URL cloudfunctions.net שמוגדרת כברירת מחדל לפונקציות Cloud Run (דור שני). השגיאה הזו יכולה להיגרם גם משגיאת הצגה בגלל הגדרה של אפשרות להצגת מודעות רק לתנועה פנימית.
הודעת השגיאה
קוד תגובת שגיאת HTTP: 404 NOT FOUND
הפתרון
כדי להפעיל מחדש את כתובת ה-URL שמוגדרת כברירת מחדל ל-Cloud Run functions (דור שני), צריך להפעיל מחדש את כתובת ה-URL run.app ב-Cloud Run. לשם כך, מחליפים את הקובץ service.yaml בהגדרה חדשה שבה annotations:run.googleapis.com/default-url-disabled: falsecloudfunctions.net