פתרון בעיות בפונקציות 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:'
הפתרון
מקצים למשתמש את התפקיד 'משתמש בחשבון שירות' (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 Platform. בנוסף, לחשבון השירות של סוכן השירות של 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).
הפתרון
אתם יכולים :
מקצים לפורס את התפקיד בעלי הפרויקט או אדמין של 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
התוכן של תגובת שגיאת 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 של הפונקציה שמוצגת במסוףaudience (aud). 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.
בכל אחד מהמקרים האלה, יכול להיות שהפונקציות של 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.
הפתרון
משתמשים בממשק של ספריית הלקוח כדי לנקות את הערכים ביומן שנשמרו בזיכרון לפני היציאה מהפונקציה, או משתמשים בספרייה כדי לכתוב ערכים ביומן באופן סינכרוני. אפשר גם לכתוב יומנים באופן סינכרוני ישירות אל 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 Service Agent 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 חסרות ההרשאות הנדרשות להקצאת משאבי מחשוב בפרויקט של המחבר, צריך להעניק את ההרשאה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