1. Pengantar
Fungsi Google Cloud Run adalah platform komputasi serverless berbasis peristiwa. Fungsi Cloud Run memungkinkan Anda menulis kode tanpa perlu mengkhawatirkan penyediaan resource atau penskalaan untuk menangani persyaratan yang berubah.
Ada dua jenis fungsi Cloud Run:
- Fungsi HTTP merespons permintaan HTTP.
- Fungsi peristiwa dipicu oleh peristiwa, seperti pesan yang dipublikasikan ke Cloud Pub/Sub atau file yang diupload ke Cloud Storage.
Codelab ini akan memandu Anda membuat fungsi Cloud Run Anda sendiri di C#. Lebih khusus lagi, Anda akan men-deploy fungsi C# yang merespons HTTP dan CloudEvents dari berbagai sumber Google Cloud.
Yang akan Anda pelajari
- Framework Functions untuk .NET.
- Cara menulis Fungsi HTTP.
- Cara menulis fungsi yang Dipicu Peristiwa yang merespons peristiwa Cloud Storage.
- Cara menulis fungsi yang Dipicu Peristiwa yang merespons peristiwa Cloud Pub/Sub.
- Cara menulis fungsi yang Dipicu Peristiwa yang merespons jenis peristiwa apa pun.
2. Penyiapan dan Persyaratan
Penyiapan lingkungan mandiri
- Login ke Google Cloud Console dan buat project baru atau gunakan kembali project yang sudah ada. Jika belum memiliki akun Gmail atau Google Workspace, Anda harus membuatnya.
- Project name adalah nama tampilan untuk peserta project ini. String ini adalah string karakter yang tidak digunakan oleh Google API. Anda dapat memperbaruinya kapan saja.
- Project ID harus unik di semua project Google Cloud dan tidak dapat diubah (tidak dapat diubah setelah ditetapkan). Cloud Console otomatis membuat string unik; biasanya Anda tidak mementingkan kata-katanya. Di sebagian besar codelab, Anda harus merujuk Project ID-nya (umumnya diidentifikasi sebagai
PROJECT_ID
). Jika tidak suka dengan ID yang dibuat, Anda dapat membuat ID acak lainnya. Atau, Anda dapat mencobanya sendiri dan melihat apakah ID tersebut tersedia. ID tidak dapat diubah setelah langkah ini dan akan tetap ada selama durasi project. - Sebagai informasi, ada nilai ketiga, Project Number, yang digunakan oleh beberapa API. Pelajari lebih lanjut ketiga nilai ini di dokumentasi.
- Selanjutnya, Anda harus mengaktifkan penagihan di Konsol Cloud untuk menggunakan resource/API Cloud. Menjalankan operasi dalam codelab ini seharusnya tidak memerlukan banyak biaya, bahkan mungkin tidak sama sekali. Guna mematikan resource agar tidak menimbulkan penagihan di luar tutorial ini, Anda dapat menghapus resource yang dibuat atau menghapus seluruh project. Pengguna baru Google Cloud memenuhi syarat untuk mengikuti program Uji Coba Gratis senilai $300 USD.
Mulai Cloud Shell
Meskipun Google Cloud dapat dioperasikan dari jarak jauh menggunakan laptop Anda, dalam codelab ini, Anda akan menggunakan Google Cloud Shell, lingkungan command line yang berjalan di Cloud.
Dari Google Cloud Console, klik ikon Cloud Shell di toolbar kanan atas:
Hanya perlu waktu beberapa saat untuk penyediaan dan terhubung ke lingkungan. Jika sudah selesai, Anda akan melihat tampilan seperti ini:
Mesin virtual ini berisi semua alat pengembangan yang Anda perlukan. Layanan ini menawarkan direktori beranda tetap sebesar 5 GB dan beroperasi di Google Cloud, sehingga sangat meningkatkan performa dan autentikasi jaringan. Semua pekerjaan Anda dalam codelab ini dapat dilakukan di browser. Anda tidak perlu menginstal apa pun.
3. Sebelum memulai
Di dalam Cloud Shell, jalankan perintah berikut untuk mengaktifkan layanan yang diperlukan:
gcloud services enable \ artifactregistry.googleapis.com \ cloudbuild.googleapis.com \ cloudfunctions.googleapis.com \ eventarc.googleapis.com \ run.googleapis.com
Selanjutnya, tetapkan region Anda.
REGION=<YOUR_REGION>
Untuk codelab ini, Anda akan membuat akun layanan dengan izin EventArc yang diperlukan dan peran pemanggil Cloud Run untuk menerima peristiwa dari Cloud Storage dan memanggil fungsi Cloud Run.
Pertama, buat akun layanan.
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"
Selanjutnya, berikan peran Eventarc Event Receiver (roles/eventarc.eventReceiver) pada project ke akun layanan yang terkait dengan pemicu Eventarc Anda agar pemicu dapat menerima peristiwa dari penyedia peristiwa.
gcloud projects add-iam-policy-binding $PROJECT_ID \ --member serviceAccount:$SERVICE_ACCOUNT_ADDRESS \ --role=roles/eventarc.eventReceiver
Kemudian, berikan peran invoker Cloud Run ke akun layanan agar dapat memanggil fungsi.
gcloud projects add-iam-policy-binding $PROJECT_ID \ --member serviceAccount:$SERVICE_ACCOUNT_ADDRESS \ --role=roles/run.invoker
4. Framework Functions untuk .NET
Functions Framework for .NET adalah framework FaaS (Function as a Service) open source untuk menulis fungsi .NET portabel – yang disediakan oleh tim Google Cloud Functions.
Dengan Functions Framework, Anda dapat menulis fungsi ringan yang berjalan di banyak lingkungan yang berbeda, termasuk:
- Fungsi Google Cloud Run
- Mesin pengembangan lokal Anda
- Cloud Run dan Cloud Run di GKE
- Lingkungan berbasis Knative
Dalam codelab ini, Anda akan menggunakan Framework Functions untuk .NET dan template-nya untuk membuat dan men-deploy Cloud Functions di C#.
Di dalam Cloud Shell, jalankan perintah berikut untuk menginstal template Cloud Functions untuk dotnet
:
dotnet new install Google.Cloud.Functions.Templates
Tindakan ini akan menginstal 3 template untuk dotnet
. Setiap template tersedia dalam C#, F#, dan VB (tetapi Anda hanya akan menggunakan C# di lab ini). Anda dapat memverifikasi bahwa template telah diinstal dengan menjalankan:
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. Fungsi HTTP
Anda akan membuat dan men-deploy Fungsi HTTP yang merespons permintaan HTTP.
Buat Fungsi HTTP menggunakan template gcf-http
:
mkdir HelloHttp cd HelloHttp dotnet new gcf-http
Tindakan ini akan membuat project dan file Function.cs
yang merespons permintaan HTTP.
Ubah framework target menjadi net8.0
dalam file .csproj
:
<TargetFramework>net8.0</TargetFramework>
Untuk men-deploy fungsi Cloud Run langsung ke Cloud Run, jalankan perintah berikut:
gcloud beta run deploy hello-http-function \ --source . \ --function HelloHttp.Function \ --base-image dotnet8 \ --region $REGION \ --allow-unauthenticated
Jika Anda lebih memilih untuk men-deploy sebagai Cloud Functions generasi ke-2, gunakan perintah berikut:
gcloud functions deploy hello-http-function \ --allow-unauthenticated \ --entry-point HelloHttp.Function \ --gen2 \ --region $REGION \ --runtime dotnet8 \ --trigger-http
Setelah fungsi di-deploy, Anda dapat memanggilnya menggunakan perintah curl berikut:
SERVICE_URL=$(gcloud run services describe hello-http-function --platform managed --region $REGION --format 'value(status.url)') curl $SERVICE_URL
6. Fungsi CloudEvent - GCS
Anda akan membuat dan men-deploy Fungsi CloudEvent yang merespons peristiwa Google Cloud Storage (GCS).
Pertama, buat bucket Cloud Storage. Ini adalah bucket tempat Anda akan memproses peristiwa nanti:
BUCKET_NAME="cloud-functions-bucket-${PROJECT_ID}" gsutil mb -l us-central1 gs://${BUCKET_NAME}
Buat Fungsi CloudEvent menggunakan template gcf-event
:
cd .. mkdir HelloGcs cd HelloGcs dotnet new gcf-event
Tindakan ini akan membuat project dan file Function.cs
yang merespons permintaan CloudEvent
. Class ini juga menguraikan data CloudEvent
menjadi StorageObjectData
.
Ubah framework target menjadi net8.0
dalam file .csproj
:
<TargetFramework>net8.0</TargetFramework>
Untuk men-deploy fungsi Cloud Run langsung ke Cloud Run, Anda harus men-deploy fungsi terlebih dahulu, lalu membuat pemicu untuk fungsi tersebut.
gcloud beta run deploy hello-gcs-function \ --source . \ --function HelloGcs.Function \ --region $REGION \ --base-image dotnet8 \ --no-allow-unauthenticated
Sekarang buat pemicu untuk Fungsi 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
Jika lebih memilih untuk men-deploy sebagai Cloud Functions generasi ke-2, Anda dapat menggunakan perintah berikut untuk men-deploy fungsi menggunakan flag trigger-event
dan 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
Setelah beberapa menit, fungsi akan terlihat di Cloud Console:
Picu fungsi dengan mengupload file ke bucket penyimpanan:
echo "Hello from Storage" > random.txt gsutil cp random.txt gs://${BUCKET_NAME}
Verifikasi bahwa fungsi dipicu dengan membaca log:
Untuk fungsi Cloud Run, Anda dapat menjalankan perintah ini:
gcloud logging read "resource.labels.service_name=hello-gcs-function AND textPayload: Name" --format=json
Untuk fungsi generasi ke-2, Anda dapat menjalankan perintah ini:
gcloud functions logs read hello-gcs-function \ --gen2 \ --region us-central1
7. Fungsi CloudEvent - Pub/Sub
Anda akan membuat dan men-deploy Fungsi CloudEvent yang merespons peristiwa Cloud Pub/Sub.
Pertama, buat topik Cloud Pub/Sub yang akan memunculkan peristiwa:
TOPIC_NAME=cloud-functions-topic gcloud pubsub topics create ${TOPIC_NAME}
Buat Fungsi CloudEvent menggunakan template gcf-event
:
cd .. mkdir HelloPubSub cd HelloPubSub dotnet new gcf-event
Tindakan ini akan membuat project dan file Function.cs
yang merespons permintaan CloudEvent
. Fungsi ini juga mengurai data CloudEvent
menjadi StorageObjectData
secara default.
Ubah framework target menjadi net8.0
dalam file .csproj
:
<TargetFramework>net8.0</TargetFramework>
Ubah StorageObjectData
menjadi MessagePublishedData
untuk mengurai pesan Pub/Sub. Ubah Google.Events.Protobuf.Cloud.Storage.V1
menjadi Google.Events.Protobuf.Cloud.PubSub.V1
.
Pada akhirnya, fungsi Anda akan terlihat seperti ini:
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; } }
Untuk men-deploy fungsi Cloud Run langsung ke Cloud Run, Anda harus men-deploy fungsi terlebih dahulu, lalu membuat pemicu untuk fungsi tersebut.
gcloud beta run deploy hello-pubsub-function \ --source . \ --function HelloPubSub.Function \ --region $REGION \ --base-image dotnet8 \ --no-allow-unauthenticated \ --service-account=$SERVICE_ACCOUNT_ADDRESS
Sekarang, buat pemicu untuk fungsi 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
Jika lebih memilih untuk men-deploy sebagai Cloud Functions generasi ke-2, Anda dapat menggunakan perintah berikut untuk men-deploy fungsi menggunakan flag trigger-topic
:
gcloud functions deploy hello-pubsub-function \ --allow-unauthenticated \ --entry-point HelloPubSub.Function \ --gen2 \ --region us-central1 \ --runtime dotnet8 \ --trigger-topic ${TOPIC_NAME}
Setelah beberapa menit, fungsi akan terlihat di Cloud Console:
Picu fungsi dengan memublikasikan pesan ke topik:
gcloud pubsub topics publish ${TOPIC_NAME} --message="World"
Pastikan fungsi dipicu dengan membaca log.
Untuk fungsi Cloud Run, Anda dapat menjalankan perintah ini:
gcloud logging read "resource.labels.service_name=hello-pubsub-function AND textPayload: World" --format=json
Untuk fungsi generasi ke-2, Anda dapat menjalankan perintah ini:
gcloud functions logs read hello-pubsub-function \ --gen2 \ --region us-central1
8. Fungsi CloudEvent - Tanpa Jenis
Jika Anda bereksperimen dengan CloudEvents dan belum memiliki model data payload yang ingin di-commit, atau Anda ingin fungsi Anda dapat menangani Cloud Event apa pun, Anda dapat menggunakan fungsi CloudEvent tanpa jenis.
Buat Fungsi CloudEvent menggunakan template gcf-untyped-event
:
cd .. mkdir HelloUntyped cd HelloUntyped dotnet new gcf-untyped-event
Tindakan ini akan membuat project dan file Function.cs
yang merespons permintaan CloudEvent
tanpa upaya untuk mengurai data CloudEvent
.
Ubah framework target menjadi net8.0
dalam file .csproj
:
<TargetFramework>net8.0</TargetFramework>
Untuk men-deploy fungsi Cloud Run langsung ke Cloud Run, Anda harus men-deploy fungsi terlebih dahulu, lalu membuat pemicu untuk fungsi tersebut.
gcloud beta run deploy hello-untyped-function \ --source . \ --function HelloUntyped.Function \ --region $REGION \ --base-image dotnet8 \ --no-allow-unauthenticated
Sekarang buat pemicu untuk Fungsi 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
Jika lebih memilih untuk men-deploy sebagai Cloud Functions generasi ke-2, Anda dapat menggunakan perintah berikut untuk men-deploy fungsi menggunakan flag trigger-event
dan 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}
Fungsi akan dipicu saat file diupload ke bucket penyimpanan.
Setelah beberapa menit, fungsi akan terlihat di Cloud Console:
Picu fungsi dengan mengupload file ke bucket penyimpanan:
echo "Hello from Storage" > random.txt gsutil cp random.txt gs://${BUCKET_NAME}
Pastikan fungsi dipicu dengan membaca log.
Untuk fungsi Cloud Run, Anda dapat menjalankan perintah ini:
gcloud logging read "resource.labels.service_name=hello-gcs-function AND textPayload: Name" --format=json
Untuk fungsi generasi ke-2, Anda dapat menjalankan perintah ini:
gcloud functions logs read hello-untyped-function \ --gen2 \ --region us-central1
9. Selamat!
Selamat, Anda telah menyelesaikan codelab.
Yang telah kita bahas
- Framework Functions untuk .NET.
- Cara menulis HTTP Cloud Function.
- Cara menulis Fungsi CloudEvent yang merespons peristiwa Cloud Storage.
- Cara menulis Fungsi CloudEvent yang merespons peristiwa Cloud Pub/Sub.
- Cara menulis Fungsi CloudEvent yang merespons jenis peristiwa apa pun.