یک "Google Translate" برنامه Express.js در App Engine، Cloud Functions و Cloud Run

۱. مرور کلی

این مجموعه از آزمایشگاه‌های کد (آموزش‌های خودآموز و عملی) با هدف کمک به توسعه‌دهندگان برای درک گزینه‌های مختلفی که هنگام استقرار برنامه‌های خود دارند، ارائه شده است. شما یاد خواهید گرفت که چگونه از API ترجمه ابری گوگل (Google Cloud Translation API) در یک برنامه وب ساده استفاده کنید. این برنامه می‌تواند به صورت محلی اجرا شود یا در یک پلتفرم محاسباتی بدون سرور ابری ( App Engine، Cloud Functions یا Cloud Run ) مستقر شود.

شما این آموزش جاوا اسکریپت را با Node.js و با استفاده از چارچوب وب Express.js انجام خواهید داد. همچنین یاد خواهید گرفت که چگونه از پلتفرم‌های بدون سرور ما به APIهای Google Cloud دسترسی پیدا کنید. تمام نسخه‌های این برنامه از مخزن متن‌باز "nebulous serverless" هستند که شامل نسخه پایتون این برنامه و آزمایشگاه‌های کد مستقل است. این مخزن همچنین میزبان برنامه‌های مشابهی است که به توسعه‌دهندگان نشان می‌دهد چگونه از پلتفرم‌های بدون سرور ما به APIهای Google غیر ابری دسترسی پیدا کنند.

این آزمایشگاه کد بر روی استقرار این برنامه در پلتفرم(های) بولد شده بالا تمرکز دارد.

یاد خواهید گرفت که چگونه

آنچه نیاز دارید

  • یک پروژه Google Cloud با یک حساب Cloud Billing فعال
  • یک چارچوب وب نصب شده برای اجرا به صورت محلی ( فلسک برای کسانی که آموزش پایتون را انجام می‌دهند یا اکسپرس برای کسانی که آموزش جاوا اسکریپت/نودو.جی‌اس را انجام می‌دهند)
  • حداقل یک پلتفرم محاسباتی بدون محدودیت برای استقرارهای Google Cloud فعال باشد
  • مهارت‌های برنامه‌نویسی پایه (پایتون یا جاوا اسکریپت/Node.js)
  • آشنایی با دستورات اولیه سیستم عامل

نظرسنجی

چگونه از این آموزش استفاده خواهید کرد؟

آن را بخوانید و تمرین‌ها را انجام دهید فقط بخونش.

تجربه خود در توسعه با پایتون یا Node.js را چگونه ارزیابی می‌کنید؟

تازه کار متوسط ماهر

تجربه خود را در استفاده از خدمات ابری گوگل چگونه ارزیابی می‌کنید؟

تازه کار متوسط ماهر

۲. تنظیمات و الزامات

تنظیم محیط خودتنظیم

  1. وارد کنسول گوگل کلود شوید و یک پروژه جدید ایجاد کنید یا از یک پروژه موجود دوباره استفاده کنید. اگر از قبل حساب جیمیل یا گوگل ورک اسپیس ندارید، باید یکی ایجاد کنید .

96a9c957bc475304.png

b9a10ebdf5b5a448.png

a1e3c01a38fa61c2.png

  • نام پروژه ، نام نمایشی برای شرکت‌کنندگان این پروژه است. این یک رشته کاراکتری است که توسط APIهای گوگل استفاده نمی‌شود و شما می‌توانید آن را در هر زمانی به‌روزرسانی کنید.
  • شناسه پروژه باید در تمام پروژه‌های گوگل کلود منحصر به فرد باشد و تغییرناپذیر است (پس از تنظیم، قابل تغییر نیست). کنسول کلود به طور خودکار یک رشته منحصر به فرد تولید می‌کند؛ معمولاً برای شما مهم نیست که چیست. در اکثر آزمایشگاه‌های کد، باید به شناسه پروژه ارجاع دهید (و معمولاً با نام PROJECT_ID شناخته می‌شود)، بنابراین اگر آن را دوست ندارید، یک شناسه تصادفی دیگر ایجاد کنید، یا می‌توانید شناسه خودتان را امتحان کنید و ببینید آیا در دسترس است یا خیر. سپس پس از ایجاد پروژه، آن "منجمد" می‌شود.
  • یک مقدار سوم هم وجود دارد، شماره پروژه که برخی از APIها از آن استفاده می‌کنند. برای اطلاعات بیشتر در مورد هر سه این مقادیر به مستندات مراجعه کنید.
  1. در مرحله بعد، برای استفاده از منابع/APIهای ابری، باید پرداخت صورتحساب را در کنسول ابری فعال کنید . اجرای این آزمایشگاه کد، اگر اصلاً هزینه‌ای نداشته باشد، هزینه زیادی نخواهد داشت. برای خاموش کردن منابع به طوری که پس از این آموزش متحمل پرداخت صورتحساب نشوید، دستورالعمل‌های «پاکسازی» موجود در انتهای آزمایشگاه کد را دنبال کنید. کاربران جدید Google Cloud واجد شرایط برنامه آزمایشی رایگان ۳۰۰ دلاری هستند.

