Phát triển cục bộ bằng Cloud Functions cho Node.js bằng mã Visual Studio

1. Tổng quan

Google Cloud Functions là một nền tảng điện toán không máy chủ dựa trên sự kiện. Cloud Functions cho phép bạn viết mã mà không phải lo lắng về việc cung cấp tài nguyên hoặc mở rộng quy mô để xử lý các yêu cầu thường xuyên thay đổi.

Các hàm trên đám mây được viết bằng JavaScript sẽ thực thi trong môi trường Node.js trên Google Cloud Platform. Bạn có thể chạy Hàm trên đám mây trong bất kỳ môi trường thời gian chạy Node.js tiêu chuẩn nào để hỗ trợ khả năng di chuyển và kiểm thử cục bộ.

Hướng dẫn từng bước

Trong lớp học lập trình này, bạn sẽ tạo một Hàm đám mây cho Node.js để báo cáo liệu nhiệt độ đã chỉ định là chấp nhận được hay quá nóng. Bạn sẽ tạo, kiểm tra và gỡ lỗi Hàm đám mây bằng Mã Visual Studio trên máy cục bộ của mình. Cuối cùng, bạn sẽ triển khai chức năng của mình trên Google Cloud Platform.

Kiến thức bạn sẽ học được

  • Khung chức năng cho Node.js.
  • Tạo và kiểm thử cục bộ một Hàm đám mây HTTP.
  • Gỡ lỗi một Hàm HTTP trên máy cục bộ.
  • Triển khai hàm HTTP từ máy cục bộ.

2. Cách thiết lập và các yêu cầu

Điều kiện tiên quyết

Chi phí

Mặc dù lớp học lập trình này chỉ yêu cầu 1 lệnh gọi của một Hàm trên đám mây đã triển khai, nhưng bạn vẫn nên tham khảo thông tin về giá của API Hàm trên đám mây để hiểu cách hoạt động của tính năng thanh toán.

Mặc dù bạn có thể sử dụng nhiều API của Google mà không mất phí, nhưng việc sử dụng Google Cloud Platform (tức là các sản phẩm và API của nền tảng này) thì không miễn phí. Bạn cần có một tài khoản thanh toán đang hoạt động để sử dụng Cloud Functions. Xin lưu ý rằng một số sản phẩm của Google Cloud Platform (GCP) có gói "Luôn miễn phí". Bạn phải vượt quá giới hạn của gói này thì mới phải trả phí. Trong phạm vi của lớp học lập trình này, mỗi lệnh gọi Cloud Functions sẽ được tính vào bậc miễn phí đó. Bạn sẽ không phải chịu bất kỳ khoản phí nào nếu tổng cộng không vượt quá hạn mức của ứng dụng (trong vòng mỗi tháng).

3. Cài đặt Khung hàm cho Node.js

Khung hàm cho Node.js là khung FaaS (Hàm dưới dạng dịch vụ) nguồn mở để viết các hàm Node.js di động do nhóm Google Cloud Functions cung cấp cho bạn.

Khung hàm cho phép bạn viết các hàm gọn nhẹ chạy trong nhiều môi trường, bao gồm:

  • Google Cloud Functions
  • Máy phát triển cục bộ của bạn
  • Cloud Run và Cloud Run trên GKE
  • Môi trường dựa trên Knative

Tạo ứng dụngnode.js mới.

npm init

Khi chấp nhận các giá trị mặc định, hãy nhớ sử dụng index.js làm điểm truy cập cho ứng dụng.

Bây giờ, hãy cài đặt Khung hàm cho Node.js.

npm install @google-cloud/functions-framework

Mở package.json. Xác minh rằng bạn thấy khung hàm được liệt kê dưới dạng phần phụ thuộc như trong ví dụ bên dưới.

"dependencies": {
   "@google-cloud/functions-framework": "^1.7.1"
 }

Khung chức năng đã được cài đặt thành công. Giờ thì bạn đã sẵn sàng tạo Hàm trên đám mây.

4. Tạo và kiểm thử cục bộ một Hàm đám mây HTTP

Tạo một Hàm trên đám mây cục bộ

Trong phần này, bạn sẽ tạo và kiểm thử một Hàm HTTP phản hồi các yêu cầu HTTP.

