פתרון בעיות בפונקציות 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.