۳. فعال کردن API ترجمه

در این بخش، نحوه فعال کردن APIهای گوگل به طور کلی را خواهید آموخت. برای برنامه نمونه ما، API ترجمه ابری را فعال خواهید کرد. همچنین بسته به پلتفرم (پلتفرم‌هایی) که می‌خواهید برنامه نمونه را روی آنها مستقر کنید، App Engine، Cloud Functions و/یا Cloud Run (به‌علاوه Cloud Artifact Registry) را فعال خواهید کرد.

فعال کردن API های گوگل

مقدمه

صرف نظر از اینکه می‌خواهید از کدام API گوگل در برنامه خود استفاده کنید، باید آنها را فعال کنید . APIها را می‌توان از خط فرمان یا از کنسول Cloud فعال کرد. فرآیند فعال‌سازی APIها یکسان است، بنابراین پس از فعال کردن یک API، می‌توانید API دیگری را نیز به همین روش فعال کنید.

گزینه ۱: رابط خط فرمان gcloud (Cloud Shell یا محیط محلی)

اگرچه فعال کردن APIها از طریق کنسول ابری رایج‌تر است، برخی از توسعه‌دهندگان ترجیح می‌دهند همه کارها را از طریق خط فرمان انجام دهند. برای انجام این کار، باید «نام سرویس» یک API را جستجو کنید. این نام شبیه یک URL است: SERVICE_NAME .googleapis.com . می‌توانید این موارد را در نمودار محصولات پشتیبانی‌شده پیدا کنید، یا می‌توانید با استفاده از API کشف گوگل، به صورت برنامه‌نویسی شده آنها را جستجو کنید.

با استفاده از این اطلاعات، با استفاده از Cloud Shell (یا محیط توسعه محلی خود که ابزار خط فرمان gcloud روی آن نصب شده است )، می‌توانید یک API را به صورت زیر فعال کنید:

gcloud services enable SERVICE_NAME.googleapis.com

مثال ۱: فعال کردن API مربوط به Cloud Vision

gcloud services enable vision.googleapis.com

مثال ۲: فعال کردن موتور برنامه گوگل

gcloud services enable appengine.googleapis.com

مثال ۳: فعال کردن چندین 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 مستقر شوند.

گزینه ۲: کنسول ابری

همچنین می‌توانید APIهای گوگل را در API Manager فعال کنید. از Cloud Console، به API Manager بروید و Library را انتخاب کنید.

fb0f1d315f122d4a.png

برای مشاهده نتایج منطبق، نام یک API را در نوار جستجو وارد کنید:

۲۲۷۵۷۸۶a۲۴f۸f۲۰۴.png

API مورد نظر برای فعال‌سازی را انتخاب کنید و روی دکمه‌ی فعال‌سازی کلیک کنید:

7960a6752a1da767.png

فرآیند فعال‌سازی همه APIها مشابه است، صرف نظر از اینکه از کدام API گوگل می‌خواهید استفاده کنید.

هزینه

بسیاری از APIهای گوگل را می‌توان بدون هزینه استفاده کرد، با این حال، استفاده از اکثر محصولات و APIهای گوگل کلود هزینه‌هایی دارد. هنگام فعال کردن APIهای ابری، ممکن است از شما یک حساب صورتحساب فعال خواسته شود. با این حال، برخی از محصولات گوگل کلود دارای یک سطح «همیشه رایگان» هستند که برای متحمل شدن هزینه‌های صورتحساب، باید از آن سطح فراتر بروید.

