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 tốc độ của riêng bạn) nhằm giúp nhà phát triển hiểu rõ các lựa chọn mà họ có 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. Ứng dụng này có thể được chạy cục bộ hoặc triển khai đến một nền tảng điện toán không máy chủ trên đám mây (App Engine, Cloud Functions hoặc Cloud Run).

Bạn sẽ thực hiện hướng dẫn này về JavaScript bằng Node.js thông qua khung web Express.js. Bạn cũng sẽ tìm hiểu cách truy cập vào API Google Cloud từ các nền tảng phi 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 có trong kho lưu trữ nguồn mở "nebulous serverless", bao gồm cả phiên bản Python của ứng dụng này 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ự cho thấy cách nhà phát triển truy cập vào các API Google không phải Cloud 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 được 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 CloudTà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 thực hiện hướng dẫn về Python hoặc Express cho những người thực hiện hướng dẫn về JavaScript/Node.js)
  • Ít nhất một nền tảng điện toán phi máy chủ được bật cho các hoạt động triển khai trên Google Cloud
  • Kỹ năng lập trình cơ bản (Python hoặc JavaScript/Node.js)
  • Có kiến thức cơ bản về các lệnh cơ bản của hệ điều hành

Bản 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ề trải nghiệm phát triển bằng Python hoặc Node.js?

Người mới bắt đầu Trung cấp Thành thạo

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

Người mới bắt đầu 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 tốc độ của riêng bạn

  1. Đăng nhập vào Google Cloud Console rồi tạo một dự án mới hoặc sử dụng lại một 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.png

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ự mà các API của Google không 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 trên tất cả các dự án trên Google Cloud và không thể thay đổi (bạn không thể thay đổi sau khi đã đặt). Cloud Console sẽ tự động tạo một chuỗi duy nhất; thường thì bạn không cần quan tâm đến chuỗi này. 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 (thường được xác định là PROJECT_ID). Vì vậy, nếu không thích mã này, bạn có thể tạo một mã ngẫu nhiên khác hoặc thử mã của riêng mình để xem mã đó có dùng được hay không. Sau đó, mã này sẽ "đóng băng" sau khi dự án được tạo.
  • Có một giá trị thứ ba là Số dự án mà một số API sử dụng. Tìm hiểu thêm về cả 3 giá trị này trong tài liệu.
  1. Tiếp theo, bạn cần bật tính năng thanh toán trong Cloud Console để sử dụng các tài nguyên/API trên Cloud. Việc thực hiện lớp học lập trình này sẽ không tốn nhiều chi phí, nếu có. Để tắt các tài nguyên nhằm tránh bị tính phí ngoài phạm vi hướng dẫn này, hãy làm theo mọi hướng dẫn "dọn dẹp" ở 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í trị giá 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 của chúng tôi, 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 các 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, bạn đều phải bật các API đó. Bạn có thể bật API từ dòng lệnh hoặc từ bảng điều khiển Cloud. Quy trình bật API là giống nhau, vì vậy, sau khi bật một API, bạn có thể bật API khác theo cách tương tự.

Lựa chọn 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 thứ từ dòng lệnh. Để làm như vậy, bạn cần tìm "tên dịch vụ" của một API. Có vẻ như đây là một URL: SERVICE_NAME.googleapis.com. Bạn có thể tìm thấy các 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 các sản phẩm này theo phương thức lập trình bằng Google Discovery API.

Với 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ó cài đặt công cụ dòng lệnh gcloud), bạn có thể bật mộ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 bằng 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 cho phép App Engine, Cloud Functions, Cloud Run và Cloud Translation API. Ngoài ra, lệnh này còn bật Cloud Artifact Registry vì hệ thống xây dựng Cloud Build phải đăng ký hình ảnh vùng chứa tại đây để triển khai vào Cloud Run.

Cách 2: Cloud Console

Bạn cũng có thể bật các API của Google trong Trình quản lý API. Trên 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 một API vào thanh tìm kiếm để xem kết quả phù hợp:

2275786a24f8f204.png

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

7960a6752a1da767.png

