פריסת "Google Translate" אפליקציית Express.js ב-App Engine, Cloud Functions ו-Cloud Run

1. סקירה כללית

סדרת המדריכים הזו (מדריכים מעשיים בקצב אישי) נועדה לעזור למפתחים להבין את האפשרויות השונות שעומדות לרשותם במהלך פריסת האפליקציות שלהם. תלמדו איך להשתמש ב-Google Cloud Translation API באפליקציית אינטרנט פשוטה. אפשר להפעיל את האפליקציה באופן מקומי או לפרוס אותה בפלטפורמת מחשוב ללא שרת (Cloud Run) (App Engine, Cloud Functions או Cloud Run).

אתם תעשו את מדריך ה-JavaScript הזה באמצעות Node.js באמצעות מסגרת האינטרנט Express.js. תלמדו גם איך לגשת אל ממשקי ה-API של Google Cloud מפלטפורמות ללא שרת (serverless). כל הגרסאות של האפליקציה הזו מגיעות מ-"nebulous serverless" מאגר בקוד פתוח, שכולל גרסת Python של האפליקציה הזו ו-Codelabs עצמאיים. המאגר מארח גם אפליקציות דומות שמדגימות למפתחים איך לגשת לממשקי Google API שאינם של Cloud מפלטפורמות ללא שרת (serverless).

ה-Codelab הזה מתמקד בפריסת האפליקציה בפלטפורמות המודגשות שמפורטות למעלה.

כאן מוסבר איך

מה צריך להכין

  • פרויקט ב-Google Cloud עם חשבון פעיל לחיוב ב-Cloud
  • מסגרת אינטרנט שמותקנת להפעלה מקומית ( Flask למדריך Python או Express למדריך JavaScript/Node.js)
  • לפחות פלטפורמת מחשוב אחת ללא שרת (sserverless) שמופעלת לפריסות של Google Cloud
  • כישורי תכנות בסיסיים (Python או JavaScript/Node.js)
  • ידע בעבודה עם פקודות בסיסיות במערכת הפעלה

סקר

איך תשתמשו במדריך הזה?

לקרוא אותו ולבצע את התרגילים קריאה בלבד

מה דעתך על חוויית הפיתוח ב-Python או ב-Node.js?

מתחילים בינונית בקיאים

איזה דירוג מגיע לדעתך לחוויית השימוש שלך בשירותי Google Cloud?

מתחילים בינונית בקיאים

2. הגדרה ודרישות

הגדרת סביבה בקצב עצמאי

  1. נכנסים למסוף Google Cloud ויוצרים פרויקט חדש או עושים שימוש חוזר בפרויקט קיים. אם אין לכם עדיין חשבון Gmail או חשבון Google Workspace, עליכם ליצור חשבון.

96a9c957bc475304.png

b9a10ebdf5b5a448.png

a1e3c01a38fa61c2.png

  • Project name הוא השם המוצג של המשתתפים בפרויקט. זו מחרוזת תווים שלא נעשה בה שימוש ב-Google APIs, ואפשר לעדכן אותה בכל שלב.
  • Project ID חייב להיות ייחודי בכל הפרויקטים ב-Google Cloud ואי אפשר לשנות אותו (אי אפשר לשנות אותו אחרי שמגדירים אותו). מסוף Cloud יוצר מחרוזת ייחודית באופן אוטומטי; בדרך כלל לא מעניין אותך מה זה. ברוב ה-Codelabs תצטרכו להפנות אל מזהה הפרויקט (ובדרך כלל הוא מזוהה כ-PROJECT_ID), כך שאם הוא לא מוצא חן בעיניכם, תוכלו ליצור פרויקט אקראי אחר או לנסות בעצמכם ולבדוק אם הוא זמין. ואז המכשיר 'קפוא' לאחר יצירת הפרויקט.
  • יש ערך שלישי, Project Number, שחלק מממשקי ה-API משתמשים בו. מידע נוסף על כל שלושת הערכים האלה זמין במסמכי התיעוד.
  1. בשלב הבא צריך להפעיל את החיוב במסוף Cloud כדי להשתמש במשאבים או בממשקי API של Cloud. מעבר ב-Codelab הזה לא אמור לעלות הרבה, אם בכלל. כדי להשבית את המשאבים ולא לצבור חיובים מעבר למדריך הזה, פועלים לפי ההנחיות למחיקת המשאבים. בסוף ה-Codelab. משתמשים חדשים ב-Google Cloud זכאים להצטרף לתוכנית תקופת ניסיון בחינם בשווי 1,200 ש"ח.

