Hàm đám mây của Google trong C#

1. Giới thiệu

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. Hàm Cloud Run cho phép bạn viết mã mà không cần lo lắng về việc cấp phát tài nguyên hoặc mở rộng quy mô để xử lý các yêu cầu thay đổi.

Có hai loại hàm Cloud Run:

  • 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 phát hành lên Cloud Pub/Sub hoặc một tệp được tải lên Cloud Storage.

efb3268e3b74ed4f.png

Lớp học lập trình này sẽ hướng dẫn bạn tạo các hàm Cloud Run của riêng mình trong 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 Google Cloud.

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

  • Khung hàm cho .NET.
  • Cách viết Hàm HTTP.
  • Cách viết hàm được kích hoạt bằng sự kiện để phản hồi các sự kiện trên Cloud Storage.
  • Cách viế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 hàm Kích hoạt sự kiện phản hồi mọi loại sự kiện.

2. Cách thiết lập và các 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.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • Tên dự án là tên hiển thị cho người tham gia dự án này. Đây là một chuỗi ký tự không được API của Google 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 Google Cloud và không thể thay đổi được (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ã được tạo, bạn có thể tạo một mã ngẫu nhiên khác. Ngoài ra, bạn có thể thử dùng tên của riêng mình để xem tên đó có được chấp nhận 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ẽ được giữ nguyên trong suốt thời gian diễn ra dự án.
  • Xin lưu ý rằng có một giá trị thứ ba là Mã dự án mà một số API sử dụng. Tìm hiểu thêm về cả ba 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 tham gia lớp học lập trình này sẽ không tốn kém nhiều chi phí, nếu có. Để tắt các tài nguyên để không bị tính phí sau khi hoàn tất 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í 300 USD.

Khởi động Cloud Shell

Mặc dù có thể điều khiển 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 đám mây.

Trong 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:

55efc1aaa7a4d3ad.png

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

7ffe5cbb04455448.png

Máy ảo này được tải sẵn tất cả các công cụ phát triển mà bạn cần. Ứng dụng này cung cấp một thư mục gốc 5 GB ổn định và chạy trên Google Cloud, giúp nâng cao đáng kể hiệu suất mạng và 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 gì cả.

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ò trình 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ò Trình nhận sự kiện Eventarc (roles/eventarc.eventReceiver) trên dự án cho 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 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 đó, hãy cấp cho tài khoản dịch vụ vai trò trình gọi Cloud Run để tài khoản này có thể gọi hàm.

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member serviceAccount:$SERVICE_ACCOUNT_ADDRESS \
  --role=roles/run.invoker

4. Khung hàm cho .NET

Khung hàm cho .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 chuyển – 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:

  • 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 Khung hàm cho .NET và các mẫu của khung này để tạo và triển khai Hàm trên đám mây trong C#.

Bên trong Cloud Shell, hãy chạy lệnh sau để cài đặt các 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 đều có sẵn trong C#, F# và VB (nhưng bạn sẽ chỉ sử dụng C# trong lớp học 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 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à 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 trực tiếp một hàm Cloud Run trê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ệ 2, hãy sử 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 trên Google Cloud Storage (GCS).

Trước tiên, hãy tạo một bộ chứa trên Cloud Storage. Đây là nhóm mà bạn sẽ theo dõi sự kiện sau này:

BUCKET_NAME="cloud-functions-bucket-${PROJECT_ID}"
gsutil mb -l us-central1 gs://${BUCKET_NAME}

Tạo 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à tệp Function.cs phản hồi các yêu cầu CloudEvent. Phương thứ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 trực tiếp một hàm Cloud Run trên Cloud Run, trước tiên, bạn sẽ triển khai hàm đó rồi tạo điều kiện 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 điều kiện kích hoạt cho Hàm Cloud Run

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 Hàm trên đám mây thế hệ 2, bạn có thể sử dụng lệnh sau để triển khai hàm bằng cờ trigger-eventtrigger-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, bạn sẽ thấy hàm này trong Cloud Console:

c28654d74bb31420.png

Kích hoạt hàm bằng cách tải tệp lên bộ chứa bộ nhớ:

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 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ệ 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 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à tệp Function.cs phản hồi các yêu cầu CloudEvent. Theo mặc định, lớp 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>

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 trực tiếp một hàm Cloud Run trên Cloud Run, trước tiên, bạn sẽ triển khai hàm đó rồi tạo điều kiện 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 điều kiện 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ệ 2, bạn có thể sử 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, bạn sẽ thấy hàm này trong Cloud Console:

3443808da7caf3bc.png

Kích hoạt hàm bằng cách phát hành 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 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ệ 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 muốn hàm của mình có thể xử lý mọi sự kiện trên đám mây, bạn có thể sử dụng hàm CloudEvent chưa được nhập.

Tạo Hàm CloudEvent 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à tệp Function.cs phản hồi các yêu cầu CloudEvent mà không cần 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 trực tiếp một hàm Cloud Run trên Cloud Run, trước tiên, bạn sẽ triển khai hàm đó rồi tạo điều kiện 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 điều kiện kích hoạt cho Hàm Cloud Run

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 Hàm trên đám mây thế hệ 2, bạn có thể sử dụng lệnh sau để triển khai hàm bằng cờ trigger-eventtrigger-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 bộ chứa bộ nhớ.

Sau vài phút, hàm sẽ xuất hiện trong Cloud Console:

afe56530826787c6.png

Kích hoạt hàm bằng cách tải tệp lên bộ chứa bộ nhớ:

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 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ệ 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

  • Khung hàm cho .NET.
  • Cách viết Hàm trên đám mây HTTP.
  • Cách viết Hàm CloudEvent phản hồi các sự kiện trên Cloud Storage.
  • Cách viết Hàm CloudEvent phản hồi các sự kiện Cloud Pub/Sub.
  • Cách viết Hàm CloudEvent phản hồi mọi loại sự kiện.