Tạo một tệp mới có tên là index.js trong cùng thư mục với tệp package.json.

Thêm nội dung như sau:

exports.validateTemperature = async (req, res) => {
 try {
   if (req.body.temp < 100) {
     res.status(200).send("Temperature OK");
   } else {
     res.status(200).send("Too hot");
   }
 } catch (error) {
   //return an error
   console.log("got error: ", error);
   res.status(500).send(error);
 }
};

Giờ thì bạn đã có thể kiểm thử hàm này.

Kiểm thử hàm trong Visual Studio Code

Từ thời điểm này trở đi, lớp học lập trình này sử dụng thiết bị đầu cuối tích hợp trong Visual Studio Code.

Trong Visual Studio Code, hãy mở một cửa sổ dòng lệnh.

Chạy lệnh sau:

node node_modules/@google-cloud/functions-framework --target=validateTemperature

Lệnh này khởi động một máy chủ cục bộ sẵn sàng gọi hàm validateTemperature khi máy chủ nhận được yêu cầu HTTP.

Bạn sẽ thấy kết quả sau đây trong cửa sổ dòng lệnh:

Serving function...
Function: validateTemperature
URL: http://localhost:8080/

Tạo cửa sổ dòng lệnh thứ hai trong VS Code bằng cách nhấp vào biểu tượng dấu cộng New Terminal trong ngăn cửa sổ dòng lệnh. Bạn sẽ chuyển đổi giữa hai cửa sổ đầu cuối này: cửa sổ đầu tiên dùng để phân phát hàm và cửa sổ thứ hai để gọi hàm bằng curl.

bceb65f366d837ae.png

Bạn có thể chuyển đổi giữa các cửa sổ dòng lệnh bằng cách sử dụng trình đơn thả xuống. Nếu một cửa sổ dòng lệnh đang phân phát một hàm, thì danh sách thả xuống sẽ gọi là node. Nếu không, thuộc tính này sẽ được tham chiếu đến zsh (hoặc shell bạn đang sử dụng).

Trong cửa sổ dòng lệnh thứ hai, hãy chạy lệnh sau để gửi tải trọng nhiệt độ là 50 đến máy chủ cục bộ đang phân phát hàm validateTemperature.

curl -X POST http://localhost:8080 -H "Content-Type:application/json"  -d '{"temp":"50"}'

Bạn sẽ nhận được phản hồi sau đây từ hàm trên đám mây:

Temperature OK

Trong cửa sổ dòng lệnh thứ hai, hãy kiểm thử lại hàm này bằng cách gửi tải trọng nhiệt độ "quá cao" như minh hoạ bên dưới:

curl -X POST http://localhost:8080 -H "Content-Type:application/json"  -d '{"temp":"120"}'

Bạn sẽ nhận được phản hồi sau đây từ hàm trên đám mây:

Too hot

Cuối cùng, hãy kiểm thử hàm bằng cách gọi hàm đó với tải trọng bị thiếu.

curl -X POST http://localhost:8080

Bạn sẽ nhận được phản hồi sau đây từ hàm trên đám mây:

Too hot

Lý tưởng nhất là hàm không được trả về "quá nóng" nếu không có nhiệt độ nào được cung cấp. Bạn phát hiện thấy lỗi trong mã.

Hãy nhớ dừng chạy hàm bằng cách nhấn vào Ctrl + C trong cửa sổ dòng lệnh đầu tiên phục vụ hàm của bạn.

5. Gỡ lỗi một Hàm HTTP trên máy cục bộ

Mở Bảng điều khiển lệnh trong Mã Visual Studio. Nếu bạn đang dùng máy Mac, hãy sử dụng Cmd + Shift + P. Nếu bạn đang dùng Windows, hãy sử dụng Ctrl + Shift + P.

Nhập auto attach trong Bảng điều khiển lệnh và chọn mục trên cùng trong danh sách.

601e542b4ec9f6f9.png

Đối với lớp học lập trình này, hãy chọn Only With Flag như trong hình ảnh dưới đây:

b9e6b762d150e62b.png