3. הפעלת Translation API

בקטע הזה נסביר איך להפעיל את Google APIs באופן כללי. עבור האפליקציה לדוגמה שלנו, תפעיל את Cloud Translation API. צריך גם להפעיל את App Engine, Cloud Functions ו/או Cloud Run (וגם Cloud Artifact Registry), בהתאם לפלטפורמה שבה רוצים לפרוס את האפליקציה לדוגמה.

הפעלת Google APIs

מבוא

ללא קשר ל-Google API שבו אתם רוצים להשתמש באפליקציה, עליכם להפעיל אותם. את ממשקי ה-API אפשר להפעיל משורת הפקודה או ממסוף Cloud. תהליך ההפעלה של ממשקי API זהה, לכן לאחר שמפעילים ממשק API אחד, ניתן לבצע שינוי אחר באותו אופן.

אפשרות 1: gcloud ממשק שורת הפקודה (Cloud Shell או הסביבה המקומית)

אומנם התהליך של הפעלת ממשקי API ממסוף Cloud הוא נפוץ יותר, אבל יש מפתחים שמעדיפים לעשות הכול משורת הפקודה. לשם כך, צריך לחפש את 'שם השירות' של API. נראה שכתובת ה-URL היא: SERVICE_NAME.googleapis.com. תוכלו למצוא את המוצרים האלה בתרשים המוצרים הנתמכים או לשלוח שאילתה עליהם באופן פרוגרמטי באמצעות Google Discovery API.

כשכוללים את המידע הזה באמצעות Cloud Shell (או סביבת הפיתוח המקומית שבה מותקן כלי שורת הפקודה gcloud), אפשר להפעיל API באופן הבא:

gcloud services enable SERVICE_NAME.googleapis.com

דוגמה 1: הפעלה של Cloud Vision API

gcloud services enable vision.googleapis.com

דוגמה 2: הפעלת Google App Engine

gcloud services enable appengine.googleapis.com

דוגמה 3: הפעלה של מספר ממשקי API בבקשה אחת. לדוגמה, אם ב-Codelab הזה יש צופים שפורסים אפליקציה באמצעות Cloud Translation API ל-App Engine, Cloud Functions ו-Cloud Run, שורת הפקודה תהיה:

gcloud services enable appengine.googleapis.com cloudfunctions.googleapis.com artifactregistry.googleapis.com run.googleapis.com translate.googleapis.com

הפקודה הזו מפעילה את App Engine, Cloud Functions, Cloud Run ואת Cloud Translation API. בנוסף, היא מפעילה את Cloud Artifact Registry כי מערכת Cloud Build צריכה לרשום קובצי אימג' של קונטיינרים כדי לפרוס אותם ב-Cloud Run.

אפשרות 2: מסוף Cloud

אפשר להפעיל את Google APIs גם דרך מנהל ה-API. במסוף Cloud, נכנסים אל API Manager ובוחרים באפשרות Library.

fb0f1d315f122d4a.png

כדי לראות את התוצאות התואמות, מתחילים להזין שם של API בסרגל החיפוש:

2275786a24f8f204.png

בוחרים את ממשק ה-API שרוצים להפעיל ולוחצים על הלחצן Enable (הפעלה):

7960a6752a1da767.png

תהליך ההפעלה של כל ממשקי ה-API דומה, בלי קשר ל-Google API שבו רוצים להשתמש.

עלות

אפשר להשתמש בהרבה ממשקי API של Google ללא עמלות, אבל השימוש ברוב המוצרים וממשקי ה-API של Google Cloud כרוך בעלויות. כשמפעילים את Cloud APIs, יכול להיות שתתבקשו ליצור חשבון פעיל לחיוב. עם זאת, בחלק ממוצרי Google Cloud יש התכונה "חינם תמיד" [tier], שעליכם לחרוג ממנה כדי לצבור חיובי חיוב.

משתמשי GCP חדשים זכאים לתקופת ניסיון בחינם, נכון לעכשיו בשווי 300 $למשך 90 הימים הראשונים. בדרך כלל, Codelabs לא כרוך בחיובים רבים או בחיובים כלשהם, ולכן אנו ממליצים להמתין את תקופת הניסיון בחינם עד שתהיה מוכנים באמת להתנסות, במיוחד מפני שמדובר במבצע חד-פעמי. המכסות של תוכנית ללא תשלום לא פג תוקף והן חלות גם אם לא משתמשים בתקופת הניסיון בחינם.

