במדריך הזה נסביר איך להגדיר ולפרוס API לדוגמה ואת Extensible Service Proxy V2 (ESPv2) באשכול Google Kubernetes Engine (GKE).
ה-API בארכיטקטורת REST של קוד לדוגמה מתואר באמצעות מפרט OpenAPI. במדריך מוסבר גם איך ליצור מפתח API ואיך להשתמש בו כששולחים בקשות ל-API.
במדריך נעשה שימוש בקובצי אימג' של קונטיינרים שנבנו מראש של קוד לדוגמה ושל ESPv2, שמאוחסנים ב-Artifact Registry.
סקירה כללית של Cloud Endpoints זמינה במאמרים מידע על Endpoints וארכיטקטורת Endpoints.
מטרות
במהלך העבודה עם המדריך, תוכלו להשתמש ברשימת המשימות הכללית הבאה. כדי לשלוח בקשות ל-API בהצלחה, צריך לבצע את כל המשימות בחלק 1.
חלק 1
- מגדירים Google Cloud פרויקט. לפני שמתחילים
- יוצרים אשכול של מאגרי תגים ב-GKE. איך יוצרים אשכול של מאגרי תגים
- מתקינים ומגדירים את התוכנה שמשמשת במדריך. מידע נוסף זמין במאמר בנושא התקנה והגדרה של תוכנה נדרשת.
- מורידים את הקוד לדוגמה. איך מקבלים את הקוד לדוגמה
- מגדירים את הקובץ
openapi.yaml, שמשמש להגדרת Cloud Endpoints. איך מגדירים נקודות קצה - פורסים את ההגדרה של Endpoints כדי ליצור שירות Endpoints. איך פורסים את ההגדרה של נקודות הקצה
- פורסים את ה-API ואת ESPv2 באשכול. מידע נוסף זמין במאמר בנושא פריסת קצה העורפי של ה-API.
- משיגים את כתובת ה-IP של האשכול. איך מקבלים את כתובת ה-IP החיצונית של האשכול
- שליחת בקשה ל-API באמצעות כתובת IP. איך שולחים בקשה באמצעות כתובת IP
- מעקב אחר פעילות ב-API. מידע נוסף זמין במאמר בנושא מעקב אחר פעילות של API.
חלק 2
- הגדרת רשומת DNS עבור ה-API לדוגמה. מידע נוסף מופיע במאמר בנושא הגדרת DNS לנקודות קצה.
- שולחים בקשה ל-API באמצעות שם הדומיין שמוגדר במלואו. איך שולחים בקשה באמצעות FQDN
ניקוי
כשמסיימים, כדאי לעיין במאמר בנושא ניקוי כדי להימנע מחיובים בחשבון Google Cloud .
עלויות
במסמך הזה משתמשים ברכיבים הבאים של Google Cloud, והשימוש בהם כרוך בתשלום:
כדי להעריך את ההוצאות בהתאם לתחזית השימוש שלכם, אתם יכולים להיעזר במחשבון העלויות.
כשמסיימים את המשימות שמתוארות במסמך הזה אפשר למחוק את המשאבים שיצרתם כדי להימנע מחיובים נוספים. מידע נוסף זמין בקטע הסרת המשאבים.
לפני שמתחילים
- נכנסים לחשבון Google Cloud . אם אתם משתמשים חדשים ב- Google Cloud, צרו חשבון כדי שתוכלו להעריך את הביצועים של המוצרים שלנו בתרחישים מהעולם האמיתי. לקוחות חדשים מקבלים בחינם גם קרדיט בשווי 300$ להרצה, לבדיקה ולפריסה של עומסי העבודה.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
- חשוב לרשום את Google Cloud מזהה הפרויקט, כי תצטרכו אותו בהמשך.
יצירת אשכול של מאגרי תגים
כדי להריץ את קוד הקצה העורפי של ה-API לדוגמה, צריך ליצור אשכול של קונטיינרים ב-GKE. כדי להשתמש באיזון עומסים שמקורו בקונטיינר, צריך להגדיר כינוי לכתובת IP באשכול. כדי ליצור אשכול של קונטיינרים עם כינוי לכתובת IP עבור ה-API לדוגמה:
gcloud container clusters create espv2-demo-cluster \
--enable-ip-alias \
--create-subnetwork="" \
--network=default \
--zone=us-central1-a
פקודת הדוגמה יוצרת אשכול, espv2-demo-cluster, עם רשת משנה שהוקצתה אוטומטית באזור us-central1-a.
חשוב לרשום בצד את שם האשכול ואת האזור, כי תצטרכו אותם כשתיצרו אימות של kubectl לאשכול של מאגרי התמונות.
התקנה והגדרה של תוכנה נדרשת
במדריך הזה מוסבר איך להתקין את ה-CLI של gcloud כדי שתוכלו להשתמש ב-Google Cloud CLI לניהול הפרויקט.
משתמשים ב-kubectl כדי להריץ פקודות מול אשכולות GKE. צריך גם דרך לבדוק את ה-API.
אם כבר התקנתם את התוכנה הנדרשת, אתם יכולים להמשיך לשלב הבא.
כדי להתקין ולהגדיר את התוכנה הנדרשת:
-
אתם צריכים אפליקציה כדי לשלוח בקשות ל-API לדוגמה.
- משתמשי Linux ו-macOS: במדריך הזה יש דוגמה לשימוש ב-
curl, שבדרך כלל מותקן מראש במערכת ההפעלה. אם אין לכם אתcurl, אתם יכולים להוריד אותו מcurlדף ההורדות והגרסאות. - משתמשי Windows: במדריך הזה יש דוגמה לשימוש ב-
Invoke-WebRequest, שנתמך ב-PowerShell 3.0 ואילך.
- משתמשי Linux ו-macOS: במדריך הזה יש דוגמה לשימוש ב-
- מתקינים ומפעילים את ה-CLI של gcloud.
-
מעדכנים את ה-CLI של gcloud ומתקינים את רכיבי Endpoints:
gcloud components update
-
מוודאים ש-Google Cloud CLI (
gcloud) מורשה לגשת לנתונים ולשירותים שלכם ב- Google Cloud: בכרטיסייה החדשה בדפדפן שנפתחת, בוחרים חשבון.gcloud auth login
-
מגדירים את פרויקט ברירת המחדל למזהה הפרויקט:
gcloud config set project YOUR_PROJECT_ID
מחליפים את YOUR_PROJECT_ID במזהה הפרויקט. אם יש לכם פרויקטים אחרים של Google Cloud ואתם רוצים להשתמש ב-
gcloudכדי לנהל אותם, כדאי לעיין במאמר בנושא ניהול ההגדרות האישיות של ה-CLI של gcloud. - התקנה של
kubectl:gcloud components install kubectl
-
קבלת פרטי כניסה חדשים של משתמשים לשימוש ב-Application Default Credentials.
צריך את פרטי הכניסה של המשתמש כדי לתת הרשאה ל-
kubectl. בכרטיסייה החדשה בדפדפן שנפתחת, בוחרים חשבון.gcloud auth application-default login
הורדת הקוד לדוגמה
כדי לעזור לכם להתחיל לעבוד במהירות, אנחנו מספקים קוד לדוגמה בכמה שפות. כדי להוריד את הקוד לדוגמה למחשב המקומי:
כדי לשכפל או להוריד את ה-API לדוגמה:
- משכפלים את מאגר האפליקציה לדוגמה ומעבירים אותו למכונה המקומית:
git clone https://github.com/GoogleCloudPlatform/java-docs-samples
אפשרות אחרת היא להוריד את הדוגמה כקובץ ZIP ולחלץ אותה.
- עוברים לספרייה שמכילה את הקוד לדוגמה:
cd java-docs-samples/endpoints/getting-started
כדי לשכפל או להוריד את ה-API לדוגמה:
- משכפלים את מאגר האפליקציה לדוגמה ומעבירים אותו למכונה המקומית:
git clone https://github.com/GoogleCloudPlatform/python-docs-samples
אפשרות אחרת היא להוריד את הדוגמה כקובץ ZIP ולחלץ אותה.
- עוברים לספרייה שמכילה את הקוד לדוגמה:
cd python-docs-samples/endpoints/getting-started
כדי לשכפל או להוריד את ה-API לדוגמה:
- מוודאים שמשתנה הסביבה
GOPATHמוגדר. - משכפלים את מאגר האפליקציה לדוגמה ומעבירים אותו למכונה המקומית:
go get -d github.com/GoogleCloudPlatform/golang-samples/endpoints/getting-started
- עוברים לספרייה שמכילה את הקוד לדוגמה:
cd $GOPATH/src/github.com/GoogleCloudPlatform/golang-samples/endpoints/getting-started
כדי לשכפל או להוריד את ה-API לדוגמה:
- משכפלים את מאגר האפליקציה לדוגמה ומעבירים אותו למכונה המקומית:
git clone https://github.com/GoogleCloudPlatform/php-docs-samples
אפשרות אחרת היא להוריד את הדוגמה כקובץ ZIP ולחלץ אותה.
- עוברים לספרייה שמכילה את הקוד לדוגמה:
cd php-docs-samples/endpoints/getting-started
כדי לשכפל או להוריד את ה-API לדוגמה:
- משכפלים את מאגר האפליקציה לדוגמה ומעבירים אותו למכונה המקומית:
git clone https://github.com/GoogleCloudPlatform/ruby-docs-samples
אפשרות אחרת היא להוריד את הדוגמה כקובץ ZIP ולחלץ אותה.
- עוברים לספרייה שמכילה את הקוד לדוגמה:
cd ruby-docs-samples/endpoints/getting-started
כדי לשכפל או להוריד את ה-API לדוגמה:
- משכפלים את מאגר האפליקציה לדוגמה ומעבירים אותו למכונה המקומית:
git clone https://github.com/GoogleCloudPlatform/nodejs-docs-samples
אפשרות אחרת היא להוריד את הדוגמה כקובץ ZIP ולחלץ אותה.
- עוברים לספרייה שמכילה את הקוד לדוגמה:
cd nodejs-docs-samples/endpoints/getting-started
הגדרת נקודות קצה
צריך ליצור מסמך OpenAPI שמבוסס על OpenAPI 2.0 או על OpenAPI 3.x, ומתאר את הסביבה של האפליקציות ואת דרישות האימות. מידע נוסף זמין במאמר גרסאות נתמכות של OpenAPI.
צריך גם להוסיף שדה ספציפי ל-Google שמכיל את כתובת ה-URL של כל אפליקציה, כדי של-ESPv2 יהיה המידע שהוא צריך כדי להפעיל אפליקציה. אם אתם חדשים ב-OpenAPI, תוכלו לקרוא מידע נוסף בסקירה כללית של OpenAPI.
OpenAPI 2.0
כדי להגדיר נקודות קצה באמצעות מפרט OpenAPI 2.0, אפשר להשתמש בקובץ openapi.yaml שזמין בספרייה endpoints/getting-started של קוד הדוגמה שהורדתם.
התוכן של מפרט OpenAPI 2.0 צריך להיראות בערך כך:
swagger: "2.0" info: description: "A simple Google Cloud Endpoints API example." title: "Endpoints Example" version: "1.0.0" host: "echo-api.endpoints.YOUR_PROJECT_ID.cloud.goog" consumes: - "application/json" produces: - "application/json" schemes: # Uncomment the next line if you configure SSL for this API. # - "https" - "http" paths: /echo: post: description: "Echo back a given message." operationId: "echo" produces: - "application/json" responses: 200: description: "Echo" schema: $ref: "#/definitions/echoMessage" parameters: - description: "Message to echo" in: body name: message required: true schema: $ref: "#/definitions/echoMessage" security: - api_key: [] /auth/info/googlejwt: get: description: "Returns the requests' authentication information." operationId: "auth_info_google_jwt" produces: - "application/json" responses: 200: description: "Authenication info." schema: $ref: "#/definitions/authInfoResponse" security: - api_key: [] google_jwt: [] /auth/info/googleidtoken: get: description: "Returns the requests' authentication information." operationId: "authInfoGoogleIdToken" produces: - "application/json" responses: 200: description: "Authentication info." schema: $ref: "#/definitions/authInfoResponse" security: - api_key: [] google_id_token: [] definitions: echoMessage: type: "object" properties: message: type: "string" authInfoResponse: properties: id: type: "string" email: type: "string" securityDefinitions: # This section configures basic authentication with an API key. api_key: type: "apiKey" name: "key" in: "query" # This section configures authentication using Google API Service Accounts # to sign a json web token. This is mostly used for server-to-server # communication. google_jwt: authorizationUrl: "" flow: "implicit" type: "oauth2" # This must match the 'iss' field in the JWT. x-google-issuer: "jwt-client.endpoints.sample.google.com" # Update this with your service account's email address. x-google-jwks_uri: "https://www.googleapis.com/service_accounts/v1/jwk/YOUR_SERVICE_ACCOUNT_EMAIL" # This must match the "aud" field in the JWT. You can add multiple # audiences to accept JWTs from multiple clients. x-google-audiences: "echo.endpoints.sample.google.com" # This section configures authentication using Google OAuth2 ID Tokens. # ID Tokens can be obtained using OAuth2 clients, and can be used to access # your API on behalf of a particular user. google_id_token: authorizationUrl: "" flow: "implicit" type: "oauth2" x-google-issuer: "https://accounts.google.com" x-google-jwks_uri: "https://www.googleapis.com/oauth2/v3/certs" # Your OAuth2 client's Client ID must be added here. You can add # multiple client IDs to accept tokens from multiple clients. x-google-audiences: "YOUR_CLIENT_ID"
OpenAPI 3.x
כדי להגדיר את Endpoints באמצעות מפרט OpenAPI 3.x, אפשר להחליף את התוכן של הקובץ openapi.yaml שזמין בספרייה endpoints/getting-started של קוד הדוגמה שהורדתם:
- פותחים את הקובץ
openapi.yamlבכלי לעריכת טקסט ומחליפים את התוכן שלו בתוכן הבא:openapi: 3.0.4 info: description: "A simple Google Cloud Endpoints API example." title: "Endpoints Example" version: "1.0.0" servers: - url: "http://echo-api.endpoints.YOUR_PROJECT_ID.cloud.goog" x-google-endpoint: {} paths: "/echo": post: description: "Echo back a given message." operationId: "echo" requestBody: description: "Message to echo" required: true content: "application/json": schema: $ref: "#/components/schemas/echoMessage" responses: '200': description: "Echo" content: "application/json": schema: $ref: "#/components/schemas/echoMessage" security: - api_key: [] "/auth/info/googlejwt": get: description: "Returns the requests' authentication information." operationId: "auth_info_google_jwt" responses: '200': description: "Authentication info." content: "application/json": schema: $ref: "#/components/schemas/authInfoResponse" security: - api_key: [] google_jwt: [] "/auth/info/googleidtoken": get: description: "Returns the requests' authentication information." operationId: "authInfoGoogleIdToken" responses: '200': description: "Authentication info." content: "application/json": schema: $ref: "#/components/schemas/authInfoResponse" security: - api_key: [] google_id_token: [] components: schemas: echoMessage: type: "object" properties: message: type: "string" authInfoResponse: properties: id: type: "string" email: type: "string" securitySchemes: api_key: type: "apiKey" name: "key" in: "query" google_jwt: type: "oauth2" flows: implicit: authorizationUrl: "" scopes: {} x-google-auth: issuer: "jwt-client.endpoints.sample.google.com" jwksUri: "https://www.googleapis.com/service_accounts/v1/jwk/YOUR_SERVICE_ACCOUNT_EMAIL" audiences: "echo.endpoints.sample.google.com" google_id_token: type: "oauth2" flows: implicit: authorizationUrl: "" scopes: {} x-google-auth: issuer: "https://accounts.google.com" jwksUri: "https://www.googleapis.com/oauth2/v3/certs" audiences: - "YOUR_CLIENT_ID"
- שומרים את התוכן החדש של
openapi.yaml.
במדריך הזה נעשה שימוש בתוסף ספציפי ל-Google למפרט OpenAPI, שמאפשר להגדיר את שם השירות. השיטה לציון שם השירות תלויה בגרסה של מפרט OpenAPI שבה אתם משתמשים.
OpenAPI 2.0
משתמשים בשדה host כדי לציין את שם השירות:
host: echo-api.endpoints.YOUR_PROJECT_ID.cloud.goog
כדי להגדיר נקודות קצה:
- פותחים את הקובץ
openapi.yaml. - בשדה
host, מחליפים את YOUR_PROJECT_ID במזהה הפרויקט ב- Google Cloud . - שומרים את קובץ ה-
openapi.yaml.
OpenAPI 3.x
משתמשים בשדה url באובייקט servers כדי לציין את שם השירות:
servers: - url: https://echo-api.endpoints.YOUR_PROJECT_ID.cloud.goog x-google-endpoint: {}
כדי להגדיר נקודות קצה:
- פותחים את הקובץ
openapi.yaml. - אם בקובץ
openapi.yamlיש שדהhost, צריך להסיר אותו. - מוסיפים אובייקט
serversכמו שמוצג. - בשדה
url, מחליפים את YOUR_PROJECT_ID במזהה הפרויקט ב- Google Cloud . - שומרים את קובץ ה-
openapi.yaml.
אחרי שמסיימים את כל שלבי ההגדרה הבאים כך שאפשר לשלוח בקשות ל-API לדוגמה באמצעות כתובת IP, אפשר לעיין במאמר הגדרת DNS של נקודות קצה כדי לקבל מידע על הגדרת echo-api.endpoints.YOUR_PROJECT_ID.cloud.goog כשם הדומיין שמוגדר במלואו (FQDN).
פריסת ההגדרה של נקודות הקצה
כדי לפרוס את ההגדרה של Endpoints, משתמשים בפקודה gcloud endpoints
services deploy. הפקודה הזו משתמשת ב-Service Management כדי ליצור שירות מנוהל.
כדי לפרוס את ההגדרה של Endpoints:
- מוודאים שאתם נמצאים בספרייה שבה נמצא קובץ ההגדרות
openapi.yaml. - מעלים את ההגדרה ויוצרים שירות מנוהל:
gcloud endpoints services deploy openapi.yaml
הפקודה gcloud קוראת ל-Service Management API כדי ליצור שירות מנוהל עם השם שציינתם בשדה host או servers.url בקובץ openapi.yaml.
שירות ניהול השירותים מגדיר את השירות בהתאם להגדרות בקובץ openapi.yaml. כשמבצעים שינויים ב-openapi.yaml, צריך לפרוס מחדש את הקובץ כדי לעדכן את שירות נקודות הקצה.
במהלך היצירה וההגדרה של השירות, Service Management מציג מידע במסוף. אפשר להתעלם בבטחה מהאזהרות לגבי הנתיבים בקובץ openapi.yaml שלא דורשים מפתח API.
בסיום הגדרת השירות, Service Management מציג הודעה עם מזהה הגדרת השירות ושם השירות, בדומה להודעה הבאה:
Service Configuration [2017-02-13r0] uploaded for service [echo-api.endpoints.example-project-12345.cloud.goog]
בדוגמה שלמעלה, 2017-02-13r0 הוא מזהה הגדרת השירות ו-echo-api.endpoints.example-project-12345.cloud.goog הוא שירות ה-Endpoints. מזהה הגדרות השירות מורכב מחותמת תאריך וממספר גרסה. אם תפעילו את הקובץ openapi.yaml שוב באותו יום, מספר הגרסה יוגדל במזהה תצורת השירות. אפשר לראות את הגדרת השירות של Endpoints בדף Endpoints > Services במסוף Google Cloud .
אם מופיעה הודעת שגיאה, אפשר לעיין במאמר בנושא פתרון בעיות בהטמעה של הגדרות Endpoints.
בדיקת השירותים הנדרשים
לפחות, צריך להפעיל את שירותי 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.
פריסת ה-API backend
עד עכשיו פרסתם את מסמך OpenAPI ל-Service Management, אבל עדיין לא פרסתם את הקוד שמשרת את העורף של ה-API. בקטע הזה מוסבר איך לפרוס קונטיינרים מוכנים מראש עבור ה-API לדוגמה ו-ESPv2 באשכול.
בדיקת ההרשאות הנדרשות
ESP ו-ESPv2 קוראים לשירותי Google שמשתמשים ב-IAM כדי לוודא שלזהות שקוראת יש מספיק הרשאות לגשת למשאבי ה-IAM שנעשה בהם שימוש. הזהות של הקריאה היא חשבון השירות המצורף שפורסו בו ESP ו-ESPv2.
כשפורסים את האפליקציה בתרמיל GKE, חשבון השירות המצורף הוא חשבון השירות של הצומת. בדרך כלל זה חשבון השירות שמוגדר כברירת מחדל ב-Compute Engine. כדי לבחור חשבון שירות מתאים לצומת, צריך לפעול לפי ההמלצה בנושא הרשאות.
אם נעשה שימוש ב- Workload Identity, אפשר להשתמש בחשבון שירות נפרד, שאינו חשבון השירות של הצומת, כדי לתקשר עם שירותי Google. אפשר ליצור חשבון שירות של Kubernetes בשביל הפוד כדי להריץ את ESP ו-ESPv2, ליצור חשבון שירות של Google ולקשר את חשבון השירות של Kubernetes לחשבון השירות של Google.
כדי לשייך חשבון שירות של Kubernetes לחשבון שירות של Google, פועלים לפי השלבים האלה. חשבון השירות הזה של Google הוא חשבון השירות המצורף.
אם חשבון השירות המצורף הוא חשבון השירות שמוגדר כברירת מחדל ב-Compute Engine של הפרויקט, וההגדרה של שירות נקודת הקצה נפרסת באותו הפרויקט, לחשבון השירות אמורות להיות מספיק הרשאות כדי לגשת למשאבי IAM, ולכן אפשר לדלג על שלב ההגדרה של תפקידי IAM. אחרת, צריך להוסיף את התפקידים הבאים ב-IAM לחשבון השירות המצורף.
מוסיפים את התפקידים הנדרשים ב-IAM:
בקטע הזה מתוארים משאבי ה-IAM שמשמשים את ESP ו-ESPv2, ותפקידי ה-IAM שנדרשים לחשבון השירות המצורף כדי לגשת למשאבים האלה.
הגדרת שירות נקודות קצה
ESP ו-ESPv2 קוראים ל-Service Control API, שמשתמש בהגדרות השירות של נקודת הקצה. הגדרת שירות נקודת הקצה היא משאב IAM, ו-ESP ו-ESPv2 צריכים את התפקיד Service Controller כדי לגשת אליו.
תפקיד ה-IAM מוגדר בהגדרות של שירות נקודת הקצה, ולא בפרויקט. יכול להיות שלפרויקט יש כמה הגדרות של שירות נקודות קצה.
משתמשים בפקודה הבאה ב-gcloud כדי להוסיף את התפקיד לחשבון השירות המצורף להגדרת שירות נקודת הקצה.
gcloud endpoints services add-iam-policy-binding SERVICE_NAME \ --member serviceAccount:SERVICE_ACCOUNT_NAME@DEPLOY_PROJECT_ID.iam.gserviceaccount.com \ --role roles/servicemanagement.serviceController
כאשר
* SERVICE_NAME הוא שם שירות נקודת הקצה
* SERVICE_ACCOUNT_NAME@DEPLOY_PROJECT_ID.iam.gserviceaccount.com
הוא חשבון השירות המצורף.
Cloud Trace
ESP ו-ESPv2 קוראים לשירות
Cloud Trace כדי לייצא את הנתונים של Trace לפרויקט. הפרויקט הזה נקרא פרויקט המעקב. ב-ESP, פרויקט המעקב והפרויקט שבבעלותו הגדרות השירות של נקודת הקצה הם אותו פרויקט. ב-ESPv2, אפשר לציין את פרויקט המעקב באמצעות הדגל --tracing_project_id, ופרויקט הפריסה מוגדר כברירת מחדל.
כדי להפעיל את Cloud Trace, צריך להקצות ל-ESP ול-ESPv2 את התפקיד Cloud Trace Agent.
משתמשים בפקודה הבאה ב-gcloud כדי להוסיף את התפקיד לחשבון השירות המצורף:
gcloud projects add-iam-policy-binding TRACING_PROJECT_ID \ --member serviceAccount:SERVICE_ACCOUNT_NAME@DEPLOY_PROJECT_ID.iam.gserviceaccount.com \ --role roles/cloudtrace.agent
כאשר
* TRACING_PROJECT_ID הוא מזהה פרויקט המעקב
* SERVICE_ACCOUNT_NAME@DEPLOY_PROJECT_ID.iam.gserviceaccount.com
הוא חשבון השירות המצורף.
מידע נוסף זמין במאמר
מהם תפקידים והרשאות?
פריסת הקונטיינרים באשכול
קונטיינרים הם מנגנון אריזה לוגי שמאפשר להפריד בין אפליקציות לבין הסביבה שבה הן פועלות בפועל. כדי לפרוס את ה-API לדוגמה ואת ESPv2 לאשכול, מבצעים את הפעולות הבאות. כדי לפרוס את הקונטיינרים באשכול:
- קבלת פרטי כניסה לאשכול והפיכתם לזמינים ל-
kubectl: מחליפים את NAME בשם האשכול ואת ZONE באזור האשכול.gcloud container clusters get-credentials NAME --zone ZONE - פריסת שירות Kubernetes באשכול GKE. שירות Kubernetes מטמיע את ה-API.
git clonethis repo,cd getting-started/to folder and edit the Kubernetes configuration fileLANG-deployment.yaml, and replace SERVICE_NAME in the ESPv2 startup options with the name of your service.Java Python Go PHP Ruby NodeJS לדוגמה:
args: [ "--listener_port=8081", "--backend=http://127.0.0.1:8080", "--service=echo-api.endpoints.example-project-12345.cloud.goog ", "--rollout_strategy=managed", ]האפשרות
--rollout_strategy=managedמגדירה את ESPv2 כך שישתמש בהגדרת השירות העדכנית ביותר שפריסתה הושלמה. כשמציינים את האפשרות הזו, תוך דקה אחרי פריסת הגדרת שירות חדשה, ESPv2 מזהה את השינוי ומתחיל להשתמש בה באופן אוטומטי. אנחנו ממליצים לציין את האפשרות הזו במקום לספק מזהה הגדרה ספציפי לשימוש ב-ESPv2. מידע על האפשרויות האחרות של ESPv2 שבהן נעשה שימוש זמין במאמר אפשרויות הפעלה של ESPv2.פריסת הגדרות שירות בנקודות קצה
אם אתם מפעילים מספר גדול של נקודות קצה (יותר מ-100) באותו פרויקט ב-Google Cloud, מומלץ לטעון את הגדרת השירות עבור הקונטיינר במקום להשתמש בדגל
--rollout_strategy=managedכדי לשלוף את הגדרת השירות מ-Service Management API.ל-Service Management API יש מכסה שמוגדרת כברירת מחדל. אם צי גדול של שרתי proxy של ESPv2 משתמש ב-
כדי לטעון את קובץ ההגדרות של השירות:--rollout_strategy=managed, כולם יבצעו סקר כדי לקבל את הגדרת השירות העדכנית ביותר. יכול להיות שמספר המכשירים חורג מהמכסה, ולכן העדכון של הגדרות השירות נכשל.- מורידים את קובץ ההגדרות של שירות בפורמט JSON.
- יוצרים משאב של מפת הגדרות של Kubernetes מהגדרות ה-JSON.
- מטמיעים את משאב מפת ההגדרות בקונטיינר ומשתמשים בדגל
--service_config_pathכדי לציין את הנתיב של קובץ ההגדרות.
curl -o "/tmp/service_config.json" -H "Authorization: Bearer $(gcloud auth print-access-token)" \ "https://servicemanagement.googleapis.com/v1/services/SERVICE/configs/CONFIG_ID?view=FULL"
kubectl create configmap service-config-configmap \ --from-file=service_config.json:/tmp/service_config.json
לדוגמה:
containers: - args: - --listener_port=8081 - --backend=http://127.0.0.1:8080 - --service_json_path=/etc/espv2_config/service_config.json - --healthz=/healthz image: gcr.io/endpoints-release/endpoints-runtime:2 name: esp ports: - containerPort: 8081 protocol: TCP volumeMounts: - mountPath: /etc/espv2_config name: service-config-volume volumes: - configMap: defaultMode: 420 name: service-config-configmap name: service-config-volume - מפעילים את שירות Kubernetes באמצעות הפקודה
kubectl apply:Java kubectl apply -f java-deployment.yaml
Python kubectl apply -f python-deployment.yaml
אפשר kubectl apply -f golang-deployment.yaml
PHP kubectl apply -f php-deployment.yaml
Ruby kubectl apply -f ruby-deployment.yaml
NodeJS kubectl apply -f nodejs-deployment.yaml
אם מופיעה הודעת שגיאה, אפשר לעיין במאמר בנושא פתרון בעיות בנקודות קצה ב-GKE. מידע נוסף זמין במאמר בנושא פריסת קצה העורפי של ה-API.
קבלת כתובת ה-IP החיצונית של האשכול
כדי לשלוח בקשות ל-API, אתם צריכים את כתובת ה-IP החיצונית של השירות. יכול להיות שיעברו כמה דקות אחרי שתפעילו את השירות במאגר לפני שכתובת ה-IP החיצונית תהיה מוכנה.
- צפייה בכתובת ה-IP החיצונית:
kubectl get ingress
- רושמים את הערך של
EXTERNAL-IP. משתמשים בכתובת ה-IP הזו כששולחים בקשה ל-API לדוגמה.
שליחת בקשה באמצעות כתובת IP
עכשיו, כשהשירות פועל באשכול הקונטיינרים ויש לכם את כתובת ה-IP החיצונית, אתם יכולים לשלוח בקשות אל ה-API.
יצירת מפתח API והגדרת משתנה סביבה
קוד לדוגמה דורש מפתח API. כדי לפשט את הבקשה, מגדירים משתנה סביבתי למפתח ה-API.
באותו פרויקט שבו השתמשתם עבור ה-API, יוצרים מפתח API בדף 'פרטי כניסה ל-API'. Google Cloud אם רוצים ליצור מפתח API בפרויקט אחר ב- Google Cloud , אפשר לעיין במאמר בנושא הפעלת API בפרויקט Google Cloud .
- לוחצים על Create credentials ואז על API key.
- מעתיקים את המפתח ללוח.
- לוחצים על Close.
- במחשב המקומי, מדביקים את מפתח ה-API כדי להקצות אותו למשתנה סביבה:
- ב-Linux או ב-macOS:
export ENDPOINTS_KEY=AIza... - ב-Windows PowerShell:
$Env:ENDPOINTS_KEY="AIza..."
- ב-Linux או ב-macOS:
שליחת הבקשה
Linux או Mac OS
משתמשים ב-curl כדי לשלוח בקשת HTTP באמצעות משתנה הסביבה ENDPOINTS_KEY שהגדרתם קודם. מחליפים את IP_ADDRESS בכתובת ה-IP החיצונית של המכונה.
curl --request POST \ --header "content-type:application/json" \ --data '{"message":"hello world"}' \ "http://IP_ADDRESS:80/echo?key=${ENDPOINTS_KEY}"
במהלך curl הקודמים:
- האפשרות
--dataמציינת את הנתונים שיישלחו ל-API. - האפשרות
--headerמציינת שהנתונים הם בפורמט JSON.
PowerShell
משתמשים ב-Invoke-WebRequest כדי לשלוח בקשת HTTP באמצעות משתנה הסביבה ENDPOINTS_KEY שהגדרתם קודם. מחליפים את IP_ADDRESS בכתובת ה-IP החיצונית של המופע.
(Invoke-WebRequest -Method POST -Body '{"message": "hello world"}' ` -Headers @{"content-type"="application/json"} ` -URI "http://IP_ADDRESS:80/echo?key=$Env:ENDPOINTS_KEY").Content
בדוגמה הקודמת, שתי השורות הראשונות מסתיימות בגרש הפוך. כשמדביקים את הדוגמה ב-PowerShell, צריך לוודא שאין רווח אחרי התווים '`'. מידע על האפשרויות שבהן נעשה שימוש בבקשת הדוגמה מופיע במאמר Invoke-WebRequest במסמכי התיעוד של מיקרוסופט.
אפליקציה של צד שלישי
אפשר להשתמש באפליקציה של צד שלישי, כמו התוסף Postman לדפדפן Chrome, כדי לשלוח את הבקשה:
- בוחרים באפשרות
POSTכפועל ה-HTTP. - בכותרת, בוחרים את המפתח
content-typeואת הערךapplication/json. - בגוף ההודעה, מזינים את הפרטים הבאים:
{"message":"hello world"} -
בכתובת ה-URL, משתמשים במפתח ה-API בפועל ולא במשתנה הסביבה.
לדוגמה:
http://192.0.2.0:80/echo?key=AIza...
ה-API מחזיר את ההודעה ששלחתם ומגיב עם:
{
"message": "hello world"
}
אם לא קיבלתם תגובה, אפשר להיעזר במאמר בנושא פתרון בעיות שקשורות לתגובות.
הרגע פרסתם ובדקתם API ב-Endpoints!
מעקב אחר פעילות ב-API
כדי לעקוב אחרי פעילות ב-API:
- מעיינים בתרשימי הפעילות של ה-API בדף Endpoints > Services.
יכול להיות שיחלפו כמה רגעים עד שהבקשה תשתקף בתרשימים. - מעיינים ביומני הבקשות של ה-API בדף Logs Explorer.
הגדרת DNS לנקודות קצה
מכיוון ששם השירות של Endpoints עבור ה-API נמצא בדומיין .endpoints.YOUR_PROJECT_ID.cloud.goog, אפשר להשתמש בו כשם דומיין מוגדר במלואו (FQDN) על ידי ביצוע שינוי קטן בהגדרות בקובץ openapi.yaml. כך תוכלו לשלוח בקשות ל-API לדוגמה באמצעות echo-api.endpoints.YOUR_PROJECT_ID.cloud.goog במקום כתובת ה-IP.
כדי להגדיר את ה-DNS של Endpoints:
OpenAPI 2.0
- פותחים את קובץ התצורה של OpenAPI,
openapi.yaml, ומוסיפים את המאפייןx-google-endpointsברמה העליונה של הקובץ (לא מוזח או מקונן), כמו שמוצג בקטע הקוד הבא:host: "echo-api.endpoints.YOUR_PROJECT_ID.cloud.goog" x-google-endpoints: - name: "echo-api.endpoints.YOUR_PROJECT_ID.cloud.goog" target: "IP_ADDRESS" - במאפיין
name, מחליפים את YOUR_PROJECT_ID במזהה הפרויקט. - במאפיין
target, מחליפים את IP_ADDRESS בכתובת ה-IP שבה השתמשתם כששלחתם בקשה ל-API לדוגמה. - פורסים את קובץ התצורה המעודכן של OpenAPI ל-Service Management:
gcloud endpoints services deploy openapi.yaml
OpenAPI 3.x
- פותחים את קובץ התצורה של OpenAPI,
openapi.yaml, ומוסיפים את המאפייןservers.urlברמה העליונה של הקובץ (לא מוזח או מקונן), כמו שמוצג בקטע הקוד הבא:servers: - url: "echo-api.endpoints.YOUR_PROJECT_ID.cloud.goog" x-google-endpoint: target: "IP_ADDRESS" - במאפיין
name, מחליפים את YOUR_PROJECT_ID במזהה הפרויקט. - במאפיין
target, מחליפים את IP_ADDRESS בכתובת ה-IP שבה השתמשתם כששלחתם בקשה ל-API לדוגמה. - פורסים את קובץ התצורה המעודכן של OpenAPI ל-Service Management:
gcloud endpoints services deploy openapi.yaml
לדוגמה, נניח שבקובץ openapi.yaml מוגדרות ההגדרות הבאות:
OpenAPI 2.0
host: "echo-api.endpoints.example-project-12345.cloud.goog" x-google-endpoints: - name: "echo-api.endpoints.example-project-12345.cloud.goog" target: "192.0.2.1"
OpenAPI 3.x
servers:
- url: "echo-api.endpoints.example-project-12345.cloud.goog"
x-google-endpoint:
target: "192.0.2.1"כשפורסים את הקובץ openapi.yaml באמצעות הפקודה gcloud שצוינה למעלה, Service Management יוצר רשומת DNS מסוג A, echo-api.endpoints.my-project-id.cloud.goog, שמפנה לכתובת ה-IP של היעד, 192.0.2.1. יכול להיות שיחלפו כמה דקות עד שהגדרת ה-DNS החדשה תתעדכן.
הגדרת SSL
פרטים נוספים על הגדרת DNS ו-SSL זמינים במאמר הפעלת SSL לנקודות קצה.
שליחת בקשה באמצעות FQDN
אחרי שמגדירים את רשומת ה-DNS עבור ה-API לדוגמה, שולחים אליו בקשה באמצעות ה-FQDN (מחליפים את YOUR_PROJECT_ID במזהה הפרויקט) ומשתנה הסביבה ENDPOINTS_KEY שהוגדר קודם:- ב-Linux או ב-macOS:
curl --request POST \ --header "content-type:application/json" \ --data '{"message":"hello world"}' \ "http://echo-api.endpoints.YOUR_PROJECT_ID.cloud.goog:80/echo?key=${ENDPOINTS_KEY}"
- ב-Windows PowerShell:
(Invoke-WebRequest -Method POST -Body '{"message": "hello world"}' -Headers @{"content-type"="application/json"} -URI "http://echo-api.endpoints.[YOUR_PROJECT_ID].cloud.goog:80/echo?key=$Env:ENDPOINTS_KEY").Content
הסרת המשאבים
כדי להימנע מחיובים בחשבון Google Cloud בגלל השימוש במשאבים שנעשה במסגרת המדריך הזה, אפשר למחוק את הפרויקט שמכיל את המשאבים, או להשאיר את הפרויקט ולמחוק את המשאבים בנפרד.
במאמר מחיקת API ומופעי API מוסבר איך להפסיק את השירותים שבהם נעשה שימוש במדריך הזה.