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

1. Giới thiệu

Các hàm trong Google Cloud Run là một nền tảng điện toán không máy chủ dựa trên sự kiện. Các hàm Cloud Run cho phép bạn viết mã mà không phải lo lắng về việc cấp phép tài nguyên hoặc mở rộng quy mô để xử lý các yêu cầu luôn 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ằng các sự kiện, chẳng hạn như một thông báo được xuất bản lên Cloud Pub/Sub hoặc tệp đang đượ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 cách tạo các hàm Cloud Run 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 dành cho .NET.
  • Cách viết Hàm HTTP.
  • Cách viết hàm Kích hoạt sự kiện phản hồi các sự kiện trong 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 được Kích hoạt sự kiện phản hồi cho bất kỳ loại sự kiện nào.

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

  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 bạn không quan tâm đến sản phẩm đó là gì. 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 (mã này thường được xác định là PROJECT_ID). Nếu không thích mã đã tạo, bạn có thể tạo một mã nhận dạng ngẫu nhiên khác. Ngoài ra, bạn có thể thử phương pháp của riêng mình và xem có được cung cấp hay không. Bạn không thể thay đổi thông tin này sau bước này và thông báo đó sẽ vẫn tồn tại trong thời gian của 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 này.
  1. Tiếp theo, bạn sẽ phải bật tính năng thanh toán trong Cloud Console để sử dụng API/tài nguyên trên đám mây. 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 nhằm tránh bị tính phí ngoài hướng dẫn này, bạn có thể xoá các tài nguyên bạ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.pngS

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 hoàn tất, bạn sẽ thấy như sau:

7ffe5cbb04455448.pngS

Máy ảo này chứa 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 tất cả công việc trong lớp học lập trình này trong một trình duyệt. Bạn không cần cài đặt gì cả.

3. Trước khi bắt đầu

Bên 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 là đặ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 đó, cấp cho tài khoản dịch vụ vai trò người gọi trên Cloud Run để 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 dành 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 hàm này để tạo và triển khai Hàm đá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 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 hàm Cloud Run ngay 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à bộ chứa mà bạn sẽ nghe 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 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 Cloud Functions thế hệ thứ 2, bạn có thể dùng lệnh sau để triển khai hàm này 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, hàm này sẽ xuất hiện 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 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, 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 các tin nhắn 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 hàm Cloud Run trên Cloud Run, trước tiên, bạn sẽ triển khai hàm này 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ệ thứ 2, bạn có thể dùng lệnh sau để triển khai hàm này 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:

3443808da7caf3bc.png

Kích hoạt hàm này bằng cách đăng một thông báo về 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 Cloud Functions thế hệ thứ 2, bạn có thể dùng lệnh sau để triển khai hàm này 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 tệp được tải lên bộ chứa lưu trữ.

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

afe56530826787c6.png

Kích hoạt hàm này bằng cách tải một tệp lên bộ chứa 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 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

  • Khung hàm cho .NET.
  • Cách viết Hàm trên đám mây HTTP.
  • Cách viết một Hàm CloudEvent phản hồi các sự kiện trong 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 một Hàm CloudEvent phản hồi bất kỳ loại sự kiện nào.