הגדרת Endpoints OpenAPI לסביבה רגילה עם ESPv2
בדף הזה מוסבר איך להגדיר Cloud Endpoints ל-App Engine. Endpoints משתמש ב-Extensible Service Proxy V2 (ESPv2) כשער API. כדי לספק ניהול API ל-App Engine, פורסים את קונטיינר ESPv2 שנוצר מראש ב-Cloud Run. לאחר מכן מאבטחים את האפליקציה באמצעות שרת proxy לאימות זהויות (IAP) כדי שרק ESPv2 יוכל להפעיל אותה.
במקרה כזה, ESPv2 מיירט את כל הבקשות לאפליקציה ומבצע את כל הבדיקות הנדרשות (כמו אימות) לפני הפעלת האפליקציה. כשהאפליקציה מגיבה, ESPv2 אוסף ומדווח על טלמטריה, כמו שמוצג באיור הבא. אפשר לראות את המדדים של האפליקציה בדף Endpoints > Services במסוף Google Cloud .
סקירה כללית של Cloud Endpoints זמינה במאמרים מידע על Endpoints וארכיטקטורת Endpoints.
מעבר ל-ESPv2
בגרסאות קודמות של Endpoints הייתה תמיכה בשימוש ב-Extensible Service Proxy (ESP) עם Cloud Run. אם יש לכם ממשקי API קיימים שאתם רוצים להעביר ל-ESPv2, תוכלו לקרוא מידע נוסף במאמר מעבר ל-Extensible Service Proxy V2.
רשימת משימות
אפשר להשתמש ברשימת המשימות הבאה במהלך העבודה עם המדריך. כל המשימות נדרשות כדי ש-Endpoints יוכל לנהל את האפליקציה שלכם.
- יוצרים Google Cloud פרויקט, ואם לא פרסתם את App Engine שלכם, פורסים אפליקציית backend לדוגמה. אפשר לעיין במאמר לפני שמתחילים.
- מגדירים את IAP כדי לאבטח את האפליקציה. איך מגדירים את IAP
- משריינים שם מארח ב-Cloud Run לשירות ESPv2. ראו שמירת שם מארח ב-Cloud Run.
- יוצרים מסמך OpenAPI שמתאר את ה-API ומגדירים את המסלולים ל-App Engine. איך מגדירים נקודות קצה
- פורסים את מסמך ה-OpenAPI כדי ליצור שירות מנוהל. איך פורסים את ההגדרה של נקודות הקצה
- יצירת קובץ אימג' חדש של ESPv2 Docker עם הגדרות השירות של Endpoints. אפשר לעיין במאמר בנושא יצירת תמונה חדשה של ESPv2.
- פורסים את קונטיינר ESPv2 ב-Cloud Run. לאחר מכן, מעניקים ל-ESPv2 הרשאה לניהול זהויות והרשאות גישה (IAM) להפעלת השירות. מידע נוסף זמין במאמר בנושא פריסת מאגר ESPv2.
- מפעילים את האפליקציה. מידע נוסף זמין במאמר בנושא שליחת בקשה ל-API.
- מעקב אחר הפעילות באפליקציות. מידע נוסף זמין במאמר בנושא מעקב אחר פעילות של API.
- כדי להימנע מחיובים בחשבון Google Cloud , מידע נוסף זמין במאמר בנושא הסרת המשאבים.
עלויות
במסמך הזה משתמשים ברכיבים הבאים של Google Cloud, והשימוש בהם כרוך בתשלום:
כדי להעריך את ההוצאות בהתאם לתחזית השימוש שלכם, אתם יכולים להיעזר במחשבון העלויות.
כשמסיימים את המשימות שמתוארות במסמך הזה אפשר למחוק את המשאבים שיצרתם כדי להימנע מחיובים נוספים. מידע נוסף זמין בקטע הסרת המשאבים.
לפני שמתחילים
כדי להגדיר:
במסוף Google Cloud , נכנסים לדף Manage resources ויוצרים פרויקט.
מוודאים שהחיוב מופעל בפרויקט.
חשוב לרשום את מזהה הפרויקט כי תצטרכו אותו בהמשך. בהמשך הדף הזה, מזהה הפרויקט הזה יופיע בתור ESPv2_PROJECT_ID.
חשוב לשמור את מספר הפרויקט כי תצטרכו אותו בהמשך. בהמשך הדף הזה, מספר הפרויקט הזה יופיע כ-ESPv2_PROJECT_NUMBER.
מורידים ומתקינים את Google Cloud CLI.
אם לא פרסתם אפליקציית backend משלכם ב-App Engine, פועלים לפי השלבים שבמדריך למתחילים של App Engine. רושמים את האזור ואת מזהה הפרויקט שבהם האפליקציות נפרסות. בהמשך הדף הזה, מזהה הפרויקט הזה יופיע בתור APP_PROJECT_ID.
הגדרת רכישות מתוך האפליקציה כדי לאבטח את האפליקציה
כדי לאבטח את אפליקציית App Engine, צריך להשתמש בשרת proxy לאימות זהויות (IAP) כדי לוודא שהבקשות מאומתות.
פועלים לפי השלבים להפעלת רכישות מתוך האפליקציה ומוודאים שאפשר להיכנס לאפליקציה.
בנוסף, כשמגדירים את לקוח OAuth, צריך לשים לב ל-OAuth
client_id, שנקרא IAP_CLIENT_ID במדריך הזה.
שמירת שם מארח ב-Cloud Run
כדי להגדיר את מסמך ה-OpenAPI או את הגדרת שירות ה-gRPC, צריך לשריין שם מארח של Cloud Run לשירות ESPv2. כדי לשריין שם מארח, פורסים קונטיינר לדוגמה ב-Cloud Run ומשתמשים בחלק מכתובת ה-URL שנוצרה כשם המארח. בהמשך, תפרסו את קונטיינר ESPv2 באותו שירות לדוגמה של Cloud Run.
-
מוודאים של-CLI של gcloud יש הרשאה לגשת לנתונים ולשירותים שלכם.
- מתחברים לחשבון.
gcloud auth login
- בכרטיסייה החדשה בדפדפן שנפתחת, בוחרים חשבון שיש לו תפקיד עורך או בעלים בפרויקט Google Cloud שיצרתם כדי לפרוס את ESPv2 ב-Cloud Run.
- מתחברים לחשבון.
-
מגדירים את האזור.
gcloud config set run/region us-central1
-
פורסים את התמונה לדוגמה
gcr.io/cloudrun/helloב-Cloud Run. מחליפים את ESPv2_CLOUD_RUN_SERVICE_NAME בשם שרוצים לתת לשירות.gcloud run deploy ESPv2_CLOUD_RUN_SERVICE_NAME \ --image="gcr.io/cloudrun/hello" \ --allow-unauthenticated \ --platform managed \ --project=ESPv2_PROJECT_IDאם הפקודה מסתיימת בלי שגיאות, היא מחזירה הודעה שדומה לזו:
Service [ESPv2_CLOUD_RUN_SERVICE_NAME] revision [ESPv2_CLOUD_RUN_SERVICE_NAME-REVISION_NUM] has been deployed and is serving traffic at ESPv2_CLOUD_RUN_SERVICE_URL
לדוגמה, אם מגדירים את ESPv2_CLOUD_RUN_SERVICE_NAME ל-
gateway:Service [gateway] revision [gateway-00001] has been deployed and is serving traffic at https://gateway-12345-uc.a.run.app
בדוגמה הזו:
-
ESPv2_CLOUD_RUN_SERVICE_URL היא כתובת ה-URL של השירות
https://gateway-12345-uc.a.run.app -
ESPv2_CLOUD_RUN_HOSTNAME הוא שם המארח
gateway-12345-uc.a.run.app.
-
ESPv2_CLOUD_RUN_SERVICE_URL היא כתובת ה-URL של השירות
- תציין את ESPv2_CLOUD_RUN_SERVICE_NAME ואת ESPv2_CLOUD_RUN_HOSTNAME.
בהמשך פורסים את ESPv2 בשירות ESPv2_CLOUD_RUN_SERVICE_NAME Cloud Run.
מציינים את ESPv2_CLOUD_RUN_HOSTNAME בשדה
hostבמסמך OpenAPI.
הגדרת נקודות קצה
צריך ליצור מסמך OpenAPI שמבוסס על OpenAPI 2.0 או על OpenAPI 3.x, ומתאר את הסביבה של האפליקציות ואת דרישות האימות. מידע נוסף זמין במאמר גרסאות נתמכות של OpenAPI.
צריך גם להוסיף שדה ספציפי ל-Google שמכיל את כתובת ה-URL של כל אפליקציה, כדי של-ESPv2 יהיה המידע שהוא צריך כדי להפעיל אפליקציה. אם אתם חדשים ב-OpenAPI, תוכלו לקרוא מידע נוסף בסקירה כללית של OpenAPI.
-
יוצרים קובץ טקסט בשם
openapi-appengine.yaml. לנוחותכם, בדף הזה אנחנו מתייחסים למסמך OpenAPI לפי שם הקובץ הזה, אבל אתם יכולים לתת לו שם אחר אם אתם מעדיפים. -
אפליקציית ה-backend של App Engine מוגדרת בקובץ
openapi-appengine.yaml, בהגדרהx-google-backend(ל-OpenAPI 2.0) או בהגדרהx-google-api-management(ל-OpenAPI 3.x). לדוגמה:הזחה חשובה בפורמט yaml. לדוגמה, השדהOpenAPI 2.0
swagger: '2.0' info: title: Cloud Endpoints + App Engine description: Sample API on Cloud Endpoints with an App Engine backend version: 1.0.0 host: CLOUD_RUN_HOSTNAME schemes: - https produces: - application/json x-google-backend: address: https://APP_PROJECT_ID.REGION.r.appspot.com jwt_audience: IAP_CLIENT_ID protocol: h2 paths: /: get: summary: Greet a user operationId: hello responses: '200': description: A successful response schema: type: string
OpenAPI 3.x
openapi: 3.0.4 info: title: Cloud Endpoints + App Engine description: Sample API on Cloud Endpoints with an App Engine backend version: 1.0.0 servers: - url: https://CLOUD_RUN_HOSTNAME x-google-endpoint: {} # Define reusable components in x-google-api-management x-google-api-management: backends: appengine_backend: address: https://APP_PROJECT_ID.REGION.r.appspot.com jwtAudience: IAP_CLIENT_ID protocol: h2 # Apply the backend configuration by referencing it by name. Set at the root so this applies to all operations unless overridden. x-google-backend: appengine_backend paths: /: get: summary: Greet a user operationId: hello responses: '200': description: A successful response content: application/json: schema: type: string
hostאו השדהserversחייבים להיות באותה רמה כמוinfo. - בשדה
address, מחליפים את APP_PROJECT_ID בGoogle Cloud מזהה הפרויקט, את REGION ב Google Cloud אזור שבו פרסתם את App Engine ואת IAP_CLIENT_ID במזהה הלקוח ב-OAuth שיצרתם כשמגדירים את IAP. מציינים את שם המארח של השירות. הערך הנדרש תלוי בגרסה של מפרט OpenAPI שבה אתם משתמשים.
OpenAPI 2.0
בשדה
hostמציינים את CLOUD_RUN_HOSTNAME, החלק של שם המארח בכתובת ה-URL שהוזמנה בהזמנת שם מארח ב-Cloud Run. לא כוללים את מזהה הפרוטוקול,https://. לדוגמה:swagger: '2.0' info: title: Cloud Endpoints + App Engine description: Sample API on Cloud Endpoints with an App Engine backend version: 1.0.0 host: gateway-12345-uc.a.run.app
OpenAPI 3.x
בשדה
urlשל האובייקטservers, מציינים את כתובת ה-URL המלאה, כולל מזהה הפרוטוקולhttps://ו-CLOUD_RUN_HOSTNAME, וחלק שם המארח של כתובת ה-URL שהוזמן בהזמנת שם מארח ב-Cloud Run. לדוגמה:openapi: 3.0.4 info: title: Cloud Endpoints + App Engine description: Sample API on Cloud Endpoints with an App Engine backend version: 1.0.0 servers: - url: https://gateway-12345-uc.a.run.app x-google-endpoint: {}שימו לב לערך של מאפיין
titleבקובץopenapi-appengine.yaml:title: Cloud Endpoints + App Engine
הערך של המאפיין
titleהופך לשם של שירות Endpoints אחרי שפורסים את ההגדרה.- שומרים את מסמך OpenAPI.
מידע על השדות במסמך OpenAPI שנדרשים ל-Endpoints מופיע במאמר בנושא הגדרת Endpoints.
פריסת ההגדרה של נקודות הקצה
כדי לפרוס את ההגדרה של Endpoints, משתמשים בפקודה gcloud endpoints services deploy. בפקודה הזו נעשה שימוש ב-Service Management כדי ליצור שירות מנוהל.
כדי לפרוס את ההגדרה של Endpoints:
- מוודאים שאתם נמצאים בספרייה שמכילה את מסמך OpenAPI.
מעלים את ההגדרה ויוצרים שירות מנוהל.
gcloud endpoints services deploy openapi-appengine.yaml \ --project ESPv2_PROJECT_ID
כך נוצר שירות Endpoints חדש עם השם שציינתם כשם המארח במסמך OpenAPI. השירות מוגדר בהתאם למסמך OpenAPI.
במהלך היצירה וההגדרה של השירות, Service Management מציג מידע במסוף. בסיום הפריסה, תוצג הודעה שדומה לזו:
Service Configuration [CONFIG_ID] uploaded for service [CLOUD_RUN_HOSTNAME]
CONFIG_ID הוא המזהה הייחודי של הגדרת שירות Endpoints שנוצר על ידי הפריסה. לדוגמה:
Service Configuration [2019-02-01r0] uploaded for service [gateway-12345-uc.a.run.app]
מזהה הגדרות השירות מורכב מחותמת זמן של התאריך וממספר הגרסה. אם פורסים את
openapi-appengine.yamlשוב באותו יום, מספר הגרסה גדל במזהה תצורת השירות. אפשר לראות את הגדרות השירות ואת היסטוריית הפריסה בדף Endpoints > Services במסוף Google Cloud .אם מופיעה הודעת שגיאה, אפשר להיעזר במאמר פתרון בעיות בהטמעה של הגדרת נקודות קצה.
בדיקת השירותים הנדרשים
לפחות, צריך להפעיל את שירותי Google הבאים כדי להשתמש ב-Endpoints וב-ESP:| שם | כותרת |
|---|---|
servicemanagement.googleapis.com |
Service Management API |
servicecontrol.googleapis.com |
Service Control API |
ברוב המקרים, הפקודה gcloud endpoints services deploy מפעילה את השירותים הנדרשים האלה. עם זאת, הפקודה gcloud מסתיימת בהצלחה אבל לא מפעילה את השירותים הנדרשים בנסיבות הבאות:
אם השתמשתם באפליקציה של צד שלישי כמו Terraform ולא כללתם את השירותים האלה.
הפריסה של הגדרת ה-Endpoints בוצעה בפרויקטGoogle Cloud קיים שבו השירותים האלה הושבתו באופן מפורש.
כדי לוודא שהשירותים הנדרשים מופעלים, משתמשים בפקודה הבאה:
gcloud services list
אם השירותים הנדרשים לא מופיעים ברשימה, צריך להפעיל אותם:
gcloud services enable servicemanagement.googleapis.com
gcloud services enable servicecontrol.googleapis.comצריך גם להפעיל את שירות Endpoints:
gcloud services enable ENDPOINTS_SERVICE_NAME
כדי לדעת מהו ENDPOINTS_SERVICE_NAME, אפשר:
אחרי פריסת ההגדרה של Endpoints, נכנסים לדף Endpoints במסוף Cloud. רשימת האפשרויות האפשריות של ENDPOINTS_SERVICE_NAME מוצגת בעמודה שם השירות.
ב-OpenAPI, ENDPOINTS_SERVICE_NAME הוא הערך שציינתם בשדה
hostבמפרט OpenAPI. ב-gRPC, ENDPOINTS_SERVICE_NAME הוא הערך שציינתם בשדהnameבהגדרות של נקודות הקצה של gRPC.
מידע נוסף על פקודות gcloud זמין במאמר שירותי gcloud.
יצירת תמונה חדשה של ESPv2
יוצרים קובץ אימג' חדש של ESPv2 Docker מהגדרות השירות של Endpoints. בהמשך תפרסו את האימג' הזה בשירות Cloud Run השמור.
כדי ליצור את קובץ ההגדרות של השירות בקובץ אימג' חדש של ESPv2 Docker:
מורידים את הסקריפט הזה למחשב המקומי שבו מותקן ה-CLI של gcloud.
מריצים את הסקריפט באמצעות הפקודה הבאה:
chmod +x gcloud_build_image./gcloud_build_image -s ESPv2_CLOUD_RUN_HOSTNAME \ -c CONFIG_ID -p ESPv2_PROJECT_IDבשדה ESPv2_CLOUD_RUN_HOSTNAME, מציינים את שם המארח של כתובת ה-URL שהזמנתם למעלה בקטע הזמנת שם מארח ב-Cloud Run. לא כוללים את מזהה הפרוטוקול,
https://.לדוגמה:
chmod +x gcloud_build_image./gcloud_build_image -s gateway-12345-uc.a.run.app \ -c 2019-02-01r0 -p your-project-id-
הסקריפט משתמש בפקודה
gcloudכדי להוריד את הגדרות השירות, ליצור מהן קובץ אימג' חדש של ESPv2 ולהעלות את קובץ האימג' החדש למאגר הקונטיינרים של הפרויקט. הסקריפט משתמש אוטומטית בגרסה האחרונה של ESPv2, שמסומנת ב-ESPv2_VERSION בשם של תמונת הפלט. התמונה שנוצרה מועלית אל:gcr.io/ESPv2_PROJECT_ID/endpoints-runtime-serverless:ESPv2_VERSION-ESPv2_CLOUD_RUN_HOSTNAME-CONFIG_ID
לדוגמה:
gcr.io/your-project-id/endpoints-runtime-serverless:2.14.0-gateway-12345-uc.a.run.app-2019-02-01r0"
פריסת הקונטיינר של ESPv2
פורסים את שירות ESPv2 Cloud Run עם האימג' החדש שיצרתם קודם. מחליפים את CLOUD_RUN_SERVICE_NAME באותו שם שירות של Cloud Run שבו השתמשתם כששריינתם את שם המארח במקור, כפי שמתואר במאמר שריון שם מארח ב-Cloud Run:
gcloud run deploy CLOUD_RUN_SERVICE_NAME \ --image="gcr.io/ESPv2_PROJECT_ID/endpoints-runtime-serverless:ESPv2_VERSION-CLOUD_RUN_HOSTNAME-CONFIG_ID" \ --allow-unauthenticated \ --platform managed \ --project=ESPv2_PROJECT_ID
אם רוצים להגדיר את Endpoints כך שישתמש באפשרויות נוספות להפעלה של ESPv2, כמו הפעלת CORS, אפשר להעביר את הארגומנטים במשתנה הסביבה
ESPv2_ARGS:gcloud run deploy CLOUD_RUN_SERVICE_NAME \ --image="gcr.io/ESPv2_PROJECT_ID/endpoints-runtime-serverless:ESPv2_VERSION-CLOUD_RUN_HOSTNAME-CONFIG_ID" \ --set-env-vars=ESPv2_ARGS=--cors_preset=basic \ --allow-unauthenticated \ --platform managed \ --project ESPv2_PROJECT_ID
למידע נוסף ולדוגמאות על הגדרת משתנה הסביבה
ESPv2_ARGS, כולל רשימת האפשרויות הזמינות ומידע על ציון כמה אפשרויות, אפשר לעיין במאמר Extensible Service Proxy V2 flags.- נותנים ל-ESPv2 הרשאה להפעיל את האפליקציה שמאובטחת באמצעות IAP. מריצים את הפקודה הבאה לכל שירות. בפקודה הבאה:
- מחליפים את APP_PROJECT_ID במזהה הפרויקט ב-App Engine.
- מחליפים את ESPv2_PROJECT_NUMBER במספר הפרויקט שיצרתם עבור ESPv2. אחת הדרכים למצוא את זה היא לעבור אל מסוף IAM ולחפש את חשבון השירות שמוגדר כברירת מחדל ב-Compute Engine, שהוא חשבון השירות שמשמש בדגל member.
gcloud projects add-iam-policy-binding APP_PROJECT_ID \ --member "serviceAccount:ESPv2_PROJECT_NUMBER-compute@developer.gserviceaccount.com" \ --role "roles/iap.httpsResourceAccessor"
מידע נוסף זמין במאמר ניהול גישה באמצעות IAM.
שליחת בקשות ל-API
בקטע הזה נסביר איך לשלוח בקשות ל-API.
יוצרים משתנה סביבה לשם של שירות Endpoints. זה השם שציינתם בשדה
hostבמסמך OpenAPI. לדוגמה:Linux או macOS:
export ENDPOINTS_HOST=gateway-12345-uc.a.run.appWindows PowerShell:
$Env: ENDPOINTS_HOST="gateway-12345-uc.a.run.app"
Linux או Mac OS
משתמשים ב-curl כדי לשלוח בקשת HTTP באמצעות משתנה הסביבה ENDPOINTS_HOST שהגדרתם בשלב הקודם.
curl --request GET \
--header "content-type:application/json" \
"https://${ENDPOINTS_HOST}/"PowerShell
משתמשים ב-Invoke-WebRequest כדי לשלוח בקשת HTTP באמצעות משתנה הסביבה ENDPOINTS_HOST שהגדרתם בשלב הקודם.
(Invoke-WebRequest -Method GET `
-Headers @{"content-type"="application/json"} `
-URI "https://$Env:ENDPOINTS_HOST/").Content
בדוגמה הקודמת, שתי השורות הראשונות מסתיימות בגרש הפוך. כשמדביקים את הדוגמה ב-PowerShell, צריך לוודא שאין רווח אחרי התווים '`'. מידע על האפשרויות שבהן נעשה שימוש בבקשת הדוגמה מופיע במאמר Invoke-WebRequest במסמכי התיעוד של מיקרוסופט.
אפליקציה של צד שלישי
אפשר להשתמש באפליקציה של צד שלישי כמו התוסף Postman לדפדפן Chrome כדי לשלוח בקשה.
- בוחרים באפשרות
GETכפועל ה-HTTP. - בכותרת, בוחרים את המפתח
content-typeואת הערךapplication/json. משתמשים בכתובת ה-URL בפועל במקום במשתנה הסביבה, לדוגמה:
https://gateway-12345-uc.a.run.app/
אם לא קיבלתם תגובה, אפשר להיעזר במאמר בנושא פתרון בעיות שקשורות לתגובות.
הרגע פרסתם ובדקתם API ב-Endpoints!
מעקב אחר פעילות ב-API
אפשר לראות את הגרפים של הפעילות ב-API בדף Endpoints > Service במסוף Google Cloud .
הצגת גרפים של פעילות ב-Endpoints
יכול להיות שיעברו כמה רגעים עד שהבקשה תשתקף בתרשימים.
מעיינים ביומני הבקשות של ה-API בדף Logs Explorer.
הסרת המשאבים
כדי לא לצבור חיובים לחשבון Google Cloud על המשאבים שבהם השתמשתם בדף הזה, פועלים לפי השלבים הבאים:
במאמר מחיקת API ומופעי API מוסבר איך להפסיק את השירותים שבהם נעשה שימוש במדריך הזה.