Triển khai "Google Dịch" cơ bản Ứng dụng Express.js trên App Engine, Cloud Functions và Cloud Run

1. Tổng quan

Loạt lớp học lập trình này (hướng dẫn thực hành theo tiến độ riêng) nhằm giúp nhà phát triển nắm được nhiều lựa chọn khi triển khai ứng dụng. Bạn sẽ tìm hiểu cách sử dụng Google Cloud Translation API trong một ứng dụng web đơn giản. Bạn có thể chạy cục bộ ứng dụng này hoặc triển khai cho một nền tảng điện toán không máy chủ đám mây (App Engine, Cloud Functions hoặc Cloud Run).

Bạn sẽ thực hiện hướng dẫn về JavaScript này với Node.js bằng cách sử dụng khung web Express.js. Bạn cũng sẽ tìm hiểu cách truy cập API Google Cloud từ các nền tảng không máy chủ của chúng tôi. Tất cả các phiên bản của ứng dụng này đều bắt nguồn từ phiên bản "không có máy chủ mơ hồ" kho lưu trữ nguồn mở, bao gồm phiên bản Python của ứng dụng và các lớp học lập trình độc lập. Kho lưu trữ này cũng lưu trữ các ứng dụng tương tự hướng dẫn nhà phát triển cách truy cập vào các API không phải Cloud của Google từ các nền tảng không máy chủ của chúng tôi.

Lớp học lập trình này tập trung vào việc triển khai ứng dụng này cho(các) nền tảng in đậm ở trên.

Bạn sẽ tìm hiểu cách

Bạn cần có

  • Một dự án trên Google Cloudmột tài khoản thanh toán Cloud đang hoạt động
  • Một khung web đã được cài đặt để chạy cục bộ ( Flask cho những người làm hướng dẫn Python hoặc Express cho những người thực hiện hướng dẫn JavaScript/Node.js)
  • Ít nhất một nền tảng điện toán không ngắt kết nối được bật để triển khai Google Cloud
  • Kỹ năng lập trình cơ bản (Python hoặc JavaScript/Node.js)
  • Kiến thức thực hành về các lệnh cơ bản của hệ điều hành

Khảo sát

Bạn sẽ sử dụng hướng dẫn này như thế nào?

Đọc và hoàn thành bài tập Chỉ đọc

Bạn đánh giá thế nào về kinh nghiệm phát triển bằng Python hoặc Node.js?

Người mới tập Trung cấp Thành thạo

Bạn đánh giá thế nào về trải nghiệm sử dụng các dịch vụ của Google Cloud?

Người mới tập Trung cấp Thành thạo

2. Thiết lập và yêu cầu

Thiết lập môi trường theo tiến độ riêng

  1. Đăng nhập vào Google Cloud Console rồi tạo dự án mới hoặc sử dụng lại dự án hiện có. Nếu chưa có tài khoản Gmail hoặc Google Workspace, bạn phải tạo một tài khoản.

96a9c957bc475304.pngs

b9a10ebdf5b5a448.png

a1e3c01a38fa61c2.png

  • Tên dự án là tên hiển thị của những người tham gia dự án này. Đây là một chuỗi ký tự không được API của Google sử dụng và bạn có thể cập nhật chuỗi này bất cứ lúc nào.
  • Mã dự án phải là duy nhất trong tất cả các dự án Google Cloud và không thể thay đổi (bạn không thể thay đổi mã này sau khi đặt). Cloud Console sẽ tự động tạo một chuỗi duy nhất; thường bạn không quan tâm đến sản phẩm đó là gì. Trong hầu hết các lớp học lập trình, bạn sẽ cần tham chiếu đến Mã dự án (và mã này thường được xác định là PROJECT_ID). Vì vậy, nếu không thích, bạn có thể tạo một mã ngẫu nhiên khác hoặc bạn có thể thử mã của riêng mình để xem có mã này chưa. Sau đó, video sẽ được "đóng băng" sau khi tạo dự án.
  • Có giá trị thứ ba là Project Number (Số dự án) mà một số API sử dụng. Tìm hiểu thêm về cả ba giá trị này trong tài liệu này.
  1. Tiếp theo, bạn sẽ cần bật tính năng thanh toán trong Cloud Console để sử dụng tài nguyên/API trên Cloud. Việc chạy qua lớp học lập trình này sẽ không tốn nhiều chi phí. Để tắt các tài nguyên để bạn không phải chịu thanh toán ngoài hướng dẫn này, hãy làm theo mọi thao tác "dọn dẹp" hướng dẫn ở cuối lớp học lập trình. Người dùng mới của Google Cloud đủ điều kiện tham gia chương trình Dùng thử miễn phí 300 USD.