کاربران جدید GCP واجد شرایط دوره آزمایشی رایگان هستند که در حال حاضر برای ۹۰ روز اول ۳۰۰ دلار آمریکا هزینه دارد. Codelabs معمولاً هزینه زیادی یا هیچ هزینه‌ای ندارد، بنابراین پیشنهاد می‌کنیم تا زمانی که واقعاً آماده امتحان کردن آن نیستید، دوره آزمایشی رایگان را به تعویق بیندازید، به خصوص که این یک پیشنهاد یک‌باره است. سهمیه‌های سطح رایگان منقضی نمی‌شوند و صرف نظر از اینکه از دوره آزمایشی رایگان استفاده کنید یا نه، اعمال می‌شوند.

کاربران باید قبل از فعال کردن هر API، به اطلاعات قیمت آن مراجعه کنند (مثلاً: صفحه قیمت‌گذاری Cloud Vision API )، به خصوص توجه داشته باشند که آیا سطح رایگان دارد یا خیر، و اگر دارد، چیست. تا زمانی که در مجموع در محدوده مشخص شده روزانه یا ماهانه باقی بمانید، نباید هیچ هزینه‌ای متحمل شوید. قیمت‌گذاری و سطوح رایگان بین APIهای گروه‌های محصولات گوگل متفاوت است. مثال‌ها:

محصولات مختلف گوگل به صورت متفاوتی صورتحساب می‌شوند، بنابراین حتماً برای این اطلاعات به اسناد مربوطه مراجعه کنید.

اطمینان از فعال بودن سرویس‌های مورد نظر

طبق دستورالعمل بالا، از فعال بودن API ترجمه ابری (Cloud Translation API) در API Manager اطمینان حاصل کنید. اگر پلتفرم‌های بدون سرور را از خط فرمان فعال نکرده‌اید، می‌توانید این کار را از هر یک از داشبوردهای مربوطه در Cloud Console انجام دهید: App Engine ، Cloud Functions ، Cloud Run .

اگرچه فعال کردن APIها از کنسول ابری از نظر بصری آموزنده است، اما استفاده از ابزار 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های گوگل عمومی است. بیایید جزئیات بیشتری را برای این آموزش پوشش دهیم. اگرچه سهمیه ماهانه آن در صفحه خلاصه کلی سطح "همیشه رایگان" ذکر نشده است، صفحه قیمت‌گذاری API ترجمه بیان می‌کند که همه کاربران ماهانه مقدار ثابتی از کاراکترهای ترجمه شده را دریافت می‌کنند. اگر کمتر از آن آستانه باقی بمانید، نباید هیچ هزینه‌ای از API متحمل شوید. برای اطلاعات بیشتر در مورد هزینه‌های استفاده از پلتفرم‌های بدون سرور Google Cloud، به بخش هزینه‌ها در مخزن مراجعه کنید. بخش "پاکسازی" در انتها، نحوه توقف پرداخت صورتحساب پس از اتمام این آزمایشگاه کد را مورد بحث قرار خواهد داد.

۴. کد نمونه برنامه را دریافت کنید

دانلود فایل زیپ یا کپی مخزن

  • فایل زیپ را دانلود کنید یا با git clone https://github.com/googlecodelabs/cloud-nebulous-serverless.git clone از مخزن کپی بگیرید: https://github.com/googlecodelabs/cloud-nebulous-serverless.git
  • اگر محیط توسعه محلی ندارید و می‌خواهید این آموزش را در Cloud Shell انجام دهید، می‌توانید مخزن را با همان دستور git clone در آنجا کلون کنید.
  • همچنین می‌توانید همانطور که در تصویر زیر نشان داده شده است، از طریق دکمه سبز رنگ Code به فایل ZIP دسترسی پیدا کنید:

5cd6110c4414cf65.png

حالا که همه چیز را دارید، برای انجام این آموزش خاص، یک کپی کامل از پوشه ایجاد کنید، زیرا احتمالاً شامل حذف یا تغییر فایل‌ها خواهد بود. اگر می‌خواهید پیاده‌سازی متفاوتی انجام دهید، می‌توانید با کپی کردن فایل اصلی از ابتدا شروع کنید تا مجبور نباشید دوباره آن را کلون یا دانلود کنید.

۵. محیط Node.js را تأیید کنید

