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ô để đáp ứng 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 Functions trong bất kỳ thời gian chạy Node.js tiêu chuẩn nào để bật tính di động 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 Cloud Function cho Node.js để báo cáo xem một nhiệt độ cụ thể có chấp nhận được hay quá nó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ử một HTTP Cloud Function cục bộ.
- Gỡ lỗi một hàm HTTP trên 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)
- Hoàn thành Hàm đầu tiên của tôi: Hướng dẫn về Node.js
Chi phí
Mặc dù lớp học lập trình này chỉ yêu cầu 1 lời gọi Cloud Functions đã 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á hạn mức thì mới phải trả phí. Để phục vụ cho mục đích của lớp học lập trình, mỗi lần gọi Cloud Functions đều được tính vào bậc miễn phí đó. Miễn là bạn không vượt quá hạn mức tổng thể (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 (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.
Functions Framework cho phép bạn viết các hàm đơn giản 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ớ dùng index.js làm điểm truy cập cho ứng dụng của bạn.
Bây giờ, hãy cài đặt Functions Framework cho Node.js.
npm install @google-cloud/functions-framework
Mở tệp package.json. Hãy xác minh rằng bạn thấy khung hàm được liệt kê dưới dạng một phần phụ thuộc như trong ví dụ bên dưới.
"dependencies": {
"@google-cloud/functions-framework": "^1.7.1"
}
Giờ đây, bạn đã cài đặt thành công Functions Framework. Giờ thì bạn đã sẵn sàng tạo Cloud Function.
4. Tạo và kiểm thử một HTTP Cloud Function cục bộ
Tạo một 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 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 đã 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 một yêu cầu HTTP.
Bạn sẽ thấy kết quả sau 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ổ thiết bị đầu cuối 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 cách sử dụng curl.

Bạn có thể chuyển đổi giữa các cửa sổ thiết bị đầu cuối bằng cách sử dụng trình đơn thả xuống. Nếu 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ẽ gọi hàm đó là node. Nếu không, nó sẽ được đề cập đến zsh (hoặc trình bao mà 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 đám mây:
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ừ hàm đá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 một 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 đám mây:
Too hot
Lý tưởng nhất là hàm không nên trả về "quá nóng" nếu không có nhiệt độ nào được cung cấp. Bạn đã phát hiện ra một lỗi trong mã.
Nhớ dừng hàm đang chạy bằng cách nhấn Ctrl + C trong cửa sổ dòng lệnh đầu tiên đang phân phát 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 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 hàng đầu tiên 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ư trong hình bên dưới:

Bây giờ, hãy tải lại cửa sổ thiết bị đầu cuối mà bạn đã 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.

Trong 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ẽ chờ 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.
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 đ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ẽ có 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 đ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 phần đá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 lên biến tạm thời để 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 độ.

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 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 quy cách yêu cầu tất cả các yêu cầu gửi một chỉ số nhiệt độ. Trong trường hợp hiếm gặp là không có chỉ số nhiệt độ, hàm sẽ tạo ra 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.

Trong cửa sổ dòng lệnh đầu tiên, hãy nhấn Ctrl + C để dừng việc phân phát hàm đang chạy.
Cập nhật hàm để thêm câu lệnh if nhằm 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 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 đưa ra 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 của mình:
Temperature is undefined
Trong cửa sổ thiết bị đầu cuối đầu tiên, bạn cũng sẽ thấy lỗi do hàm của mình ghi lại.
Serving function... Function: validateTemperature URL: http://localhost:8080/ got error: Temperature is undefined
Giờ đây, bạn có thể dừng chạy hàm bằng cách nhấn tổ hợp phím 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
Giờ đây, sau khi 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 Cloud Function đó 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 cửa sổ dòng lệnh bất kỳ, 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 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 đầ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ổ thiết bị đầu cuối, hãy 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 hàm đám mây 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 được gọi nhiều lần hơn hạn mức gọi Cloud Function hằng tháng của bạn trong cấp 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 truy cập vào Cloud Console của Cloud Function 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á.
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ẽ 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 lệnh 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 đã đề cập
- Functions Framework cho Node.js.
- Tạo và kiểm thử một HTTP Cloud Function cục bộ.
- Gỡ lỗi một hàm HTTP trên máy cục bộ.
- Triển khai một hàm HTTP từ máy cục bộ.