3. Bật Translation API

Trong phần này, bạn sẽ tìm hiểu cách bật các API của Google nói chung. Đối với ứng dụng mẫu, bạn sẽ bật Cloud Translation API. Bạn cũng sẽ bật App Engine, Cloud Functions và/hoặc Cloud Run (cùng với Cloud Artifact Registry), tuỳ thuộc vào(các) nền tảng mà bạn muốn triển khai ứng dụng mẫu.

Bật API của Google

Giới thiệu

Bất kể bạn muốn sử dụng API nào của Google trong ứng dụng của mình, bạn phải bật API đó. Bạn có thể bật API bằng dòng lệnh hoặc từ bảng điều khiển Cloud. Quy trình bật API giống hệt nhau, vì vậy, sau khi bật một API, bạn có thể bật một API khác theo cách tương tự.

Cách 1: gcloud giao diện dòng lệnh (Cloud Shell hoặc môi trường cục bộ)

Mặc dù việc bật API từ Cloud Console phổ biến hơn, nhưng một số nhà phát triển lại thích làm mọi việc từ dòng lệnh. Để thực hiện việc này, bạn cần tra cứu "tên dịch vụ" của API. URL này có dạng như sau: SERVICE_NAME.googleapis.com. Bạn có thể tìm thấy những sản phẩm này trong Biểu đồ Sản phẩm được hỗ trợ hoặc bạn có thể truy vấn những sản phẩm đó theo phương thức lập trình bằng API Khám phá của Google.

Được trang bị thông tin này, bằng cách sử dụng Cloud Shell (hoặc môi trường phát triển cục bộ của bạn có công cụ dòng lệnh gcloud đã cài đặt), bạn có thể bật API như sau:

gcloud services enable SERVICE_NAME.googleapis.com

Ví dụ 1: Bật Cloud Vision API

gcloud services enable vision.googleapis.com

Ví dụ 2: Bật Google App Engine

gcloud services enable appengine.googleapis.com

Ví dụ 3: Bật nhiều API với một yêu cầu. Ví dụ: nếu lớp học lập trình này có người xem triển khai một ứng dụng bằng Cloud Translation API cho App Engine, Cloud Functions và Cloud Run, thì dòng lệnh sẽ là:

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

Lệnh này bật App Engine, Cloud Functions, Cloud Run và Cloud Translation API. Ngoài ra, bạn cũng có thể sử dụng Cloud Artifact Registry vì đó là nơi hệ thống Cloud Build phải đăng ký hình ảnh vùng chứa để có thể triển khai Cloud Run.

Phương án 2: Bảng điều khiển Cloud

Bạn cũng có thể bật các API của Google trong Trình quản lý API. Trong Cloud Console, hãy chuyển đến Trình quản lý API rồi chọn Thư viện.

fb0f1d315f122d4a.png

Bắt đầu nhập tên của API vào thanh tìm kiếm để xem kết quả trùng khớp:

2275786a24f8f204.pngs

Chọn API bạn muốn bật rồi nhấp vào nút Enable (Bật):

7960a6752a1da767.pngS

Quy trình bật tất cả API là như nhau, bất kể bạn muốn sử dụng API nào của Google.

Chi phí

Bạn có thể sử dụng nhiều API của Google mà không mất phí. Tuy nhiên, khi sử dụng hầu hết các sản phẩm và API của Google Cloud, bạn sẽ phải trả phí. Khi bật Cloud API, bạn có thể được yêu cầu có một tài khoản thanh toán đang hoạt động. Tuy nhiên, một số sản phẩm của Google Cloud có tính năng "Luôn miễn phí" mà bạn phải vượt quá để chịu phí thanh toán.