המשתמשים צריכים לעיין במידע על התמחור של כל API לפני שהם מפעילים אותו (לדוגמה: דף תמחור של Cloud Vision API ), ובמיוחד לציין אם יש לו תוכנית ללא תשלום, ואם כן, מה שלה. כל עוד לא תצברו חיובים במסגרת המגבלות היומיות או החודשיות שצוינו, לא תצברו חיובים. יש הבדלים בתמחור ובתוכניות ללא תשלום בין ממשקי ה-API של קבוצות המוצרים ב-Google. דוגמאות:

מוצרים שונים של Google מחויבים בצורה שונה, לכן חשוב לעיין בתיעוד המתאים למידע הזה.

לוודא שהשירותים הרצויים מופעלים

מוודאים ש-Cloud Translation API ב-API Manager כפי שמוסבר למעלה. אם לא הפעלתם את הפלטפורמות ללא שרת (serverless) משורת הפקודה, אפשר לעשות זאת מכל מרכז בקרה במסוף Cloud: App Engine, Cloud Functions, Cloud Run.

אומנם מוצג מידע חזותי להפעלת ממשקי API ממסוף Cloud, אבל מהר יותר אפשר להשתמש בכלי gcloud, שלוקח שניות להפעיל את כל השירותים:

$ gcloud services enable appengine.googleapis.com \
cloudfunctions.googleapis.com artifactregistry.googleapis.com \
run.googleapis.com translate.googleapis.com
Operation "operations/acf.p2-xxxxxx035451-704918f2-5470-4436-9bdd-c3b204yyyyyy" finished successfully.

מידע נוסף על עלויות

הקטע שלמעלה בנושא עלויות כללי בכל ממשקי ה-API של Google. נרחיב על המדריך הזה. למרות שהמכסה החודשית שלה לא מופיעה ברמה הכוללת של "חינם תמיד" דף סיכום הרמה, בדף התמחור של Translate API, שבו מצוין שכל המשתמשים מקבלים מדי חודש כמות קבועה של תווים מתורגמים. אם היתרה נמוכה מהסף הזה, לא יצטברו חיובים מה-API. מידע נוסף על עלויות השימוש בפלטפורמות ללא שרת (serverless) של Google Cloud זמין בקטע 'עלויות' במאגר. פעולת הניקוי בסוף נסביר איך להפסיק את צבירת החיוב אחרי הסיום של ה-Codelab הזה.

4. קבלת קוד האפליקציה לדוגמה

הורדת קובץ ZIP או מאגר שכפול

  • מורידים את קובץ ה-ZIP או משכפלים את המאגר עם git clone https://github.com/googlecodelabs/cloud-nebulous-serverless.git
  • אם אין סביבת פיתוח מקומית ואתם רוצים לעשות את המדריך הזה ב-Cloud Shell, אפשר לשכפל את המאגר באמצעות אותה פקודת git clone.
  • אפשר לגשת לקובץ ה-ZIP גם דרך לחצן הקוד הירוק שלו, כפי שמוצג בצילום המסך הבא:

5cd6110c4414cf65.png

עכשיו, אחרי שיש לכם את הכול, כדאי ליצור עותק מלא של התיקייה כדי לבצע את המדריך הספציפי הזה, כי סביר להניח שיהיה צורך למחוק או לשנות את הקבצים. אם רוצים לבצע פריסה אחרת, אפשר להתחיל מחדש על ידי העתקה של הפריסה המקורית, כדי שלא תצטרכו לשכפל או להוריד אותה שוב.

5. אישור סביבת Node.js

כדי להגדיר את סביבת Node.js:

  1. יש לוודא שמותקנות הגרסאות העכשוויות של Node (>=10) ו-NPM (>=6)
  2. עוברים למקום שבו שכפולם את המאגר (או חילצתם את קובץ ה-ZIP) ואז עוברים לתיקייה cloud/nodejs
  3. אישור שהנוכחות של package.json קיימת ואז הרצה של npm install

עבור אפשרות 1 שלמעלה, אתם יכולים לבדוק אילו גרסאות יש לכם בשורת הפקודה:

$ node -v
v17.0.1
$ npm -v
8.1.0

6. סיור באפליקציה לדוגמה

האפליקציה לדוגמה היא נגזרת פשוטה של Google Translate שמבקשת מהמשתמשים להזין טקסט באנגלית ולקבל תרגום מקביל של הטקסט הזה בספרדית.

קובץ התצורה package.json מציין אילו חבילות של צד שלישי נדרשות לאפליקציה (שימו לב שגרסאות של חבילות עשויות להתעדכן מעבר למפורט כאן):