Quy trình bật tất cả API đều tương tự 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, bạn sẽ phải trả phí khi sử dụng hầu hết các sản phẩm và API của Google Cloud. Khi bật Cloud API, bạn có thể được yêu cầu cung cấp 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ó bậc"Luôn miễn phí". Bạn phải vượt quá bậc này thì mới phải trả phí.

Người dùng mới của GCP đủ điều kiện sử dụng Bản dùng thử miễn phí, hiện có giá trị 300 USD và dùng được trong 90 ngày đầu tiên. Các lớp học lập trình thường không phát sinh nhiều hoặc không phát sinh chi phí, vì vậy, bạn nên chờ đến khi thực sự sẵn sàng dùng thử thì mới bắt đầu dùng thử miễn phí, đặc biệt là vì đây là ưu đãi chỉ áp dụng một lần. Hạn mức của Gói miễn phí 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 mọi API trước khi bật (ví dụ: trang giá của Cloud Vision API ), đặc biệt là lưu ý xem API đó có cấp miễn phí hay không và nếu có thì cấp đó là gì. Miễn là bạn không vượt quá tổng hạn mức hằng ngày hoặc hằng tháng được chỉ định, bạn sẽ không phải trả bất kỳ khoản phí nào. Giá và các 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 phù hợp để biết thông tin đó.

Đảm bảo bạn đã bật các dịch vụ mong muốn

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

Mặc dù việc bật API từ Cloud Console mang lại thông tin trực quan, nhưng bạn có thể sử dụng công cụ gcloud để bật tất cả các dịch vụ một cách nhanh chóng:

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

Xem thêm về chi phí

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

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

Tải tệp ZIP xuống hoặc sao chép kho lưu trữ

  • 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 phát triển cục bộ và muốn thực hiện hướng dẫn này trong Cloud Shell, bạn có thể sao chép kho lưu trữ bằng cùng một lệnh git clone tại đó.
  • Bạn cũng có thể truy cập vào tệp ZIP này thông qua nút Code (Mã) màu xanh lục như minh hoạ trong ảnh chụp màn hình sau:

5cd6110c4414cf65.png