Người dùng mới của GCP đủ điều kiện Dùng thử miễn phí với giá hiện tại là 300 USD cho 90 ngày đầu tiên. Các lớp học lập trình thường không phải phát sinh nhiều khoản phí hoặc bất kỳ khoản thanh toán nào. Vì vậy, bạn nên tạm ngưng dùng thử miễn phí cho đến khi thực sự sẵn sàng dùng thử, đặc biệt vì đây là ưu đãi một lần. Hạn mức cấp miễn phí sẽ không hết hạn và áp dụng bất kể bạn có sử dụng ưu đãi Dùng thử miễn phí hay không.

Người dùng nên tham khảo thông tin về giá của bất kỳ API nào trước khi bật (ví dụ: trang giá Cloud Vision API ), đặc biệt là cần lưu ý xem API đó có bậc miễn phí hay không và nếu có thì đó là bậc nào. Nếu không vượt quá giới hạn tổng hợp hằng ngày hoặc hằng tháng đã chỉ định, thì bạn sẽ không phải chịu bất kỳ khoản phí nào. Mức giá và bậc miễn phí khác nhau giữa các API nhóm sản phẩm của Google. Ví dụ:

Các sản phẩm của Google được tính phí theo cách khác nhau, vì vậy, hãy nhớ tham khảo tài liệu thích hợp về thông tin đó.

Đảm bảo bật dịch vụ mong muốn

Đảm bảo Cloud Translation API trong Trình quản lý API theo hướng dẫn ở trên. Nếu không bật các nền tảng không máy chủ từ dòng lệnh, bạn có thể bật từ từng trang tổng quan tương ứng trong Cloud Console: App Engine, Cloud Functions, Cloud Run.

Mặc dù bạn cung cấp thông tin một cách trực quan để bật các API trong Cloud Console, nhưng bạn sẽ nhanh chóng sử dụng được công cụ gcloud và chỉ mất vài giây để bật tất cả dịch vụ:

$ 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.

Thông tin khác về chi phí

Phần ở trên về chi phí là chung trên các API của Google. Hãy cùng tìm hiểu cụ thể hơn về hướng dẫn này. Mặc dù hạn mức hàng tháng của ứng dụng không được liệt kê trong tổng thể "Luôn miễn phí" trang tóm tắt theo cấp, trang giá của API Bản dịch cho biết tất cả người dùng nhận được một số lượng ký tự dịch cố định mỗi tháng. Bạn sẽ không phải chịu bất kỳ khoản phí nào từ API nếu duy trì dưới ngưỡng đó. Để biết thêm thông tin về chi phí sử dụng nền tảng không máy chủ của Google Cloud, hãy xem phần Chi phí trong kho lưu trữ. Chiến dịch "Dọn dẹp" Chúng tôi sẽ thảo luận về cách dừng phát sinh phí sau khi hoàn thành lớp học lập trình này.

4. Nhận mã ứng dụng mẫu

Tải kho lưu trữ ZIP hoặc sao chép

  • Tải tệp ZIP xuống hoặc sao chép kho lưu trữ đó bằng git clone https://github.com/googlecodelabs/cloud-nebulous-serverless.git
  • Nếu không có môi trường nhà phát triển cục bộ và muốn làm theo hướng dẫn này trong Cloud Shell, thì bạn có thể sao chép kho lưu trữ bằng chính lệnh git clone ở đó.
  • Bạn cũng có thể truy cập tệp ZIP bằng nút màu xanh lục như trong ảnh chụp màn hình sau đây:

5cd6110c4414cf65.png.

Bây giờ bạn đã có mọi thứ, hãy tạo một bản sao đầy đủ của thư mục để thực hiện hướng dẫn cụ thể này, vì hướng dẫn này có thể liên quan đến việc xoá hoặc thay đổi các tệp. Nếu muốn thực hiện một hoạt động triển khai khác, bạn có thể bắt đầu lại bằng cách sao chép bản gốc để không phải sao chép hoặc tải xuống lại.

5. Xác nhận môi trường Node.js

Để thiết lập môi trường Node.js, hãy làm như sau:

  1. Đảm bảo bạn đã cài đặt các phiên bản mới của Nút (>=10) và Đối tượng địa lý ( tôi) (>=6)
  2. Chuyển đến nơi bạn đã sao chép kho lưu trữ (hoặc giải nén tệp ZIP), sau đó chuyển đến thư mục cloud/nodejs
  3. Xác nhận package.json đã tồn tại rồi chạy npm install