{
  "name": "cloud-nebulous-serverless-nodejs",
  "version": "0.0.1",
  "description": "Nebulous Serverless sample app",
  "main": "index.js",
  "scripts": {
    "start": "node index.js",
    "test": "mocha test/test_neb.js"
  },
  "author": "Google LLC",
  "license": "Apache-2.0",
  "dependencies": {
    "@google-cloud/translate": "^6.3.1",
    "express": "^4.17.1",
    "nunjucks": "^3.2.3"
  },
  "devDependencies": {
    "mocha": "^9.1.3",
    "supertest": "^6.1.6"
  }
}

עכשיו צריך לפתוח את הקובץ index.js כדי שנוכל לראות איך זה עובד. אם משמיטים את השורות של הערות לגבי רישוי, נראה כך בחלק העליון והתחתון:

const express = require('express');
const nunjucks = require('nunjucks');
const {TranslationServiceClient} = require('@google-cloud/translate');

const app = express();
app.use(express.urlencoded({extended: true}));
nunjucks.configure('templates', {autoescape: true, express: app});
const TRANSLATE = new TranslationServiceClient();

const PORT = process.env.PORT || 8080;
const SOURCE = ['en', 'English'];
const TARGET = ['es', 'Spanish'];
let parent;
TRANSLATE.getProjectId().then(result => {
    parent = `projects/${result}`;
});


if (!process.env.FUNCTION_TARGET) {
    app.listen(PORT, () =>
        console.log(`Listening on port ${PORT}`)
    );
}

# . . . [translate() function definition] . . .

app.all('/', translate);
module.exports = {
    app
};
  1. ממשקי ה-require כוללים פונקציונליות של framework ויצירת תבניות, ואת ספריית הלקוח של Cloud Translation API.
  2. המשתנים הגלובליים מייצגים את אפליקציית האינטרנט, את מזהה הפרויקט ב-Cloud, את לקוח ה-Translation API ואת 'נתיב המיקום' ההורה. לקריאות ל-Translate API ולSOURCE ולTARGET. במקרה הזה השפה היא אנגלית (en) וספרדית (es), אבל אפשר לשנות את הערכים האלה לקודים של שפות אחרות שנתמכות על ידי Cloud Translation API.
  3. הרכיב הראשון בכל צמד (SOURCE ו-TARGET) הוא קוד השפה, והשני הוא שם השפה (והוא משמש למטרות תצוגה בלבד כי הוא לא רלוונטי ל-API).
  4. השורות כמה בחלק התחתון הן לשלוח את כל בקשות ה-HTTP אל translate() ולאחר מכן לייצא את אובייקט האפליקציה app.

לבסוף, באמצע index.js נמצאת הלב של האפליקציה, הפונקציה translate():

async function translate(req, rsp) {
    let text = null;
    let translated = null;
    if (req.method === 'POST') {
        text = req.body.text.trim();
        if (text) {
            const data = {
                contents: [text],
                parent: parent,
                targetLanguageCode: TARGET[0]
            };
            const [response] = await TRANSLATE.translateText(data);
            translated = response.translations[0].translatedText;
        }
    }
    const context = {
        orig:  {text: text, lc: SOURCE},
        trans: {text: translated, lc: TARGET}
    };
    rsp.render('index.html', context);
}

הפונקציה הראשית מבצעת את העבודה הקשה על קלט של משתמשים, וקריאה ל-Translation API כדי לבצע את העבודה הקשה. נסביר קצת:

  1. מאפסים את המשתנים הבסיסיים של הטופס. מדובר בעיקר בבקשות GET כי בבקשות POST יהיו נתונים שיחליפו אותן.
  2. אם מדובר ב-POST, יש לשלוף את הטקסט לתרגום, ואם הוא לא ריק, צריך ליצור מבנה JSON שמייצג את דרישת המטא-נתונים של ה-API. לאחר מכן קוראים ל-API לקבלת שירות.
  3. לא עברנו ב-SOURCE[0] ל-API למקור ספציפי באנגלית. אם לא כוללים את שפת המקור, מבקשים מה-API לזהות אוטומטית את שפת המקור (ראו sourceLanguageCode במסמכים).
  4. בכל מקרה, צריך לעצב את התוצאות בפועל (POST) או ללא נתונים (GET) בהקשר של התבנית ולעיבוד שלה.

החלק החזותי של האפליקציה נמצא בקובץ התבנית index.html. מוצגות כל התוצאות שתורגמו בעבר (אם זה ריק) ואחריו הטופס שמבקש לתרגום:

<!doctype html>
<html><head><title>My Google Translate 1990s</title><body>
<style>
body {
  font-family: Verdana, Helvetica, sans-serif;
  background-color: #DDDDDD;
}
</style>
<h2>My Google Translate (1990s edition)</h2>

{% if trans['text'] %}
    <h4>Previous translation</h4>
    <li><b>Original</b>:   {{ orig['text'] }}  (<i>{{ orig['lc'][0] }}</i>)</li>
    <li><b>Translated</b>: {{ trans['text'] }} (<i>{{ trans['lc'][0] }}</i>)</li>
{% endif %}

<h4>Enter <i>{{ orig['lc'][1] }}</i> text to translate to <i>{{ trans['lc'][1] }}</i>:</h4>
<form method="POST"><input name="text"><input type="submit"></form>
</body></html>

עד סוף המדריך, תוכלו לבחור אחת מארבע האפשרויות לפריסה ולהפעלה של האפליקציה הזו. כל הפריסות הן אופציונליות, כלומר אפשר לבצע חלק מהן או את כולן.

  1. הפעלה מקומית של השירות
  2. פריסה ל-App Engine (סביבה סטנדרטית)
  3. פריסה ב-Cloud Functions
  4. פריסה ב-Cloud Run

7. אפשרות 1: הפעלה מקומית של השירות

החלק הזה ב-Codelab מיועד להרצה מקומית בלבד. אם אתם פורסים רק בענן, עברו לקטע הבא.

כדי להריץ את האפליקציה לדוגמה באופן מקומי, יש שלושה שלבים ייחודיים:

  1. יצירה של חשבון שירות
  2. יצירת זוג מפתחות ציבורי/פרטי של חשבון שירות
  3. הורדת קובץ פרטי כניסה וחבילה עם קוד האפליקציה
  4. הפעלת השירות

הסבר על חשבונות שירות

חשבונות שירות הם מנגנון האבטחה שמאפשר גישה ל-Google APIs לאפליקציות מבוססות-ענן בזמן גישה לנתונים שלא שייכים למשתמשים אנושיים. במהלך הפריסה ב-Cloud, כדי לקצר את זמן ההרצה של משתמשים חדשים לענן, כל פלטפורמות המחשוב של Google Cloud (ללא שרת או אחרות) מספקות חשבונות שירות שמוגדרים כברירת מחדל.

חשבונות שירות שמוגדרים כברירת מחדל כוללים קבוצה רחבה של הרשאות ל"ביצוע קלפים", אבל כשמתכוננים להשקה של שירות ייצור, מומלץ מאוד שהמשתמשים יפעלו בהתאם לשיטה המומלצת של 'הרשאות מינימליות', אלא ליצור חשבונות שירות בניהול המשתמשים עם מספיק הרשאות כדי שהאפליקציה תפעל כראוי. בכל מקרה, אין חשבונות שירות שמוגדרים כברירת מחדל לפריסות מקומיות. לכן צריך ליצור חשבון שירות ומפתח של חשבון שירות (למעשה, זוג מפתחות ציבורי/פרטי) ולהגדיר את פרטי הכניסה האלה לזמינים לקוד של האפליקציה.

יצירת התאמת מפתחות של חשבונות שירות והורדה של קובץ פרטי כניסה

פועלים לפי ההוראות שמופיעות בדף הזה כדי ליצור חשבון שירות וזוג מפתחות ציבורי/פרטי להרצה מקומית. כשיוצרים את המפתח לחשבון השירות, מוצגת בקשה לתת את ההרשאות הרצויות. כדי שתהיה לך גישה ל-API, צריך לבחור באפשרות roles/cloudtranslate.user.

אחרי שתיצרו את זוג המפתחות, תוצג בקשה להוריד את קובץ המפתח של חשבונות השירות. קוראים לו credentials.json ומעבירים אותו לתיקייה ברמה העליונה של האפליקציה. עכשיו צריך להנחות את Cloud SDK להשתמש בפרטי הכניסה האלה: מגדירים את משתנה הסביבה GOOGLE_APPLICATION_CREDENTIALS כך שיצביע על הקובץ הזה. מידע נוסף על התהליך הזה זמין גם בדף הזה, שעוסק בשימוש בחשבונות שירות.

הפעלת השירות

כשתהיו מוכנים להתקדם, הפעילו את שרת Express באופן מקומי באמצעות הפקודה הבאה:

$ npm start

> cloud-nebulous-serverless-nodejs@0.0.1 start
> node index.js

Listening on port 8080

נכנסים לדפדפן האינטרנט כדי להתחבר אליו בכתובת localhost:8080. אתם אמורים לראות משהו כזה:

adc6665b7ae13c40.png

כדאי לתרגם משהו כדי לראות שהוא עובד!

fc154326080bf14f.png

כשתהיו מרוצים ממנו, תוכלו לצאת מהשרת באמצעות ^C (control-C) ולצאת ממנו. הפעלת פריסה מקומית. יש גם חדשות טובות: הרבה יותר קל לפרוס בענן.

פתרון בעיות

האם מופיעה הודעת שגיאה כזו כשמבקשים תרגום?

node:fs:2486
      handleErrorFromBinding(ctx);
      ^

Error: The file at credentials.json does not exist, or it is not a file. ENOENT: no such file or directory, lstat '/tmp/nodejs/credentials.json'
    . . .

פתרון: השגיאה הזו מופיעה אם לא השלמתם את היצירה של חשבון שירות והורדתם את הקובץ של זוג המפתחות הציבורי/הפרטי credentials.json. צריך לחזור אל " אפשרות 1: הפעלת השירות באופן מקומי" ולהשלים את התהליך הזה, מתקינים cred בתיקייה הראשית לפני שממשיכים.

8. אפשרות 2: פריסה ב-App Engine (סביבה סטנדרטית)

הקטע הזה ב-Codelab מיועד רק לפריסה ב-Node App Engine. אם זה לא מעניין אתכם, תעברו לקטע הבא.

הפריסה הזו משתמשת בקובץ התצורה app.yaml שמציין ל-App Engine באיזה זמן ריצה להשתמש עם שורה אחת:

runtime: nodejs16

הקובץ app.yaml לא נמצא בשימוש של Cloud Functions ולא של Cloud Run. אם אתם לא מתכוונים להשתמש ב-App Engine, יכול להיות שהקובץ הזה יימחק בבטחה. כשתהיו מוכנים לפרוס את App Engine, מריצים את הפקודה הבאה:

$ gcloud app deploy

אחרי שבוחרים אזור, הפלט של gcloud app deploy יהיה הרבה פחות מפורט והוא אמור להיראות כך:

Services to deploy:

descriptor:                  [/private/tmp/nodejs/app.yaml]
source:                      [/private/tmp/nodejs]
target project:              [PROJECT_ID]
target service:              [default]
target version:              [2021...]
target url:                  [https://PROJECT_ID.REG_ABBR.appspot.com]
target service account:      [App Engine default service account]


Do you want to continue (Y/n)?

Beginning deployment of service [default]...
╔════════════════════════════════════════════════════════════╗
╠═ Uploading 2 files to Google Cloud Storage                          ═╣
╚════════════════════════════════════════════════════════════╝
File upload done.
Updating service [default]...⠏WARNING: *** Improve build performance by generating and committing package-lock.json.

Updating service [default]...done.
Setting traffic split for service [default]...done.
Deployed service [default] to [https://PROJECT_ID.REG_ABBR.appspot.com]

You can stream logs from the command line by running:
  $ gcloud app logs tail -s default

To view your application in the web browser run:
  $ gcloud app browse

To take a quick anonymous survey, run:
  $ gcloud survey

עכשיו, אחרי שהאפליקציה זמינה ברחבי העולם, אתם אמורים להיות מסוגלים להגיע אליה בכתובת ה-URL שמכילה את מזהה הפרויקט. בנוסף, הפלט אמור להיראות כך שדומה לגרסת Express המקומית, אבל חשוב לדעת שהיא פועלת בענן וזמינה בכל העולם:

da28f951c33a2c3d.png

אם תשלחו בקשה, תראו שהיא פועלת באותו אופן כמו כל הפריסות האחרות.

9. אפשרות 3: פריסה ב-Cloud Functions

החלק הזה ב-Codelab מיועד רק לפריסה ב-Node Cloud Functions. אם זה לא מעניין אתכם, תעברו לקטע הבא.

אין קובצי תצורה עם Cloud Functions, ולכן כשתהיו מוכנים לפרוס את Cloud Functions, מריצים את הפקודה הבאה:

$ gcloud functions deploy translate \
  --runtime nodejs16 \
  --entry-point app \
  --trigger-http \
  --region REGION \
  --allow-unauthenticated

לפרויקט GCP יכול להיות REGION ברירת מחדל, אבל אפשר להשתמש בדגל --region כדי לפרוס את הפונקציה באזור ספציפי. שירות Cloud Functions לא מציג לכם הצעות למוצרים אחרים של Cloud. ללא קשר לאזור שבוחרים, הפלט של gcloud functions deploy אמור להיראות כך:

Deploying function (may take a while - up to 2 minutes)...⠛
For Cloud Build Logs, visit: https://console.cloud.google.com/cloud-build/builds;region=REGION/15ac7fc1-731d-4f3b-bc15-8f2614xxxxxx?project=062269xxxxxx
Deploying function (may take a while - up to 2 minutes)...done.
availableMemoryMb: 256
buildId: aaf7e0cd-fbbd-4624-abeb-3e7437xxxxxx
buildName: projects/062269xxxxxx/locations/REGION/builds/aaf7e0cd-fbbd-4624-abeb-3e7437xxxxxx
entryPoint: app
httpsTrigger:
  securityLevel: SECURE_OPTIONAL
  url: https://REGION-PROJECT_ID.cloudfunctions.net/translate
ingressSettings: ALLOW_ALL
labels:
  deployment-tool: cli-gcloud
name: projects/PROJECT_ID/locations/REGION/functions/translate
runtime: nodejs16
serviceAccountEmail: PROJECT_ID@appspot.gserviceaccount.com
sourceUploadUrl: https://storage.googleapis.com/gcf-upload-REGION-01de94c2-6eb4-4c49-aaff-09276cdb7ae9/a1db9f2d-3511-414b-aeeb-de6042xxxxxx.zip
status: ACTIVE
timeout: 60s
updateTime: '2021...'
versionId: '...'

עכשיו, שהאפליקציה שלך זמינה ברחבי העולם, אמורה להיות לך אפשרות להגיע אליה בכתובת ה-URL שמכילה את מזהה הפרויקט, כפי שמוצג בפלט הפריסה (מתחת ל-"httpsTrigger/url"). כתובת ה-URL אמורה להיראות בערך כך: https://REGION-PROJECT_ID.cloudfunctions.net/translate, שמשתנה בהתאם לאזור שבחרתם ובהתאם למזהה הפרויקט ב-Cloud.

518f1c3165f2096d.png

10. אפשרות 4: פריסה ב-Cloud Run

הקטע הזה ב-Codelab מיועד רק לפריסה ב-Cloud Run. אם זה לא מעניין אתכם, תעברו לקטע הבא.

אין קובצי תצורה ב-Cloud Run, כך שכאשר תהיו מוכנים לפרוס ב-Cloud Run, פעלו לפי ההוראות הבאות.

עכשיו אתם מוכנים לפרוס את שירות התרגום ב-Cloud Run על ידי הרצת הפקודה הבאה:

$ gcloud run deploy translate --source . --allow-unauthenticated --platform managed

הפלט אמור להיראות כך, ויש בו כמה הנחיות לשלבים הבאים:

Please specify a region:
 [1] asia-east1
 [2] asia-east2
. . . (other regions) . . .
 [28] us-west4
 [29] cancel
Please enter your numeric choice:  REGION_CHOICE

To make this the default region, run `gcloud config set run/region REGION`.

Deploying from source requires an Artifact Registry repository to
store build artifacts. A repository named [cloud-run-source-deploy] in
 region [REGION] will be created.

Do you want to continue (Y/n)?

This command is equivalent to running "gcloud builds submit --pack image=[IMAGE] ." and "gcloud run deploy translate --image [IMAGE]"

Building . . . and deploying container to Cloud Run service [translate] in project [PROJECT_ID] region [REGION]
✓ Building and deploying... Done.
  ✓ Creating Container Repository...
  ✓ Uploading sources...
  ✓ Building Container... Logs are available at [https://console.cloud.google.com/cloud-build/builds/60e1b
  9bb-b991-4b4e-8d8a-HASH?project=PROJECT_NUMBER].
  ✓ Creating Revision...
  ✓ Routing traffic...
  ✓ Setting IAM Policy...
Done.
Service [translate] revision [translate-00001-xyz] has been deployed and is serving 100 percent of traffic.
Service URL: https://SVC_NAME-HASH-REG_ABBR.a.run.app

Cloud Buildpacks את האפליקציות שלכם ל-Cloud Run בדומה לאופן שבו אתם מריצים את האפליקציה באופן מקומי. למשתמשי Node.js, הוא מריץ את npm install ואת npm start. ב-Python, היא מריצה pip install -r requirements.txt ומפעילה את האפליקציה לפי ההוראות בProcfile. (הדרישה הזו חלה גם על כל שאר השפות שנתמכות ב-Cloud Buildpacks). האפליקציה תהיה מוכנה להפעלה אחרי שתהליך ה-build יסתיים.

בשלב הבא האפליקציה נפרסת באופן אזורי, אבל היא זמינה בכל העולם, וניתן להגיע אליה בכתובת ה-URL שמכילה את מזהה הפרויקט, כפי שמוצג בפלט הפריסה (בקטע 'Service URL:')

169f6edf5f7d2068.png

כדאי לתרגם משהו כדי לראות שהוא עובד!

31554e71cb80f1b4.png

11. סיכום

מעולה! למדתם איך להפעיל את Cloud Translation API ולהשתמש בו, לקבל את פרטי הכניסה הנדרשים ולפרוס אפליקציית אינטרנט פשוטה ל-Express באופן מקומי, ל-App Engine, ל-Cloud Functions ו/או ל-Cloud Run. אתם יכולים לעיין בתיקיית המאגר כדי לקבל מידע נוסף או לגשת לגרסאות אחרות של האפליקציה הזו וגם ל-Codelabs אחרים.

הסרת המשאבים

Cloud Translation API מאפשר לכם לבצע כמות קבועה של תווים מתורגמים בכל חודש בחינם. ב-App Engine יש גם מכסה בחינם, וכך גם ב-Cloud Functions וב-Cloud Run. במקרה של חריגה מהתנאים האלה, תצברו חיובים. אם אתם מתכננים להמשיך ל-Codelab הבא, אין צורך להשבית את האפליקציה.

עם זאת, אם אתם עדיין לא מוכנים לעבור למדריך הבא או שאתם חוששים שהאינטרנט מגלה את האפליקציה שפרסתם עכשיו, השביתו את אפליקציית App Engine, מחקו את הפונקציה של Cloud Functions או השביתו את שירות Cloud Run כדי למנוע חיובים. כשתהיו מוכנים לעבור ל-Codelab הבא, תוכלו להפעיל אותו מחדש. מצד שני, אם אתם לא מתכוונים להמשיך עם האפליקציה הזו או עם Codelabs אחרים ואתם רוצים למחוק את הכול לגמרי, תוכלו להשבית את הפרויקט.

בנוסף, פריסה בפלטפורמת מחשוב ללא שרת (serverless) של Google Cloud כרוכה בעלויות קטנות של פיתוח ואחסון. ל-Cloud Build יש מכסה משלה בחינם, כמו גם ל-Cloud Storage. כדי לספק שקיפות רבה יותר, Cloud Build יוצר את קובץ האימג' של האפליקציה שנשמר ב-Cloud Container Registry או ב-Artifact Registry – היורש. נפח האחסון של התמונה הזו מנצל חלק מהמכסה הזו, כמו גם תעבורת נתונים יוצאת (egress) ברשת כשמעבירים את התמונה לשירות. עם זאת, ייתכן שאתם גרים באזור שאין בו תוכנית ללא תשלום כזה, לכן כדאי שתהיו מודעים לשימוש שלכם בנפח האחסון כדי למזער את העלויות הפוטנציאליות.

12. מקורות מידע נוספים

בסעיפים הבאים אפשר למצוא חומרי קריאה נוספים ותרגילים מומלצים להעשרת הידע שצברתם מהשלמת המדריך הזה.

מחקר נוסף

כבר יש לכם ניסיון בשימוש ב-Translation API, כדאי לכם לבצע עוד כמה תרגילים כדי לשפר את המיומנויות שלכם. כדי להמשיך את תוכנית הלימודים, צריך לשנות את האפליקציה לדוגמה כך:

  1. צריך להשלים את כל המהדורות האחרות של ה-Codelab הזה להרצה באופן מקומי או לפריסה בפלטפורמות מחשוב ללא שרת (serverless) של Google Cloud (אפשר לעיין במאגר README).
  2. צריך להשלים את המדריך הזה בשפת תכנות אחרת.
  3. צריך לשנות את האפליקציה כך שתתמוך בשפות מקור או בשפות יעד שונות.
  4. כדי שתהיה לך אפשרות לתרגם טקסט ליותר משפה אחת, צריך לשדרג את האפליקציה הזו. לשנות את קובץ התבנית כך שיכלול תפריט נפתח של שפות יעד נתמכות.

מידע נוסף

Google App Engine

פונקציות Google Cloud

Google Cloud Run

Google Cloud Buildpacks, Container Registry, Artifact Registry

תרגום של Google Cloud וערכת למידת מכונה של Google

מוצרים או דפים אחרים של Google Cloud

רישיון

המדריך הזה מורשה במסגרת רישיון כללי של Creative Commons Attribution 2.0, בעוד שקוד המקור במאגר הוא ברישיון Apache 2.