Bây giờ, hãy tải lại cửa sổ dòng lệnh mà bạn đã dùng trong VS Code để thực hiện hàm của bạn bằng cách di chuột qua biểu tượng cảnh báo xuất hiện ở ngoài cùng bên phải.

Nhấp vào Relaunch Terminal.

37b61e3fb546fc76.pngS

Trong cửa sổ dòng lệnh đã tải lại, hãy chạy lại khung hàm để cung cấp hàm của bạn bằng lệnh sau:

node --inspect node_modules/.bin/functions-framework --target=validateTemperature

trong đó cờ --inspect yêu cầu Node.js theo dõi ứng dụng gỡ lỗi. Để biết thêm thông tin, vui lòng xem Tài liệu về nút về cách gỡ lỗi.

Xin lưu ý rằng bạn đang sử dụng node_modules/.bin/functions-framework thay vì node_modules/@google-cloud/functions-framework. Bạn cần sử dụng tệp thực thi được liên kết tượng trưng tự động trong /node_modules/.bin để sử dụng chế độ kiểm tra.

Lần này, bạn sẽ thấy thanh trạng thái màu cam trong Mã VS cho biết trình gỡ lỗi đã được đính kèm.

Đặt điểm ngắt tại dòng 3 bằng cách nhấp vào bên trong lề ở bên trái số dòng.

2fbb4d5916e1dbfa.png.

Biểu tượng điểm ngắt sẽ phát sáng màu đỏ tươi, cho biết dòng mã này có thể truy cập được bằng trình gỡ lỗi.

846e6c5993cc87f9.pngS

Trong cửa sổ dòng lệnh thứ hai, hãy nhấn vào điểm ngắt bằng cách chạy lệnh curl sau.

curl -X POST http://localhost:8080 

Bạn sẽ thấy một ô được đánh dấu màu vàng xuất hiện trên dòng 3. Phần nổi bật này cho biết dòng này là câu lệnh hiện tại đang được trình gỡ lỗi đánh giá.

206c7ed1eb189e90.pngS

Di chuột qua biến nhiệt độ để xác minh rằng nội dung của biến đó là undefined, vì yêu cầu không cung cấp tải trọng nhiệt độ.

97979025f4bf2842.png

Nhấp vào biểu tượng bước qua để thực thi câu lệnh tiếp theo.

Bạn sẽ thấy câu lệnh hiện tại chuyển sang phần khác của câu lệnh if.

cf0e8ce7e0388f98.png

Đối với bản minh hoạ này, bạn có thể giả định rằng thông số kỹ thuật yêu cầu tất cả các yêu cầu phải gửi một chỉ số nhiệt độ. Trong trường hợp hiếm gặp, chỉ số nhiệt độ không được cung cấp, hàm sẽ gửi một ngoại lệ.

Nhấp vào nút Ngắt kết nối để ngắt kết nối trình gỡ lỗi.

1070d059775ad769.pngS

Trong cửa sổ dòng lệnh đầu tiên, hãy dừng phân phát hàm của bạn bằng cách nhấn phím Ctrl + C.

Cập nhật hàm của bạn để thêm câu lệnh if để gửi một ngoại lệ nếu nhiệt độ không xác định, như minh hoạ dưới đây:

exports.validateTemperature = async (req, res) => {

 try {

   // add this if statement below line #2
   if (!req.body.temp) {
     throw "Temperature is undefined";
   }

 ...

Trong cửa sổ dòng lệnh đầu tiên, hãy bắt đầu chạy lại hàm trên đám mây bằng cách chạy lệnh sau không có cờ –inspect để tránh đính kèm trình gỡ lỗi.

node node_modules/@google-cloud/functions-framework --target=validateTemperature

Xác minh rằng một ngoại lệ được gửi bằng cách chạy lệnh sau trong cửa sổ dòng lệnh thứ hai của bạn:

curl -X POST http://localhost:8080 

Bạn sẽ thấy kết quả sau được trả về từ yêu cầu của mình:

Temperature is undefined

Trong cửa sổ dòng lệnh đầu tiên, bạn cũng sẽ thấy lỗi mà hàm của bạn ghi lại.

Serving function...
Function: validateTemperature
URL: http://localhost:8080/
got error:  Temperature is undefined

Bây giờ, bạn có thể dừng chạy hàm bằng cách nhấn Ctrl + C trong cửa sổ dòng lệnh đầu tiên.

6. Triển khai hàm HTTP từ máy cục bộ lên Google Cloud

Giờ đây, khi đã tạo, kiểm thử và gỡ lỗi một Hàm trên đám mây trên máy cục bộ, bạn đã sẵn sàng triển khai hàm đó trên Google Cloud.

Xác minh rằng bạn đang sử dụng dự án đã tạo ở Bước 2 trên máy bằng cách chạy lệnh sau:

gcloud config get-value project

Nếu dự án mà bạn chỉ định ở Bước 2 không phải là cấu hình đang hoạt động, hãy chạy lệnh sau:

gcloud config set project <project-name-created-step-2>

Trong bất kỳ cửa sổ dòng lệnh nào, hãy chạy lệnh sau:

gcloud functions deploy validateTemperature --trigger-http --runtime nodejs12 --allow-unauthenticated

trong đó các tham số được giải thích như sau:

  • deploy validateTemperature – lệnh con gcloud để triển khai một Chức năng đám mây có tên validateTemperature với một điểm truy cập có tên là validateTemperature
  • --trigger-http – loại sự kiện kích hoạt
  • --runtime nodejs12 – thời gian chạy được nhắm mục tiêu cho hàm này
  • --allow-unauthenticated – cho phép truy cập công khai để gọi hàm

Bạn sẽ được nhắc bật API của Cloud Functions. Nhập y để bật các API.

API [cloudfunctions.googleapis.com] not enabled on project 
[1057316433766]. Would you like to enable and retry (this will take a 
few minutes)? (y/N)? y 

Sau khi triển khai xong, bạn sẽ thấy kết quả sau:

Deploying function (may take a while - up to 2 minutes)...done. 
availableMemoryMb: 256
buildId: <your-build-id>
entryPoint: validateTemperature
httpsTrigger:
  url: https://<your-region-and-project>.cloudfunctions.net/validateTemperature
...

Trong cửa sổ dòng lệnh, hãy sử dụng curl để gọi điểm cuối công khai này.

curl -X POST https://<your-region-and-project>.cloudfunctions.net/validateTemperature -H "Content-Type:application/json"  -d '{"temp":"50"}'

và xác nhận rằng bạn đã triển khai thành công hàm trên đám mây bằng cách xác minh phản hồi thích hợp.

Temperature OK

7. Dọn dẹp

Để tránh bị tính phí do nhầm lẫn (ví dụ: Hàm trên đám mây này vô tình được gọi nhiều lần hơn mức phân bổ số lần gọi Hàm trên đám mây hằng tháng trong cấp miễn phí), bạn có thể xoá Hàm trên đám mây hoặc xoá dự án mà bạn đã tạo ở Bước 2.

Để xoá Hàm trên đám mây, hãy truy cập vào Google Cloud Console của Hàm trên đám mây tại https://console.cloud.google.com/functions/ Đảm bảo dự án bạn đã tạo ở bước 2 là dự án hiện được chọn.

Chọn hàm validateTemperature mà bạn đã triển khai ở Bước 6. Sau đó, nhấn vào Xoá.

4dada486485a935a.pngS

Nếu chọn xoá toàn bộ dự án, bạn có thể truy cập vào https://console.cloud.google.com/cloud-resource-manager, chọn dự án bạn đã tạo ở Bước 2 rồi chọn Xoá. Nếu xoá dự án, bạn sẽ phải thay đổi các dự án trong Cloud SDK của mình. Bạn có thể xem danh sách tất cả dự án hiện có bằng cách chạy danh sách dự án gcloud.

8. Xin chúc mừng!

Chúc mừng bạn đã hoàn thành lớp học lập trình này. Bạn có thể tìm hiểu thêm về cách Cloud Functions hỗ trợ môi trường thời gian chạy Node.jscách gỡ lỗi cục bộ hoạt động với Cloud Functions.

Nội dung đã đề cập

  • Khung chức năng cho Node.js.
  • Tạo và kiểm thử cục bộ một Hàm đám mây HTTP.
  • Gỡ lỗi một Hàm HTTP trên máy cục bộ.
  • Triển khai hàm HTTP từ máy cục bộ.