Đối với ví dụ 1 ở trên, bạn có thể xác minh bạn có phiên bản nào trên dòng lệnh:

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

6. Tham quan ứng dụng mẫu

Ứng dụng mẫu là một sản phẩm phái sinh đơn giản của Google Dịch, nhắc người dùng nhập văn bản bằng tiếng Anh và nhận bản dịch tương đương của văn bản đó bằng tiếng Tây Ban Nha.

Tệp cấu hình package.json cho biết các gói của bên thứ ba cần thiết cho ứng dụng (lưu ý rằng các phiên bản gói có thể được cập nhật ngoài những phiên bản được liệt kê ở đây):

{
  "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"
  }
}

Bây giờ, hãy mở tệp index.js để chúng ta có thể xem cách thức hoạt động. Bỏ qua các dòng bình luận về việc cấp phép, giao diện của phần trên cùng và dưới cùng sẽ có giao diện như sau:

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 mang đến chức năng khung và tạo mẫu cũng như thư viện ứng dụng Cloud Translation API.
  2. Các biến toàn cục đại diện cho ứng dụng web, mã dự án trên đám mây, ứng dụng Translation API, "đường dẫn vị trí" gốc cho các lệnh gọi API Dịch cũng như các ngôn ngữ SOURCETARGET. Trong trường hợp này, đó là tiếng Anh (en) và tiếng Tây Ban Nha (es). Tuy nhiên, bạn có thể thay đổi các giá trị này sang các mã ngôn ngữ khác được Cloud Translation API hỗ trợ.
  3. Phần tử đầu tiên của mỗi cặp (SOURCETARGET) là mã ngôn ngữ trong khi phần tử thứ hai là tên ngôn ngữ (và chỉ được dùng cho mục đích hiển thị vì không liên quan đến API).
  4. Một vài dòng ở dưới cùng dùng để gửi tất cả yêu cầu HTTP đến translate(), sau đó xuất đối tượng ứng dụng app.

Cuối cùng, ở giữa index.js là thành phần chính của ứng dụng, hàm 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);
}

Hàm chính thực hiện công việc lấy thông tin đầu vào của người dùng và gọi Translation API để thực hiện phần nâng cao. Chúng ta hãy cùng phân tích chi tiết như sau:

  1. Đặt lại các biến cơ bản cho biểu mẫu. Việc này chủ yếu dành cho các yêu cầu GET vì các yêu cầu POST sẽ có dữ liệu thay thế cho các yêu cầu này.
  2. Nếu đó là yêu cầu POST, hãy lấy văn bản để dịch và nếu không trống, hãy tạo cấu trúc JSON để biểu thị yêu cầu về siêu dữ liệu API. Sau đó, hãy gọi API cho dịch vụ.
  3. Chúng tôi không chuyển SOURCE[0] đến API đến một nguồn tiếng Anh cụ thể. Khi bỏ qua ngôn ngữ nguồn, bạn sẽ yêu cầu API tự động phát hiện ngôn ngữ nguồn (xem sourceLanguageCode trong tài liệu).
  4. Dù vậy, hãy định dạng kết quả thực tế (POST) hoặc không có dữ liệu (GET) vào ngữ cảnh mẫu và hiển thị.

Phần hình ảnh của ứng dụng này nằm trong tệp index.html mẫu. Phần này hiển thị mọi kết quả đã dịch trước đây (trống), theo sau là biểu mẫu yêu cầu dịch nội dung nào đó:

<!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>

Trong phần còn lại của hướng dẫn này, bạn có thể chọn bất kỳ hoặc cả bốn tuỳ chọn để triển khai và chạy ứng dụng này. Tất cả hoạt động triển khai này đều không bắt buộc, có nghĩa là bạn có thể thực hiện bất kỳ hoặc toàn bộ quy trình nào.

  1. Chạy dịch vụ trên máy
  2. Triển khai cho App Engine (môi trường chuẩn)
  3. Triển khai cho Cloud Functions
  4. Triển khai lên Cloud Run

7. TÙY CHỌN 1: Chạy dịch vụ trên máy

Phần này của lớp học lập trình chỉ dành cho việc chạy trên thiết bị. Nếu bạn chỉ triển khai lên đám mây, hãy chuyển sang phần tiếp theo.

