1. Tổng quan
Google Cloud Functions là một nền tảng điện toán không máy chủ hoạt động theo sự kiện. Cloud Functions cho phép bạn viết mã mà không cần 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 thay đổi.
Cloud Functions đượ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 Cloud Function trong bất kỳ thời gian chạy Node.js tiêu chuẩn nào để bật tính năng di động và kiểm thử cục bộ.
Hướng dẫn
Trong lớp học lập trình này, bạn sẽ tạo một Cloud Function cho Node.js để báo cáo xem nhiệt độ được chỉ định có chấp nhận được hay quá nóng hay không. Bạn sẽ tạo, kiểm thử và gỡ lỗi Cloud Function bằng Visual Studio Code trên máy cục bộ. Cuối cùng, bạn sẽ triển khai hàm của mình lên Google Cloud Platform.
Kiến thức bạn sẽ học được
- Functions Framework cho Node.js.
- Tạo và kiểm thử Cloud Function HTTP cục bộ.
- Gỡ lỗi một hàm HTTP từ máy cục bộ.
- Triển khai một hàm HTTP từ máy cục bộ.
2. Thiết lập và yêu cầu
Điều kiện tiên quyết
- Cloud SDK
- Visual Studio Code
- Node.js 8.6.0 trở lên (để cài đặt Node.js, hãy sử dụng nvm, để kiểm tra phiên bản, hãy chạy node –version)
- Xem toàn bộ hướng dẫn Hàm đầu tiên của tôi: Node.js
Chi phí
Mặc dù lớp học lập trình này chỉ yêu cầu 1 lần gọi Cloud Function đã triển khai, nhưng bạn vẫn nên tham khảo thông tin về giá của Cloud Functions API để hiểu cách tính phí.
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) 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í" mà bạn phải vượt quá để bị tính phí. Đối với mục đích của lớp học lập trình, mỗi lần gọi Cloud Functions sẽ được tính vào gói miễn phí đó. Miễn là bạn vẫn nằm trong giới hạn tổng hợp (trong mỗi tháng), bạn sẽ không bị tính phí.
3. Cài đặt Functions Framework cho Node.js
Functions Framework cho Node.js là một khung FaaS (Function as a Service) nguồn mở để viết các hàm Node.js di động do nhóm Google Cloud Functions cung cấp.
Functions Framework cho phép bạn viết các hàm gọn nhẹ chạy trong nhiều môi trường khác nhau, bao gồm:
- Google Cloud Functions
- Máy phát triển cục bộ
- Cloud Run và Cloud Run trên GKE
- Môi trường dựa trên Knative
Tạo một ứng dụng node.js mới.
npm init
Trong 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 Functions Framework 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ê là một phần phụ thuộc như trong ví dụ bên dưới.
"dependencies": {
"@google-cloud/functions-framework": "^1.7.1"
}
Functions Framework hiện đã được cài đặt thành công. Bây giờ, bạn đã sẵn sàng tạo Cloud Function.
4. Tạo và kiểm thử Cloud Function HTTP cục bộ
Tạo Cloud Function 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);
}
};
Bây giờ, bạn đã sẵn sàng kiểm thử hàm.
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ẽ 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 một 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ổ dòng lệnh này: cửa sổ đầu tiên để phân phát hàm và cửa sổ thứ hai để gọi hàm bằng curl.

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 hiện đang phân phát một hàm, thì danh sách thả xuống sẽ tham chiếu đến cửa sổ đó là node. Nếu không, danh sách này sẽ được tham chiếu đến zsh (hoặc trình bao 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ộ 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ừ Cloud Function:
Temperature OK
Trong cửa sổ dòng lệnh thứ hai, hãy kiểm thử lại hàm 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ừ Cloud Function:
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ừ Cloud Function:
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 một lỗi trong mã.
Hãy nhớ dừng hàm của bạn bằng cách nhấn Ctrl + C trong cửa sổ dòng lệnh đầu tiên phân phát hàm.
5. Gỡ lỗi một hàm HTTP từ máy cục bộ
Mở Bảng lệnh trong Visual Studio Code. 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 vào Bảng lệnh rồi chọn mục trên cùng trong danh sách.

Đối với lớp học lập trình này, hãy chọn Only With Flag như minh hoạ trong hình bên dưới:

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

Từ cửa sổ dòng lệnh đã tải lại, hãy chạy lại khung hàm để phân phát hàm bằng lệnh sau:
node --inspect node_modules/.bin/functions-framework --target=validateTemperature
trong đó cờ --inspect cho biết Node.js sẽ lắng nghe một ứng dụng gỡ lỗi. Để biết thêm thông tin, vui lòng xem tài liệu về gỡ lỗi của Node.
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 một thanh trạng thái màu cam trong VS Code cho biết rằng trình gỡ lỗi đã được đính kèm.
Đặt một điểm ngắt ở dòng 3 bằng cách nhấp vào bên trong lề ở bên trái số dòng.

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

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 điểm đánh dấu màu vàng xuất hiện trên dòng 3. Điểm đánh dấu 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á.

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

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 đến phần else của câu lệnh if.

Đố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 gửi số đọc nhiệt độ. Trong trường hợp không có số đọc nhiệt độ, hàm sẽ tạo một ngoại lệ.
Nhấp vào nút Disconnect (Ngắt kết nối) để ngắt kết nối trình gỡ lỗi.

Trong cửa sổ dòng lệnh đầu tiên, hãy dừng việc phân phát hàm bằng cách nhấn Ctrl + C.
Cập nhật hàm để thêm câu lệnh if nhằm tạo một ngoại lệ nếu nhiệt độ không xác định như minh hoạ bên dưới:
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 Cloud Function bằng cách chạy lệnh sau mà 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 tạo bằng cách chạy lệnh sau trong cửa sổ dòng lệnh thứ hai:
curl -X POST http://localhost:8080
Bạn sẽ thấy kết quả sau đây được trả về từ yêu cầu:
Temperature is undefined
Trong cửa sổ dòng lệnh đầu tiên, bạn cũng sẽ thấy lỗi do 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 một hàm HTTP từ máy cục bộ lên Google Cloud
Bây giờ bạn đã tạo, kiểm thử và gỡ lỗi một Cloud Function trên máy cục bộ, bạn đã sẵn sàng triển khai hàm đó lên Google Cloud.
Xác minh rằng bạn đang sử dụng dự án mà bạn đã tạo ở Bước 2 cục bộ 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 Cloud Function có tên làvalidateTemperaturevớ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 Cloud Functions API. 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 quá trình triển khai hoàn tất, bạn sẽ thấy nội dung sau trong kết quả đầu ra:
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 Cloud Function của bạn đã được triển khai thành công 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í ngoài ý muốn, chẳng hạn như Cloud Function này vô tình được gọi nhiều lần hơn hạn mức gọi Cloud Function hằng tháng trong gói miễn phí, bạn có thể xoá Cloud Function hoặc xoá dự án mà bạn đã tạo ở Bước 2.
Để xoá Cloud Function, hãy chuyển đến Cloud Console của Cloud Function tại https://console.cloud.google.com/functions/ Đảm bảo rằng dự án mà 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á.

Nếu chọn xoá toàn bộ dự án, bạn có thể chuyển đến https://console.cloud.google.com/cloud-resource-manager, chọn dự án mà bạn đã tạo ở Bước 2 rồi chọn Xoá. Nếu xoá dự án, bạn cần thay đổi dự án trong Cloud SDK. Bạn có thể xem danh sách tất cả các dự án hiện có bằng cách chạy gcloud projects list.
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ợ thời gian chạy Node.js và cách gỡ lỗi cục bộ hoạt động với Cloud Functions.
Nội dung chúng ta đã đề cập
- Functions Framework cho Node.js.
- Tạo và kiểm thử Cloud Function HTTP cục bộ.
- Gỡ lỗi một hàm HTTP từ máy cục bộ.
- Triển khai một hàm HTTP từ máy cục bộ.