Giờ thì 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ì có thể bạn sẽ phải xoá hoặc thay đổi các tệp. Nếu muốn triển khai theo cách 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 hiện đại của Node (>=10) và NPM (>=6)
  2. Chuyển đến nơi bạn sao chép repo (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 có mặt rồi chạy npm install

Đối với trường hợp 1 ở trên, bạn có thể xác minh phiên bản bạn có trên dòng lệnh:

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

6. Hướng dẫn về ứng dụng mẫu

Ứng dụng mẫu là một phiên bản đơ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 những gói bên thứ ba nào là bắt buộc đối với ứng dụng (xin 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 để xem cách hoạt động. Nếu bỏ qua các dòng được nhận xét về việc cấp phép, thì phần đầu và cuối sẽ trông 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à chức năng 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 này đại diện cho ứng dụng web, mã dự án trên đám mây, ứng dụng API Dịch, "đường dẫn vị trí" mẹ 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), nhưng bạn có thể thay đổi các giá trị này thành 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ữ, còn phần tử thứ hai là tên ngôn ngữ (chỉ 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 là để gửi tất cả cá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à phần cốt lõi 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 có nhiệm vụ lấy hoạt động đầu vào của người dùng và gọi Translation API để thực hiện các thao tác phức tạp. Hãy cùng phân tích chi tiết:

  1. Đặt lại các biến cơ bản cho biểu mẫu. Điều 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ế các yêu cầu này.
  2. Nếu đó là một yêu cầu POST, hãy lấy văn bản cần dịch và nếu văn bản đó không trống, hãy tạo một 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 truyền SOURCE[0] vào API cho một nguồn tiếng Anh cụ thể. Khi bỏ qua ngôn ngữ gốc, bạn đang yêu cầu API tự động phát hiện ngôn ngữ gốc (xem sourceLanguageCode trong tài liệu).
  4. Bất kể kết quả thực tế (POST) hay không có dữ liệu (GET) nào, hãy định dạng kết quả đó vào ngữ cảnh mẫu và hiển thị.

Phần hình ảnh của ứng dụng nằm trong tệp index.html mẫu. Công cụ này sẽ cho thấy mọi kết quả đã dịch trước đó (nếu không có thì sẽ trống) rồi đến biểu mẫu yêu cầu dịch nội dung:

<!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, bạn có thể chọn bất kỳ hoặc tất cả 4 lựa chọn để triển khai và chạy ứng dụng này. Tất cả các quy trình triển khai đều không bắt buộc, nghĩa là bạn có thể thực hiện bất kỳ hoặc tất cả các quy trình này.

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

7. LỰA CHỌN 1: Chạy dịch vụ cục bộ

Phần này của lớp học lập trình chỉ dành cho việc chạy cục 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 cục bộ, 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ư cho tài khoản dịch vụ
  3. Tải tệp thông tin đăng nhập xuống và gói cùng với 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 API của Google cho các ứng dụng dựa trên đám mây khi truy cập vào dữ liệu không thuộc về người dùng. Khi triển khai lên Cloud, để giảm thời gian làm quen của người dùng khi chuyển sang Cloud, tất cả các nền tảng điện toán của Google Cloud (có hoặc không có máy chủ) đều cung cấp tài khoản dịch vụ mặc định.

Tài khoản dịch vụ mặc định có một bộ quyền rộng rãi để "giảm bớt thủ tục rườm rà", nhưng khi chuẩn bị ra mắt một dịch vụ sản xuất, người dùng nên tuân theo phương pháp hay nhất về "đặc quyền tối thiểu", nhưng hãy tạo tài khoản dịch vụ do người dùng quản lý chỉ có đủ 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 cho các hoạt động triển khai cục bộ, vì vậy, bạn phải tạo một tài khoản dịch vụ cùng với một khoá tài khoản dịch vụ (thực ra là một cặp khoá công khai/riêng tư) và cung cấp những 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 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 cung cấp các quyền mong muốn. Nhớ chọn roles/cloudtranslate.user để có thể truy cập thành công vào API.

Sau khi tạo thành công 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 nó là credentials.json và di chuyển 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, trang này đề cập đến 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 chuyển sang bước tiếp theo, hãy khởi chạy máy chủ Express cục bộ bằng lệnh sau:

$ npm start

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

Listening on port 8080

Chuyển đến trình duyệt web để kết nối với trình duyệt này tại localhost:8080, bạn sẽ thấy nội dung tương tự như sau:

adc6665b7ae13c40.png

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

fc154326080bf14f.png

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

Khắc phục sự cố

Bạn có gặp phải lỗi tương tự như lỗi này khi yêu cầu 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 tệp cặp khoá công khai/khoá riêng tư credentials.json xuống. Vui lòng quay lại phần "LỰA CHỌN 1: Chạy dịch vụ cục bộ" rồi hoàn tất quy trình này và cài đặt thông tin đăng nhập trong thư mục chính trước khi tiếp tục.

8. LỰA CHỌN 2: Triển khai lên 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 đến 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 để cho App Engine biết thời gian chạy cần sử dụng bằng một dòng duy nhất:

runtime: nodejs16

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

$ gcloud app deploy

Sau khi bạn chọn một khu vực, đầu ra gcloud app deploy sẽ ít chi tiết hơn nhiều 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

Giờ đây, ứng dụng của bạn đã có mặt trên toàn cầu, bạn có thể truy cập vào ứng dụng tại URL chứa mã dự án của bạn và bạn sẽ thấy một kết quả đầu ra tương tự như phiên bản Express cục bộ, nhưng hãy lưu ý rằng ứng dụng đang chạy trên đám mây và có mặt trên toàn thế giới:

da28f951c33a2c3d.png

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

9. LỰA CHỌN 3: Triển khai lên Cloud Functions

Phần này của lớp học lập trình chỉ dành cho việc triển khai đến 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 với Cloud Functions, vì vậy, khi bạn sẵn sàng triển khai cho 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ó một REGION mặc định, nhưng bạn có thể dùng cờ --region để triển khai hàm của mình đến một khu vực cụ thể. Cloud Functions không nhắc bạn như các sản phẩm khác của Cloud. Bất kể bạn chọn khu vực nào, đầu ra gcloud functions deploy 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: '...'

Giờ đây, ứng dụng của bạn đã có mặt trên toàn cầu, bạn có thể truy cập ứng dụng tại URL chứa mã dự án của bạn như trong đầu ra triển khai (trong phần "httpsTrigger/url"). URL sẽ có dạng như sau: https://REGION-PROJECT_ID.cloudfunctions.net/translate. URL này sẽ thay đổi tuỳ thuộc vào khu vực bạn chọn cũng như mã dự án trên đám mây của bạn.

518f1c3165f2096d.png

10. LỰA CHỌ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.

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

Giờ đây, bạn đã sẵn sàng triển khai dịch vụ dịch 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ả đầu ra sẽ có dạng như sau và đưa ra 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 Buildpacks sẽ tạo các ứng dụng của bạn cho Cloud Run giống như cách bạn làm nếu chạy ứng dụng cục bộ. Đối với người dùng Node.js, công cụ này chạy npm installnpm start. Đối với Python, lệnh này sẽ 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 triển khai theo khu vực nhưng có sẵn trên toàn cầu và có thể truy cập tại URL chứa mã dự án của bạn như trong kết quả triển khai (trong "Service URL:"

169f6edf5f7d2068.png

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

31554e71cb80f1b4.png

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 xác thực cần thiết và triển khai một ứng dụng web đơn giản cho Express tại chỗ, cho App Engine, Cloud Functions và/hoặc Cloud Run. Vui lòng xem thư mục repo để 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 dịch một số lượng ký tự cố định mỗi tháng mà không tốn phí. App Engine cũng có hạn mức miễn phí, tương tự như Cloud FunctionsCloud Run. Bạn sẽ bị tính phí nếu vượt quá một trong hai hạn mức này. Nếu dự định tiếp tục đến lớp học lập trình tiếp theo, bạn không cần tắt ứng dụng.

Tuy nhiên, nếu chưa sẵn sàng chuyển sang hướng dẫn tiếp theo hoặc lo ngại rằng Internet sẽ 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á Cloud Function hoặc tắt dịch vụ Cloud Run để tránh bị tính 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 tính năng này. Mặt khác, nếu không muốn tiếp tục với ứ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ể tắt dự án của mình.

Ngoài ra, việc triển khai trên một nền tảng điện toán không máy chủ của Google Cloud sẽ phát sinh một khoản chi phí nhỏ cho việc xây dựng và lưu trữ. Cloud Build 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 sẽ tạo hình ảnh ứng dụng của bạn, sau đó lưu trữ hình ảnh đó trong Cloud Container Registry hoặc Artifact Registry (phiên bản kế nhiệm của Cloud Container Registry). Việc lưu trữ hình ảnh đó sẽ tiêu tốn một phần hạn mức, cũng như lưu lượng truyền dữ liệu ra khỏi mạng khi chuyển hình ảnh đó đến dịch vụ. Tuy nhiên, có thể bạn sinh sống ở một khu vực không có gói miễn phí như vậy, vì vậy, hãy lưu ý đến mức sử dụng bộ nhớ để giảm thiểu chi phí phát sinh.

12. Tài nguyên khác

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

Nghiên cứu bổ sung

Giờ thì bạn đã có một số kinh nghiệm sử dụng Translation API, hãy làm thêm một số bài tập để phát triển kỹ năng của mình. Để tiếp tục lộ trình học tập, 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ả cá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 trên nền tảng điện toán không máy chủ của Google Cloud (xem README của 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ợ nhiều ngôn ngữ nguồn hoặc đích.
  4. Nâng cấp ứng dụng này để có thể dịch văn bản sang nhiều ngôn ngữ; thay đổi tệp mẫu để có một trình đơn thả xuống gồm các ngôn ngữ đích được hỗ trợ.

Tìm hiểu thêm

Google App Engine

Google Cloud Functions

Google Cloud Run

Google Cloud Buildpacks, Container Registry, Artifact Registry

Google Cloud Translation và Bộ công cụ học máy của Google

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 Ghi công theo Creative Commons 2.0 chung, còn mã nguồn trong kho lưu trữ được cấp phép theo Apache 2.