Để chạy ứng dụng mẫu trên máy tính, bạn phải thực hiện 3 bước riêng biệt:

  1. Tạo một tài khoản dịch vụ
  2. Tạo một cặp khoá công khai/riêng tư của tài khoản dịch vụ
  3. Tải tệp thông tin xác thực xuống và gói có mã xử lý ứng dụng
  4. Bắt đầu dịch vụ

Tìm hiểu về tài khoản dịch vụ

Tài khoản dịch vụ là cơ chế bảo mật để truy cập vào các API của Google cho các ứng dụng trên đám mây khi truy cập vào dữ liệu không phải của người dùng. Khi triển khai lên đám mây, để giảm thời gian đưa người dùng lên đám mây, tất cả các nền tảng điện toán của Google Cloud (không máy chủ và nền tảng khác) đều cung cấp tài khoản dịch vụ mặc định.

Tài khoản dịch vụ mặc định đi kèm với một loạt các quyền mà bạn có thể "kiểm soát" Tuy nhiên, khi chuẩn bị sẵn sàng để triển khai một dịch vụ phát hành công khai, người dùng nên làm theo phương pháp hay nhất về "ít đặc quyền nhất", nhưng việc tạo tài khoản dịch vụ do người dùng quản lý chỉ với đủ quyền để ứng dụng của bạn hoạt động đúng cách. Tuy nhiên, không có tài khoản dịch vụ mặc định nào để triển khai cục bộ, vì vậy, bạn phải tạo tài khoản dịch vụ cùng với khoá tài khoản dịch vụ (thực tế là một cặp khoá công khai/riêng tư) và cung cấp các thông tin đăng nhập đó cho mã xử lý ứng dụng.

Tạo cặp khoá tài khoản dịch vụ và tải tệp thông tin xác thực xuống

Làm theo hướng dẫn trên trang này để tạo một tài khoản dịch vụ và cặp khoá công khai/riêng tư để chạy cục bộ. Khi tạo khoá tài khoản dịch vụ, bạn sẽ được nhắc cấp các quyền mong muốn. Hãy nhớ chọn roles/cloudtranslate.user để bạn có thể truy cập API thành công.

Sau khi tạo xong cặp khoá, bạn sẽ được nhắc tải tệp khoá tài khoản dịch vụ xuống. Gọi hàm này là credentials.json và di chuyển vào thư mục cấp cao nhất của ứng dụng. Bây giờ, bạn phải yêu cầu Cloud SDK sử dụng những thông tin đăng nhập đó: đặt biến môi trường GOOGLE_APPLICATION_CREDENTIALS để trỏ đến tệp đó. Bạn cũng có thể xem thêm thông tin về quy trình này trên trang này, trong đó trình bày về việc sử dụng tài khoản dịch vụ.

Bắt đầu dịch vụ

Khi bạn đã sẵn sàng tiếp tục, hãy khởi chạy cục bộ máy chủ Express bằng lệnh sau:

$ npm start

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

Listening on port 8080

Truy cập vào trình duyệt web của bạn để kết nối với máy chủ này tại localhost:8080 và bạn sẽ thấy giao diện như sau:

adc6665b7ae13c40.png

Hãy dịch nội dung nào đó để nội dung đó hoạt động!

fc154326080bf14f.png

Khi bạn đã hài lòng với thao tác này, hãy thoát khỏi máy chủ bằng ^C (control-C) rồi thoát. Chúc mừng bạn đã chạy quy trình triển khai cục bộ. Tin vui là: việc triển khai lên đám mây dễ dàng hơn nhiều.

Khắc phục sự cố

Bạn có gặp lỗi tương tự khi yêu cầu bản dịch không?

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'
    . . .

GIẢI PHÁP: Lỗi này có nghĩa là bạn chưa hoàn tất việc tạo tài khoản dịch vụ và tải xuống tệp cặp khoá công khai/riêng tư credentials.json. Vui lòng quay lại " PHƯƠNG ÁN 1: Chạy dịch vụ trên máy" và hoàn tất quy trình này, cài đặt tín dụng trong thư mục chính trước khi tiếp tục.

8. PHƯƠNG ÁN 2: Triển khai cho App Engine (môi trường tiêu chuẩn)

Phần này của lớp học lập trình chỉ dành cho việc triển khai cho Node App Engine. Nếu bạn không quan tâm, hãy chuyển sang phần tiếp theo.

