1. Giới thiệu
Các hàm Google Cloud Run là một nền tảng điện toán không máy chủ hoạt động theo sự kiện. Các hàm Cloud Run 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.
Có hai loại hàm Cloud Run:
- Các hàm HTTP phản hồi các yêu cầu HTTP.
- Các hàm sự kiện được kích hoạt bởi các sự kiện, chẳng hạn như một thông báo được xuất bản trên Cloud Pub/Sub hoặc một tệp được tải lên Cloud Storage.

Lớp học lập trình này sẽ hướng dẫn bạn cách tạo các hàm Cloud Run của riêng mình bằng C#. Cụ thể hơn, bạn sẽ triển khai các hàm C# phản hồi HTTP và CloudEvents từ nhiều nguồn trên Google Cloud.
Kiến thức bạn sẽ học được
- Functions Framework cho .NET.
- Cách viết một Hàm HTTP.
- Cách viết một hàm được kích hoạt bởi sự kiện để phản hồi các sự kiện Cloud Storage.
- Cách viết một hàm được kích hoạt bằng sự kiện để phản hồi các sự kiện Cloud Pub/Sub.
- Cách viết một hàm được kích hoạt bởi sự kiện để phản hồi mọi loại sự kiện.
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
- Đă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.



- 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 sử dụng. Bạn có thể cập nhật thông tin 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). Nếu không thích mã nhận dạng được tạo, bạn có thể tạo một mã nhận dạng ngẫu nhiên khác. Hoặc bạn có thể thử tên người dùng của riêng mình để xem tên đó có dùng được hay không. Bạn không thể thay đổi thông tin này sau bước này và thông tin này sẽ giữ nguyên trong suốt thời gian diễn ra dự án. - Để bạn biết, 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.
- 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 phát sinh phí thanh toán ngoài hướng dẫn này, bạn có thể xoá các tài nguyên đã tạo hoặc xoá toàn bộ dự án. 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.
Khởi động Cloud Shell
Mặc dù có thể vận hành Google Cloud từ xa trên máy tính xách tay, nhưng trong lớp học lập trình này, bạn sẽ sử dụng Google Cloud Shell, một môi trường dòng lệnh chạy trên Cloud.
Trên Bảng điều khiển Google Cloud, hãy nhấp vào biểu tượng Cloud Shell trên thanh công cụ ở trên cùng bên phải:

Quá trình này chỉ mất vài phút để cung cấp và kết nối với môi trường. Khi quá trình này kết thúc, bạn sẽ thấy như sau:

Máy ảo này được trang bị tất cả các công cụ phát triển mà bạn cần. Nó cung cấp một thư mục chính có dung lượng 5 GB và chạy trên Google Cloud, giúp tăng cường đáng kể hiệu suất mạng và hoạt động xác thực. Bạn có thể thực hiện mọi thao tác trong lớp học lập trình này trong trình duyệt. Bạn không cần cài đặt bất cứ thứ gì.
3. Trước khi bắt đầu
Trong Cloud Shell, hãy chạy lệnh sau để bật các dịch vụ bắt buộc:
gcloud services enable \ artifactregistry.googleapis.com \ cloudbuild.googleapis.com \ cloudfunctions.googleapis.com \ eventarc.googleapis.com \ run.googleapis.com
Tiếp theo, hãy đặt khu vực của bạn.
REGION=<YOUR_REGION>
Trong lớp học lập trình này, bạn sẽ tạo một tài khoản dịch vụ có các quyền EventArc bắt buộc và vai trò người gọi Cloud Run để nhận một sự kiện từ Cloud Storage và gọi hàm Cloud Run.
Trước tiên, hãy tạo tài khoản dịch vụ.
PROJECT_ID=$(gcloud config get-value core/project) PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format='value(projectNumber)') SERVICE_ACCOUNT="cloud-run-functions" SERVICE_ACCOUNT_ADDRESS=$SERVICE_ACCOUNT@$PROJECT_ID.iam.gserviceaccount.com gcloud iam service-accounts create $SERVICE_ACCOUNT \ --display-name="Cloud Run functions Eventarc service account"
Tiếp theo, hãy cấp vai trò Eventarc Event Receiver (roles/eventarc.eventReceiver) cho dự án đối với tài khoản dịch vụ được liên kết với trình kích hoạt Eventarc để trình kích hoạt có thể nhận các sự kiện từ nhà cung cấp sự kiện.
gcloud projects add-iam-policy-binding $PROJECT_ID \ --member serviceAccount:$SERVICE_ACCOUNT_ADDRESS \ --role=roles/eventarc.eventReceiver
Sau đó, cấp cho tài khoản dịch vụ vai trò người gọi Cloud Run để tài khoản đó có thể gọi hàm.
gcloud projects add-iam-policy-binding $PROJECT_ID \ --member serviceAccount:$SERVICE_ACCOUNT_ADDRESS \ --role=roles/run.invoker
4. Functions Framework cho .NET
Functions Framework for .NET là một khung FaaS (Hàm dưới dạng dịch vụ) nguồn mở để viết các hàm .NET có thể di động – do nhóm Google Cloud Functions cung cấp.
Functions Framework cho phép bạn viết các hàm có dung lượng nhỏ chạy trong nhiều môi trường khác nhau, bao gồm:
- Các hàm Google Cloud Run
- 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
Trong lớp học lập trình này, bạn sẽ sử dụng Functions Framework cho .NET và các mẫu của nó để tạo và triển khai Cloud Functions bằng C#.
Trong Cloud Shell, hãy chạy lệnh sau để cài đặt mẫu Cloud Functions cho dotnet:
dotnet new install Google.Cloud.Functions.Templates
Thao tác này sẽ cài đặt 3 mẫu cho dotnet. Mỗi mẫu có sẵn bằng C#, F# và VB (nhưng bạn sẽ chỉ sử dụng C# trong phòng thí nghiệm này). Bạn có thể xác minh rằng các mẫu đã được cài đặt bằng cách chạy:
dotnet new list Templates Short Name ----------------------------------------------------------------------- Google Cloud Functions CloudEvent Function gcf-event Google Cloud Functions CloudEvent Function (Untyped) gcf-untyped-event Google Cloud Functions HttpFunction gcf-http
5. Hàm HTTP
Bạn sẽ tạo và triển khai một Hàm HTTP phản hồi các yêu cầu HTTP.
Tạo một Hàm HTTP bằng mẫu gcf-http:
mkdir HelloHttp cd HelloHttp dotnet new gcf-http
Thao tác này sẽ tạo một dự án và một tệp Function.cs phản hồi các yêu cầu HTTP.
Thay đổi khung mục tiêu thành net8.0 trong tệp .csproj:
<TargetFramework>net8.0</TargetFramework>
Để triển khai một hàm Cloud Run trực tiếp lên Cloud Run, hãy chạy lệnh sau:
gcloud beta run deploy hello-http-function \
--source . \
--function HelloHttp.Function \
--base-image dotnet8 \
--region $REGION \
--allow-unauthenticated
Nếu bạn muốn triển khai dưới dạng Cloud Functions thế hệ thứ 2, hãy dùng lệnh sau:
gcloud functions deploy hello-http-function \
--allow-unauthenticated \
--entry-point HelloHttp.Function \
--gen2 \
--region $REGION \
--runtime dotnet8 \
--trigger-http
Sau khi triển khai hàm, bạn có thể gọi hàm đó bằng lệnh curl sau:
SERVICE_URL=$(gcloud run services describe hello-http-function --platform managed --region $REGION --format 'value(status.url)') curl $SERVICE_URL
6. Hàm CloudEvent – GCS
Bạn sẽ tạo và triển khai một Hàm CloudEvent để phản hồi các sự kiện Google Cloud Storage (GCS).
Trước tiên, hãy tạo một bộ chứa Cloud Storage. Đây là nhóm mà bạn sẽ theo dõi các sự kiện sau này:
BUCKET_NAME="cloud-functions-bucket-${PROJECT_ID}"
gsutil mb -l us-central1 gs://${BUCKET_NAME}
Tạo một Hàm CloudEvent bằng mẫu gcf-event:
cd .. mkdir HelloGcs cd HelloGcs dotnet new gcf-event
Thao tác này sẽ tạo một dự án và một tệp Function.cs để phản hồi các yêu cầu CloudEvent. Thao tác này cũng phân tích cú pháp dữ liệu của CloudEvent thành StorageObjectData.
Thay đổi khung mục tiêu thành net8.0 trong tệp .csproj:
<TargetFramework>net8.0</TargetFramework>
Để triển khai một hàm Cloud Run trực tiếp lên Cloud Run, trước tiên, bạn sẽ triển khai hàm đó rồi tạo một trình kích hoạt cho hàm.
gcloud beta run deploy hello-gcs-function \
--source . \
--function HelloGcs.Function \
--region $REGION \
--base-image dotnet8 \
--no-allow-unauthenticated
Bây giờ, hãy tạo trình kích hoạt cho Cloud Run Function
BUCKET_REGION=$REGION
gcloud eventarc triggers create hello-gcs-function-trigger \
--location=$REGION \
--destination-run-service=hello-gcs-function \
--destination-run-region=$BUCKET_REGION \
--event-filters="type=google.cloud.storage.object.v1.finalized" \
--event-filters="bucket=$BUCKET_NAME" \
--service-account=$SERVICE_ACCOUNT_ADDRESS
Nếu muốn triển khai dưới dạng Cloud Functions thế hệ thứ 2, bạn có thể dùng lệnh sau để triển khai hàm bằng cách sử dụng cờ trigger-event và trigger-resource:
gcloud functions deploy hello-gcs-function \
--allow-unauthenticated \
--entry-point HelloGcs.Function \
--gen2 \
--region $REGION \
--runtime dotnet8 \
--trigger-event google.storage.object.finalize \
--trigger-resource ${BUCKET_NAME} \
--service-account=$SERVICE_ACCOUNT_ADDRESS
Sau vài phút, hàm sẽ xuất hiện trong Cloud Console:

Kích hoạt hàm bằng cách tải một tệp lên vùng lưu trữ:
echo "Hello from Storage" > random.txt
gsutil cp random.txt gs://${BUCKET_NAME}
Xác minh rằng hàm đã được kích hoạt bằng cách đọc nhật ký:
Đối với một hàm Cloud Run, bạn có thể chạy lệnh sau:
gcloud logging read "resource.labels.service_name=hello-gcs-function AND textPayload: Name" --format=json
Đối với hàm thế hệ thứ 2, bạn có thể chạy lệnh sau:
gcloud functions logs read hello-gcs-function \
--gen2 \
--region us-central1
7. Hàm CloudEvent – Pub/Sub
Bạn sẽ tạo và triển khai một Hàm CloudEvent để phản hồi các sự kiện Cloud Pub/Sub.
Trước tiên, hãy tạo một chủ đề Cloud Pub/Sub sẽ phát ra các sự kiện:
TOPIC_NAME=cloud-functions-topic
gcloud pubsub topics create ${TOPIC_NAME}
Tạo một Hàm CloudEvent bằng mẫu gcf-event:
cd .. mkdir HelloPubSub cd HelloPubSub dotnet new gcf-event
Thao tác này sẽ tạo một dự án và một tệp Function.cs để phản hồi các yêu cầu CloudEvent. Theo mặc định, nó cũng phân tích cú pháp dữ liệu của CloudEvent thành StorageObjectData.
Thay đổi khung mục tiêu thành net8.0 trong tệp .csproj:
<TargetFramework>net8.0</TargetFramework>
Thay đổi StorageObjectData thành MessagePublishedData để phân tích cú pháp thông báo Pub/Sub. Thay đổi Google.Events.Protobuf.Cloud.Storage.V1 thành Google.Events.Protobuf.Cloud.PubSub.V1.
Cuối cùng, hàm của bạn sẽ có dạng như sau:
using CloudNative.CloudEvents;
using Google.Cloud.Functions.Framework;
using Google.Events.Protobuf.Cloud.PubSub.V1;
using System;
using System.Threading;
using System.Threading.Tasks;
namespace HelloPubSub;
public class Function : ICloudEventFunction<MessagePublishedData>
{
public Task HandleAsync(CloudEvent cloudEvent, MessagePublishedData data, CancellationToken cancellationToken)
{
var nameFromMessage = data.Message?.TextData;
var name = string.IsNullOrEmpty(nameFromMessage) ? "world" : nameFromMessage;
Console.WriteLine($"Hello {name}");
return Task.CompletedTask;
}
}
Để triển khai một hàm Cloud Run trực tiếp lên Cloud Run, trước tiên, bạn sẽ triển khai hàm đó rồi tạo một trình kích hoạt cho hàm.
gcloud beta run deploy hello-pubsub-function \
--source . \
--function HelloPubSub.Function \
--region $REGION \
--base-image dotnet8 \
--no-allow-unauthenticated \
--service-account=$SERVICE_ACCOUNT_ADDRESS
Bây giờ, hãy tạo trình kích hoạt cho hàm Cloud Run
gcloud eventarc triggers create my-pubsub-trigger \
--location=$REGION \
--service-account=$SERVICE_ACCOUNT_ADDRESS \
--destination-run-service=hello-pubsub-function \
--destination-run-region=$REGION \
--destination-run-path="/" \
--event-filters="type=google.cloud.pubsub.topic.v1.messagePublished" \
--transport-topic=projects/$PROJECT_ID/topics/$TOPIC_NAME
Nếu muốn triển khai dưới dạng Cloud Functions thế hệ thứ 2, bạn có thể dùng lệnh sau để triển khai hàm bằng cờ trigger-topic:
gcloud functions deploy hello-pubsub-function \
--allow-unauthenticated \
--entry-point HelloPubSub.Function \
--gen2 \
--region us-central1 \
--runtime dotnet8 \
--trigger-topic ${TOPIC_NAME}
Sau vài phút, hàm sẽ xuất hiện trong Cloud Console:

Kích hoạt hàm bằng cách xuất bản một thông báo cho chủ đề:
gcloud pubsub topics publish ${TOPIC_NAME} --message="World"
Xác minh rằng hàm đã được kích hoạt bằng cách đọc nhật ký.
Đối với một hàm Cloud Run, bạn có thể chạy lệnh sau:
gcloud logging read "resource.labels.service_name=hello-pubsub-function AND textPayload: World" --format=json
Đối với hàm thế hệ thứ 2, bạn có thể chạy lệnh sau:
gcloud functions logs read hello-pubsub-function \
--gen2 \
--region us-central1
8. Hàm CloudEvent – Không có kiểu
Nếu đang thử nghiệm với CloudEvents và chưa có mô hình dữ liệu tải trọng mà bạn muốn cam kết, hoặc bạn muốn hàm của mình có thể xử lý mọi CloudEvent, thì bạn có thể sử dụng hàm CloudEvent không có kiểu.
Tạo một CloudEvent Function bằng mẫu gcf-untyped-event:
cd .. mkdir HelloUntyped cd HelloUntyped dotnet new gcf-untyped-event
Thao tác này sẽ tạo một dự án và một tệp Function.cs phản hồi các yêu cầu CloudEvent mà không cố gắng phân tích cú pháp dữ liệu của CloudEvent.
Thay đổi khung mục tiêu thành net8.0 trong tệp .csproj:
<TargetFramework>net8.0</TargetFramework>
Để triển khai một hàm Cloud Run trực tiếp lên Cloud Run, trước tiên, bạn sẽ triển khai hàm đó rồi tạo một trình kích hoạt cho hàm.
gcloud beta run deploy hello-untyped-function \
--source . \
--function HelloUntyped.Function \
--region $REGION \
--base-image dotnet8 \
--no-allow-unauthenticated
Bây giờ, hãy tạo trình kích hoạt cho Cloud Run Function
BUCKET_REGION=$REGION
gcloud eventarc triggers create hello-untyped-function-trigger \
--location=$REGION \
--destination-run-service=hello-untyped-function \
--destination-run-region=$BUCKET_REGION \
--event-filters="type=google.cloud.storage.object.v1.finalized" \
--event-filters="bucket=$BUCKET_NAME" \
--service-account=$SERVICE_ACCOUNT_ADDRESS
Nếu muốn triển khai dưới dạng Cloud Functions thế hệ thứ 2, bạn có thể dùng lệnh sau để triển khai hàm bằng cách sử dụng cờ trigger-event và trigger-resource:
gcloud functions deploy hello-untyped-function \
--allow-unauthenticated \
--entry-point HelloUntyped.Function \
--gen2 \
--region us-central1 \
--runtime dotnet8 \
--trigger-event google.storage.object.finalize \
--trigger-resource ${BUCKET_NAME}
Hàm này sẽ kích hoạt khi một tệp được tải lên một vùng lưu trữ.
Sau vài phút, hàm sẽ xuất hiện trong Cloud Console:

Kích hoạt hàm bằng cách tải một tệp lên vùng lưu trữ:
echo "Hello from Storage" > random.txt
gsutil cp random.txt gs://${BUCKET_NAME}
Xác minh rằng hàm đã được kích hoạt bằng cách đọc nhật ký.
Đối với một hàm Cloud Run, bạn có thể chạy lệnh sau:
gcloud logging read "resource.labels.service_name=hello-gcs-function AND textPayload: Name" --format=json
Đối với hàm thế hệ thứ 2, bạn có thể chạy lệnh sau:
gcloud functions logs read hello-untyped-function \
--gen2 \
--region us-central1
9. 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.
Nội dung đã đề cập
- Functions Framework cho .NET.
- Cách viết một Cloud Function HTTP.
- Cách viết một Hàm CloudEvent phản hồi các sự kiện Cloud Storage.
- Cách viết một hàm CloudEvent phản hồi các sự kiện Cloud Pub/Sub.
- Cách viết một Hàm CloudEvent phản hồi mọi loại sự kiện.