برای راه‌اندازی محیط Node.js، موارد زیر را انجام دهید:

  1. مطمئن شوید که نسخه‌های به‌روز Node (بیش از ۱۰) و NPM (بیش از ۶) را نصب کرده‌اید.
  2. به جایی که مخزن را کلون کرده‌اید (یا فایل ZIP را از حالت فشرده خارج کرده‌اید) بروید، سپس به پوشه cloud/nodejs بروید.
  3. تأیید کنید که package.json وجود دارد و سپس npm install اجرا کنید.

برای مورد شماره ۱ در بالا، می‌توانید نسخه‌های موجود را در خط فرمان بررسی کنید:

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

۶. بررسی اپلیکیشن نمونه

این برنامه نمونه، یک مشتق ساده از گوگل ترنسلیت است که از کاربران می‌خواهد متنی را به انگلیسی وارد کنند و ترجمه معادل آن متن را به اسپانیایی دریافت کنند.

فایل پیکربندی 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 ، شامل چارچوب و قابلیت‌های قالب‌بندی و کتابخانه کلاینت Cloud Translation API هستند.
  2. متغیرهای سراسری نشان‌دهنده‌ی برنامه‌ی وب، شناسه‌ی پروژه‌ی ابری، کلاینت API ترجمه، «مسیر مکان» والد برای فراخوانی‌های API ترجمه و زبان‌های SOURCE و TARGET هستند. در این مورد، انگلیسی ( en ) و اسپانیایی ( es ) هستند، اما می‌توانید این مقادیر را به کدهای زبان‌های دیگری که توسط 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);
}

تابع اصلی، کار دریافت ورودی کاربر و فراخوانی 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. توابع را به فضای ابری منتقل کنید
  4. استقرار در Cloud Run

۷. گزینه ۱: اجرای سرویس به صورت محلی

این بخش از آزمایشگاه کد فقط برای اجرای محلی است. اگر فقط قصد دارید برنامه را روی فضای ابری اجرا کنید، به بخش بعدی بروید.

برای اجرای برنامه نمونه به صورت محلی، سه مرحله مجزا وجود دارد که باید انجام شود:

  1. ایجاد حساب کاربری سرویس
  2. ایجاد یک جفت کلید عمومی/خصوصی برای حساب کاربری سرویس
  3. دانلود فایل اعتبارنامه‌ها و بسته نرم‌افزاری حاوی کد برنامه
  4. سرویس را شروع کنید

آشنایی با حساب‌های خدماتی

حساب‌های سرویس، مکانیزم امنیتی برای دسترسی به APIهای گوگل برای برنامه‌های مبتنی بر ابر هستند، زمانی که به داده‌هایی دسترسی دارند که متعلق به کاربران انسانی نیست. هنگام استقرار در ابر، برای کاهش زمان راه‌اندازی کاربران در ابر، تمام پلتفرم‌های محاسباتی گوگل کلود (بدون سرور و غیره) حساب‌های سرویس پیش‌فرض ارائه می‌دهند.

حساب‌های کاربری پیش‌فرض سرویس با مجموعه‌ای گسترده از مجوزها برای «گذر از تشریفات اداری» ارائه می‌شوند، اما هنگام آماده شدن برای راه‌اندازی یک سرویس تولیدی، اکیداً به کاربران توصیه می‌کنیم که از بهترین شیوه «حداقل امتیازات» پیروی کنند، اما حساب‌های کاربری مدیریت‌شده توسط کاربر را فقط با مجوزهای کافی برای عملکرد صحیح برنامه خود ایجاد کنند. صرف نظر از این، هیچ حساب کاربری پیش‌فرضی برای استقرارهای محلی وجود ندارد، بنابراین باید یک حساب کاربری سرویس به همراه یک کلید حساب کاربری سرویس (در واقع یک جفت کلید عمومی/خصوصی) ایجاد کنید و این اعتبارنامه‌ها را در دسترس کد برنامه قرار دهید.

ایجاد جفت کلید حساب سرویس و دانلود فایل اعتبارنامه‌ها

برای ایجاد یک حساب کاربری سرویس و جفت کلید عمومی/خصوصی برای اجرای محلی، دستورالعمل‌های این صفحه را دنبال کنید. هنگام ایجاد کلید حساب کاربری سرویس، از شما خواسته می‌شود مجوزهای مورد نظر را ارائه دهید. حتماً roles/cloudtranslate.user را انتخاب کنید تا بتوانید با موفقیت به API دسترسی پیدا کنید.