Quy trình triển khai này sử dụng tệp cấu hình app.yaml. Tệp này cho App Engine biết nên sử dụng môi trường thời gian chạy nào với một dòng duy nhất:

runtime: nodejs16

Tệp app.yaml không được Cloud Functions và Cloud Run sử dụng. Nếu bạn không định dùng App Engine, thì tệp này có thể đã được xoá một cách an toàn. Khi bạn đã sẵn sàng triển khai App Engine, hãy chạy lệnh sau:

$ gcloud app deploy

Sau khi bạn chọn một khu vực, kết quả gcloud app deploy sẽ ít chi tiết hơn và có dạng như sau:

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

Hiện tại, ứng dụng của bạn đã có sẵn trên toàn thế giới, bạn có thể truy cập ứng dụng tại URL chứa ID dự án và bạn sẽ thấy kết quả tương tự như phiên bản Express cục bộ nhưng biết rằng ứng dụng đang chạy trên đám mây và có sẵn trên toàn thế giới:

da28f951c33a2c3d.png

Khi gửi một yêu cầu, bạn sẽ thấy yêu cầu này hoạt động giống như tất cả yêu cầu triển khai khác.

9. PHƯƠNG ÁN 3: Triển khai Chức năng đám mây

Phần này của lớp học lập trình chỉ dành cho việc triển khai cho Node Cloud Functions. Nếu bạn không quan tâm, hãy chuyển sang phần tiếp theo.

Không có tệp cấu hình nào có Cloud Functions, vì vậy, khi bạn đã sẵn sàng triển khai Cloud Functions, hãy chạy lệnh sau:

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

Dự án GCP của bạn có thể có REGION mặc định, nhưng bạn có thể sử dụng cờ --region để triển khai hàm cho một khu vực cụ thể. Cloud Functions không nhắc bạn thích các sản phẩm Cloud khác. Bất kể bạn chọn khu vực nào, đầu ra gcloud functions deploy đều sẽ có dạng như sau:

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: '...'

Hiện tại, ứng dụng của bạn đã có mặt trên toàn thế giới, bạn có thể truy cập ứng dụng đó tại URL chứa mã dự án như minh hoạ trong kết quả triển khai (trong "httpsTrigger/url"). URL này có dạng như sau: https://REGION-PROJECT_ID.cloudfunctions.net/translate và có thể thay đổi theo khu vực mà bạn chọn cũng như mã dự án Google Cloud của bạn.

518f1c3165f2096d.pngS

10. PHƯƠNG ÁN 4: Triển khai lên Cloud Run

Phần này của lớp học lập trình chỉ dành cho việc triển khai lên Cloud Run. Nếu bạn không quan tâm, hãy chuyển sang phần tiếp theo.

Cloud Run không có tệp cấu hình nên khi bạn đã sẵn sàng triển khai Cloud Run, hãy làm theo hướng dẫn bên dưới.

Bây giờ, bạn đã sẵn sàng triển khai dịch vụ dịch thuật của mình lên Cloud Run bằng cách chạy lệnh sau:

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

Kết quả sẽ có dạng như sau và cung cấp một số lời nhắc cho các bước tiếp theo:

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 Build gói ứng dụng của bạn vào Cloud Run giống như cách bạn chạy ứng dụng cục bộ. Đối với người dùng Node.js, công cụ này sẽ chạy npm installnpm start. Đối với Python, mã này chạy pip install -r requirements.txt và khởi động ứng dụng theo hướng dẫn trong Procfile. (Điều này cũng áp dụng cho tất cả các ngôn ngữ khác mà Cloud Buildpacks hỗ trợ.) Ứng dụng của bạn sẽ sẵn sàng hoạt động sau khi quá trình xây dựng hoàn tất.

