בדף הזה מוסבר איך לפתור בעיות שגיאה שמתקבלות בתגובה לבקשה שנשלחת ל-API.
BAD_GATEWAY
אם מקבלים את קוד השגיאה 13 ואת ההודעה BAD_GATEWAY, המשמעות היא ש-Extensible Service Proxy (ESP) לא יכול להגיע לחלק האחורי של השירות.
כדאי לבדוק את הדברים הבאים:
- מוודאים ששירות הקצה העורפי פועל. הדרך לעשות את זה תלויה ב-backend.
-
בסביבה הגמישה של App Engine, קוד השגיאה של ההודעה
BAD_GATEWAYיכול להיות502. מידע נוסף זמין בקטע שגיאות שספציפיות לסביבה הגמישה של App Engine. - לפרטים נוספים על Compute Engine, אפשר לעיין במאמר בנושא פתרון בעיות ב-Cloud Endpoints ב-Compute Engine.
-
ב-GKE, צריך להשתמש ב-SSH כדי לגשת ל-pod ולהשתמש ב-
curl. פרטים נוספים זמינים במאמר פתרון בעיות בנקודות קצה ב-Google Kubernetes Engine.
-
בסביבה הגמישה של App Engine, קוד השגיאה של ההודעה
- כתובת ה-IP הנכונה של השירות לקצה העורפי מצוינת:
-
ב-GKE, בודקים את ערך הדגל של ESP
--backend(האפשרות הקצרה היא-a) בקובץ המניפסט של הפריסה (לרוב נקראdeployment.yaml). -
ב-Compute Engine, בודקים את ערך הדגל של ESP
--backend(האפשרות הקצרה היא-a) בפקודהdocker run.
-
ב-GKE, בודקים את ערך הדגל של ESP
reset reason: connection failure
אם מקבלים קוד HTTP 503 או קוד gRPC 14 וההודעה upstream connect error or disconnect/reset before headers. reset reason: connection failure, המשמעות היא ש-ESPv2 לא יכול להגיע לקצה העורפי של השירות.
כדי לפתור את הבעיה, צריך לבדוק היטב את הפרטים הבאים.
כתובת קצה עורפי
צריך להגדיר את ESPv2 עם כתובת הבק-אנד הנכונה. בעיות נפוצות:
- הסכימה של כתובת ה-Backend צריכה להתאים לסוג אפליקציית ה-Backend.
ב-OpenAPI, קצה העורפי צריך להיות
http://, וב-gRPC, קצה העורפי צריך להיותgrpc://. - ב-ESPv2 שפריסה ב-Cloud Run, הסכימה של כתובת ה-Backend צריכה להיות
https://אוgrpcs://. הפקודהsאומרת ל-ESPv2 להגדיר TLS עם הקצה העורפי.
חיפוש DNS
כברירת מחדל, ESPv2 מנסה לזהות שמות דומיינים לכתובות IPv6. אם הרזולוציה של IPv6 נכשלת, ESPv2 חוזר לכתובות IPv4.
יכול להיות שבחלק מהרשתות מנגנון החזרה לאחור לא יפעל כמו שצריך.
במקום זאת, אפשר להשתמש בדגל --backend_dns_lookup_family כדי לחייב את ESPv2 להשתמש בכתובות IPv4.
השגיאה הזו נפוצה אם מגדירים Serverless VPC Connector ל-ESPv2 שנפרס ב-Cloud Run. רשתות VPC לא תומכות בתעבורת IPv6.
API is not enabled for the project
אם שלחתם מפתח API בבקשה, הודעת שגיאה כמו "API my-api.endpoints.example-project-12345.cloud.goog is not enabled for the project" מציינת שמפתח ה-API נוצר בפרויקט אחר ב- Google Cloudולא בפרויקט שבו ה-API מופעל. כדי לפתור את הבעיה, אפשר ליצור את מפתח ה-API באותו פרויקט Google Cloud שה-API משויך אליו, או להפעיל את ה-API בפרויקט Google Cloud שבו נוצר מפתח ה-API.
Service control request failed with HTTP response code 403
אם קיבלתם את קוד השגיאה 14 ואת ההודעה Service control request failed
with HTTP response code 403, המשמעות היא ש-Service Control API (servicecontrol.googleapis.com) לא מופעל בפרויקט.
כדי לוודא שכל השירותים שנדרשים ל-Endpoints ול-ESP מופעלים בפרויקט, אפשר לעיין במאמר בנושא בדיקת השירותים הנדרשים.
כדי לוודא שלחשבון השירות שמשויך למופע שבו פועל ESP יש את כל ההרשאות הנדרשות, אפשר לעיין במאמר בנושא בדיקת ההרשאות הנדרשות.
Method doesn't allow unregistered callers
ESP מגיב בשגיאה Method doesn't allow unregistered callers אם ציינתם מפתח API בקטע security במסמך OpenAPI, אבל לבקשה ל-API לא הוקצה מפתח API לפרמטר שאילתה בשם key.
אם אתם צריכים ליצור מפתח API כדי לבצע קריאות ל-API, תוכלו לעיין במאמר בנושא יצירת מפתח API.
Method does not exist
התגובה Method does not exist מציינת שלא נמצאה שיטת HTTP (GET, POST או אחרת) בנתיב כתובת ה-URL שצוין. כדי לפתור בעיות, משווים את הגדרת השירות שפרסתם כדי לוודא ששם השיטה ונתיב כתובת ה-URL שאתם שולחים בבקשה זהים:
נכנסים לדף Endpoints Services במסוף Google Cloud של הפרויקט.
אם יש לכם יותר מ-API אחד, בוחרים את ה-API שאליו שלחתם את הבקשה.
לוחצים על הכרטיסייה היסטוריית הפריסה.
בוחרים את הפריסה האחרונה כדי לראות את הגדרת השירות.
אם השיטה שאתם קוראים לה לא מופיעה בקטע paths של מסמך OpenAPI, אתם יכולים להוסיף את השיטה או את הדגל x-google-allow ברמה העליונה של הקובץ:
x-google-allow: all
הדגל הזה מאפשר לכם להימנע מפירוט כל השיטות שנתמכות בקצה העורפי במסמך OpenAPI. כשמשתמשים ב-all, כל הקריאות – עם או בלי מפתח API או אימות משתמש – עוברות דרך ESP אל ה-API שלכם. מידע נוסף זמין במאמר x-google-allow.
שגיאות שספציפיות לסביבה הגמישה של App Engine
בקטע הזה מתוארות תגובות שגיאה מ-APIs שנפרסו בסביבה הגמישה של App Engine.
קוד שגיאה 502 או 503
יכול להיות שיחלפו כמה דקות עד ש-App Engine יגיב לבקשות בהצלחה.
אם שולחים בקשה ומקבלים בתגובה HTTP 502, 503 או שגיאת שרת אחרת, צריך לחכות דקה ולנסות לשלוח את הבקשה שוב.
הודעת השגיאה BAD_GATEWAY
קוד שגיאה 502 עם BAD_GATEWAY בהודעה מציין בדרך כלל ש-App Engine הפסיק את האפליקציה כי נגמר לה הזיכרון.
ל-VM גמיש של App Engine שמוגדר כברירת מחדל יש רק 1GB של זיכרון, ורק 600MB זמינים למאגר האפליקציות.
כדי לפתור את הבעיה שקוד השגיאה שלה הוא 502:
נכנסים לדף Logging במסוף Google Cloud .
בוחרים את הפרויקט הרלוונטי Google Cloud בחלק העליון של הדף.
בוחרים באפשרות Google App Engine Application ופותחים את
vm.syslog.מחפשים רשומה ביומן שדומה לזו:
kernel: [ 133.706951] Out of memory: Kill process 4490 (java) score 878 or sacrifice child kernel: [ 133.714468] Killed process 4306 (java) total-vm:5332376kB, anon-rss:2712108kB, file-rss:0kBאם מופיעה רשומה של
Out of memoryביומן:כדי להגדיל את הגודל של מכונת ה-VM שמוגדרת כברירת מחדל, מוסיפים את השורות הבאות לקובץ
app.yaml:resources: memory_gb: 4פורסים מחדש את ה-API:
gcloud app deploy
אם האפשרות rollout_strategy: managed מצוינת בקטע endpoints_api_service של הקובץ app.yaml, משתמשים בפקודה הבאה כדי לפרוס מחדש את ה-API:
gcloud app deploy
מידע נוסף מופיע במאמר בנושא פריסת ה-API וספק ה-ESP.
בדיקת היומנים ב-Cloud Logging
כדי להשתמש ביומנים של Cloud Logging כדי לפתור בעיות שקשורות לשגיאות בתגובה:
נכנסים לדף Logging במסוף Google Cloud .
בחלק העליון של הדף, בוחרים את Google Cloud הפרויקט.
בתפריט הנפתח שמימין, בוחרים באפשרות Produced API (API שנוצר) > [YOUR_SERVICE_NAME] (שם השירות שלכם).
משנים את טווח הזמן עד שמופיעה שורה עם שגיאת התגובה.
מרחיבים את מטען ה-JSON הייעודי ומחפשים את
error_cause.אם הערך של
error_causeהואapplication, סימן שיש בעיה בקוד.אם הערך של
error causeהוא משהו אחר ואתם לא מצליחים לפתור את הבעיה, אתם יכולים לייצא את היומן ולצרף אותו לכל פנייה שלכם אל Google.
מידע נוסף מפורט במאמרים הבאים:
פרטים על מבנה היומנים ב-Logs Explorer מופיעים במאמר הפניה ליומני נקודות קצה
מתחילים להשתמש ב-Logs Explorer.
אפשר להשתמש בשאילתות מתקדמות ביומן כדי לבצע סינון מתקדם, למשל כדי לקבל את כל הבקשות עם זמן אחזור של יותר מ-300 מילישניות.
בעיות בפונקציה לדוגמה Invoke-WebRequest
בגרסאות מסוימות של Windows PowerShell, הדוגמה Invoke-WebRequest בהדרכות נכשלת. קיבלנו גם דיווח שהתגובה הכילה רשימה של בייטים לא חתומים שהיה צריך להמיר לתווים. אם הדוגמה Invoke-WebRequest לא הניבה את התוצאה הרצויה, נסו לשלוח את הבקשה באמצעות אפליקציה אחרת. הנה כמה הצעות:
- מפעילים את Cloud Shell ופועלים לפי השלבים ל-Linux במדריך שבו השתמשתם כדי לשלוח את הבקשה.
מתקינים אפליקציה של צד שלישי, כמו התוסף לדפדפן Chrome Postman (שמוצע על ידי
www.getpostman.com). כשיוצרים את הבקשה ב-Postman:- בוחרים באפשרות
POSTכפועל ה-HTTP. - בכותרת, בוחרים את המפתח
content-typeואת הערךapplication/json. - בגוף ההודעה, מזינים:
{"message":"hello world"} בכתובת ה-URL, משתמשים במפתח ה-API בפועל ולא במשתנה הסביבה. לדוגמה:
- בסביבה הגמישה של App Engine:
https://example-project-12345.appspot.com/echo?key=AIza... - במערכות קצה אחרות:
http://192.0.2.0:80/echo?key=AIza...
- בסביבה הגמישה של App Engine:
- בוחרים באפשרות
מורידים ומתקינים את
curl, ומריצים אותו בשורת הפקודה. מערכת Windows לא מטפלת במירכאות כפולות שמוכללות בתוך מירכאות בודדות, ולכן צריך לשנות את האפשרות--dataבדוגמה כך שתיראה כך:--data "{\"message\":\"hello world\"}"