پس از ایجاد موفقیت‌آمیز جفت کلید، از شما خواسته می‌شود فایل کلید حساب سرویس را دانلود کنید. آن را credentials.json بنامید و به پوشه سطح بالای برنامه منتقل کنید. اکنون باید به Cloud SDK بگویید که از این اعتبارنامه‌ها استفاده کند : متغیر محیطی GOOGLE_APPLICATION_CREDENTIALS را طوری تنظیم کنید که به آن فایل اشاره کند. اطلاعات بیشتر در مورد این فرآیند را می‌توانید در این صفحه که شامل استفاده از حساب‌های سرویس است، نیز بیابید.

سرویس را شروع کنید

وقتی آماده‌ی ادامه شدید، سرور اکسپرس را با دستور زیر به صورت محلی راه‌اندازی کنید:

$ npm start

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

Listening on port 8080

برای اتصال به آن در localhost:8080 به مرورگر وب خود بروید، و باید چیزی شبیه به موارد زیر را ببینید:

adc6665b7ae13c40.png

یه چیزی ترجمه کن تا ببینی چی میشه!

fc154326080bf14f.png

وقتی از آن راضی بودید، با فشردن کلیدهای ^C (کنترل-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 را کامل نکرده‌اید. لطفاً به « گزینه ۱: اجرای سرویس به صورت محلی » برگردید و این فرآیند را تکمیل کنید و قبل از ادامه، creds را در پوشه اصلی نصب کنید.

۸. گزینه ۲: استقرار در App Engine (محیط استاندارد)

این بخش از آزمایشگاه کد فقط برای استقرار در Node App Engine است. اگر علاقه‌ای ندارید، به بخش بعدی بروید.

این استقرار از فایل پیکربندی app.yaml استفاده می‌کند که با یک خط به App Engine می‌گوید از کدام runtime استفاده کند:

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 حاوی شناسه پروژه خود به آن دسترسی پیدا کنید و خروجی مشابه نسخه محلی اکسپرس را مشاهده خواهید کرد، اما توجه داشته باشید که در فضای ابری اجرا می‌شود و در سراسر جهان در دسترس است:

da28f951c33a2c3d.png

اگر درخواستی ارسال کنید، متوجه خواهید شد که مانند سایر استقرارها عمل می‌کند.

۹. گزینه ۳: استقرار در توابع ابری

این بخش از آزمایشگاه کد فقط برای استقرار در توابع ابری گره است. اگر علاقه‌ای ندارید، به بخش بعدی بروید.

هیچ فایل پیکربندی با توابع ابری وجود ندارد، بنابراین وقتی آماده‌ی استقرار در توابع ابری شدید، این دستور را اجرا کنید:

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

پروژه GCP شما ممکن است یک REGION پیش‌فرض داشته باشد، اما می‌توانید از پرچم --region برای استقرار تابع خود در یک منطقه خاص استفاده کنید. توابع ابری مانند سایر محصولات ابری از شما نمی‌پرسند. صرف نظر از اینکه کدام منطقه را انتخاب می‌کنید، خروجی 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

۱۰. گزینه ۴: استقرار در Cloud Run

این بخش از آزمایشگاه کد فقط برای استقرار در 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 اجرا می‌شود. برای پایتون، pip install -r requirements.txt اجرا می‌شود و برنامه را از دستورالعمل‌های موجود در Procfile شما اجرا می‌کند. (همین امر در مورد سایر زبان‌های پشتیبانی شده توسط Cloud Buildpacks نیز صدق می‌کند.) برنامه شما پس از اتمام فرآیند ساخت، آماده اجرا خواهد بود.

سپس برنامه شما (به صورت منطقه‌ای مستقر می‌شود اما) به صورت جهانی در دسترس است و می‌توانید از طریق URL حاوی شناسه پروژه خود، همانطور که در خروجی استقرار نشان داده شده است (در زیر " Service URL :" ) به آن دسترسی پیدا کنید.

۱۶۹f۶edf۵f۷d۲۰۶۸.png

یه چیزی ترجمه کن تا ببینی چی میشه!

۳۱۵۵۴e۷۱cb۸۰f۱b۴.png

۱۱. نتیجه‌گیری

تبریک! شما یاد گرفتید که چگونه API ترجمه ابری را فعال و استفاده کنید، اعتبارنامه‌های لازم را دریافت کنید و یک برنامه وب ساده را برای Express به صورت محلی، App Engine، Cloud Functions و/یا Cloud Run مستقر کنید. لطفاً برای کسب اطلاعات بیشتر یا دسترسی به نسخه‌های دیگر این برنامه و همچنین سایر آزمایشگاه‌های کد، پوشه repo را بررسی کنید.

تمیز کردن

API ترجمه ابری به شما امکان می‌دهد تعداد مشخصی از کاراکترهای ترجمه شده را در هر ماه به صورت رایگان انجام دهید. App Engine نیز سهمیه رایگان دارد و همین امر در مورد Cloud Functions و Cloud Run نیز صدق می‌کند. در صورت تجاوز از هر یک از این موارد، هزینه‌هایی متحمل خواهید شد. اگر قصد دارید به codelab بعدی ادامه دهید، لازم نیست برنامه خود را خاموش کنید.

با این حال، اگر هنوز آماده رفتن به آموزش بعدی نیستید یا نگران هستید که اینترنت برنامه‌ای را که تازه مستقر کرده‌اید، کشف کند، برنامه App Engine خود را غیرفعال کنید ، عملکرد Cloud خود را حذف کنید یا سرویس Cloud Run خود را غیرفعال کنید تا از پرداخت هزینه‌ها جلوگیری کنید. وقتی آماده رفتن به آزمایشگاه کد بعدی شدید، می‌توانید آن را دوباره فعال کنید. از طرف دیگر، اگر قصد ادامه کار با این برنامه یا آزمایشگاه‌های کد دیگر را ندارید و می‌خواهید همه چیز را به طور کامل حذف کنید، می‌توانید پروژه خود را متوقف کنید .

همچنین، استقرار در یک پلتفرم محاسباتی بدون سرور Google Cloud هزینه‌های ساخت و ذخیره‌سازی کمی را متحمل می‌شود. Cloud Build همانند Cloud Storage سهمیه رایگان خود را دارد. برای شفافیت بیشتر، Cloud Build تصویر برنامه شما را می‌سازد که سپس در Cloud Container Registry یا Artifact Registry ، جانشین آن، ذخیره می‌شود. ذخیره‌سازی آن تصویر و همچنین خروجی شبکه هنگام انتقال آن تصویر به سرویس، مقداری از آن سهمیه را مصرف می‌کند. با این حال، ممکن است در منطقه‌ای زندگی کنید که چنین ردیف رایگانی ندارد، بنابراین از میزان استفاده از فضای ذخیره‌سازی خود آگاه باشید تا هزینه‌های احتمالی را به حداقل برسانید.

۱۲. منابع اضافی

در بخش‌های بعدی، می‌توانید مطالب خواندنی بیشتر و همچنین تمرین‌های پیشنهادی برای افزایش دانش خود از تکمیل این آموزش را بیابید.

مطالعه اضافی

حالا که کمی با API ترجمه آشنا شدید، بیایید چند تمرین دیگر برای توسعه بیشتر مهارت‌هایتان انجام دهیم. برای ادامه مسیر یادگیری، برنامه نمونه ما را طوری تغییر دهید که موارد زیر را انجام دهد:

  1. تمام نسخه‌های دیگر این آزمایشگاه کد را برای اجرای محلی یا استقرار در پلتفرم‌های محاسباتی بدون سرور Google Cloud تکمیل کنید (به مخزن README مراجعه کنید).
  2. این آموزش را با استفاده از یک زبان برنامه‌نویسی دیگر تکمیل کنید.
  3. این برنامه را طوری تغییر دهید که از زبان‌های مبدأ یا مقصد مختلف پشتیبانی کند.
  4. این برنامه را ارتقا دهید تا بتواند متن را به بیش از یک زبان ترجمه کند؛ فایل الگو را تغییر دهید تا فهرستی از زبان‌های مقصد پشتیبانی‌شده داشته باشید.

بیشتر بدانید

موتور برنامه گوگل

عملکردهای گوگل کلود

گوگل کلود ران

بسته‌های ساخت ابری گوگل، رجیستری کانتینر، رجیستری مصنوعات

ترجمه ابری گوگل و کیت یادگیری ماشین گوگل

سایر محصولات/صفحات Google Cloud

مجوز

این آموزش تحت مجوز عمومی Creative Commons Attribution 2.0 منتشر شده است، در حالی که کد منبع موجود در مخزن تحت مجوز Apache 2 می‌باشد.