Sau đó, ứng dụng của bạn sẽ được cung cấp trên toàn cầu và người dùng có thể truy cập ứng dụng này tại URL chứa mã dự án như minh hoạ trong kết quả triển khai (trong phần "Service URL:"

169f6edf5f7d2068.pngS

Hãy dịch nội dung nào đó để nội dung đó hoạt động!

31554e71cb80f1b4.pngS

11. Kết luận

Xin chúc mừng! Bạn đã tìm hiểu cách bật và sử dụng Cloud Translation API, lấy thông tin đăng nhập cần thiết và triển khai một ứng dụng web đơn giản để Express cục bộ, đến App Engine, Cloud Functions và/hoặc Cloud Run. Vui lòng xem thư mục kho lưu trữ để tìm hiểu thêm hoặc truy cập vào các phiên bản khác của ứng dụng này cũng như các lớp học lập trình khác.

Dọn dẹp

Cloud Translation API cho phép bạn thực hiện một lượng ký tự dịch cố định mỗi tháng miễn phí. App Engine cũng có hạn mức miễn phí, tương tự như Cloud FunctionsCloud Run. Bạn sẽ phải trả phí nếu vượt quá một trong hai số đó. Nếu dự định chuyển sang lớp học lập trình tiếp theo, bạn không cần phải tắt ứng dụng.

Tuy nhiên, nếu bạn chưa sẵn sàng xem hướng dẫn tiếp theo hoặc lo ngại rằng Internet phát hiện ra ứng dụng mà bạn vừa triển khai, hãy tắt ứng dụng App Engine, xoá Hàm Cloud hoặc tắt dịch vụ Cloud Run để tránh phát sinh phí. Khi đã sẵn sàng chuyển sang lớp học lập trình tiếp theo, bạn có thể bật lại lớp học này. Mặt khác, nếu không tiếp tục sử dụng ứng dụng này hoặc các lớp học lập trình khác và muốn xoá hoàn toàn mọi thứ, bạn có thể ngừng dự án của mình.

Ngoài ra, việc triển khai cho một nền tảng điện toán không máy chủ của Google Cloud sẽ làm phát sinh chi phí bản dựng và bộ nhớ thấp. Cloud Build cũng có hạn mức miễn phí riêng, tương tự như Cloud Storage. Để tăng tính minh bạch, Cloud Build xây dựng hình ảnh ứng dụng của bạn. Sau đó, hình ảnh này được lưu trữ trong Cloud Container Registry (Sổ đăng ký vùng chứa Cloud) hoặc Artifact Registry (Sổ đăng ký cấu phần phần mềm) kế thừa. Việc lưu trữ hình ảnh đó sẽ sử dụng hết một phần hạn mức đó cũng như đầu ra mạng khi chuyển hình ảnh đó sang dịch vụ. Tuy nhiên, bạn có thể sống ở một khu vực không có bậc miễn phí như vậy, vì vậy hãy chú ý đến mức sử dụng bộ nhớ của bạn để giảm thiểu chi phí tiềm ẩn.

12. Tài nguyên khác

Trong các phần sau, bạn có thể tìm thêm tài liệu đọc cũng như các bài tập được đề xuất để nâng cao kiến thức học được sau khi hoàn thành hướng dẫn này.

Nghiên cứu bổ sung

Giờ đây, khi mà bạn đã có được một số kinh nghiệm về Translation API, hãy làm thêm một số bài tập để phát triển kỹ năng của bạn hơn nữa. Để tiếp tục lộ trình học tập của bạn, hãy sửa đổi ứng dụng mẫu của chúng tôi để thực hiện những việc sau:

  1. Hoàn thành tất cả phiên bản khác của lớp học lập trình này để chạy cục bộ hoặc triển khai cho các nền tảng điện toán không máy chủ của Google Cloud (xem phần README kho lưu trữ).
  2. Hoàn thành hướng dẫn này bằng một ngôn ngữ lập trình khác.
  3. Thay đổi ứng dụng này để hỗ trợ các ngôn ngữ nguồn hoặc ngôn ngữ đích khác.
  4. Nâng cấp ứng dụng này để có thể dịch văn bản sang nhiều ngôn ngữ; hãy thay đổi tệp mẫu để có danh sách ngôn ngữ đích được hỗ trợ kéo xuống.

Tìm hiểu thêm

Google App Engine

Chức năng đám mây của Google

Google Cloud Run

Gói bản dựng Google Cloud, Sổ đăng ký vùng chứa, Sổ đăng ký Artifact

Google Cloud Translation và Google ML Kit

Các sản phẩm/trang khác của Google Cloud

Giấy phép

Hướng dẫn này được cấp phép theo Giấy phép chung Ghi nhận bản quyền 2.0 của Creative Commons trong khi mã nguồn trong kho lưu trữ được cấp phép theo Apache 2.