1. Giriş
Google Cloud Run işlevleri, etkinlik odaklı bir sunucusuz bilgi işlem platformudur. Cloud Run işlevleri sayesinde kaynak sağlama veya değişen gereksinimleri karşılamak için ölçeklendirme yapma konusunda endişelenmeden kodunuzu yazabilirsiniz.
İki tür Cloud Run işlevi vardır:
- HTTP işlevleri, HTTP isteklerine yanıt verir.
- Etkinlik işlevleri, Cloud Pub/Sub'da yayınlanan bir mesaj veya Cloud Storage'a yüklenen bir dosya gibi etkinlikler tarafından tetiklenir.
Bu codelab'de, C# dilinde kendi Cloud Run işlevlerinizi oluşturma konusunda size yol göstereceğiz. Daha ayrıntılı olarak belirtmek gerekirse, çeşitli Google Cloud kaynaklarından gelen HTTP ve CloudEvents'e yanıt veren C# işlevleri dağıtacaksınız.
Neler öğreneceksiniz?
- .NET için Functions Framework.
- HTTP işlevi yazma.
- Cloud Storage etkinliklerine yanıt veren bir etkinlik tetikleyici işlevi yazma
- Cloud Pub/Sub etkinliklerine yanıt veren bir olay tetikleyici işlevi yazma
- Her tür etkinliğe yanıt veren bir etkinlik tetikleyici işlevi yazma
2. Kurulum ve Gereksinimler
Kendi hızınızda ortam kurulumu
- Google Cloud Console'da oturum açın ve yeni bir proje oluşturun veya mevcut bir projeyi yeniden kullanın. Gmail veya Google Workspace hesabınız yoksa hesap oluşturmanız gerekir.
- Proje adı, bu projenin katılımcıları için görünen addır. Google API'leri tarafından kullanılmayan bir karakter dizesidir. Dilediğiniz zaman bunu güncelleyebilirsiniz.
- Proje Kimliği, tüm Google Cloud projelerinde benzersiz olmalıdır ve değiştirilemez (belirlendikten sonra değiştirilemez). Cloud Console, otomatik olarak benzersiz bir dize oluşturur. bunun ne olduğunu umursamıyorsunuz. Çoğu codelab'de proje kimliğini (genellikle
PROJECT_ID
olarak tanımlanır) referans almanız gerekir. Oluşturulan kimliği beğenmezseniz rastgele bir kimlik daha oluşturabilirsiniz. Alternatif olarak, kendi anahtarınızı deneyerek kullanılabilir olup olmadığını görebilirsiniz. Bu adımdan sonra değiştirilemez ve proje boyunca geçerli kalır. - Bazı API'lerin kullandığı üçüncü bir değer (Proje Numarası) olduğunu belirtmek isteriz. Bu üç değer hakkında daha fazla bilgiyi dokümanlar bölümünde bulabilirsiniz.
- Sonraki adımda, Cloud kaynaklarını/API'lerini kullanmak için Cloud Console'da faturalandırmayı etkinleştirmeniz gerekir. Bu codelab'i çalıştırmak çok pahalı olmayacaktır. Bu eğitim dışında faturalandırma yapılmaması için kaynakları kapatmak isterseniz oluşturduğunuz kaynakları silebilir veya projenin tamamını silebilirsiniz. Yeni Google Cloud kullanıcıları, 300 ABD doları değerindeki ücretsiz denemeden yararlanabilir.
Cloud Shell'i başlatma
Google Cloud, dizüstü bilgisayarınızdan uzaktan çalıştırılabilir olsa da bu kod laboratuvarında bulutta çalışan bir komut satırı ortamı olan Google Cloud Shell'i kullanacaksınız.
Google Cloud Console'da, sağ üstteki araç çubuğunda bulunan Cloud Shell simgesini tıklayın:
Ortam sağlanıp bağlantı kurulabilmesi için birkaç saniye beklemeniz gerekir. İşlem tamamlandığında aşağıdakine benzer bir ekran görürsünüz:
Bu sanal makinede ihtiyaç duyacağınız tüm geliştirme araçları yüklüdür. 5 GB boyutunda kalıcı bir ana dizin sunar ve Google Cloud üzerinde çalışır. Bu sayede ağ performansını ve kimlik doğrulamayı büyük ölçüde iyileştirir. Bu codelab'deki tüm çalışmalarınız tarayıcıda yapılabilir. Herhangi bir şey yüklemeniz gerekmez.
3. Başlamadan önce
Gerekli hizmetleri etkinleştirmek için Cloud Shell'in içinde aşağıdaki komutu çalıştırın:
gcloud services enable \ artifactregistry.googleapis.com \ cloudbuild.googleapis.com \ cloudfunctions.googleapis.com \ eventarc.googleapis.com \ run.googleapis.com
Ardından bölgenizi ayarlayın.
REGION=<YOUR_REGION>
Bu codelab'de Cloud Storage'dan etkinlik almak ve Cloud Run işlevini çağırmak için gerekli EventArc izinlerine ve Cloud Run çağırıcısı rolüne sahip bir hizmet hesabı oluşturacaksınız.
Öncelikle hizmet hesabını oluşturun.
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"
Ardından, tetikleyicinin etkinlik sağlayıcılardan etkinlik alabilmesi için projedeki Eventarc etkinlik alıcısı rolünü (roles/eventarc.eventReceiver) Eventarc tetikleyicinizle ilişkili hizmet hesabına verin.
gcloud projects add-iam-policy-binding $PROJECT_ID \ --member serviceAccount:$SERVICE_ACCOUNT_ADDRESS \ --role=roles/eventarc.eventReceiver
Ardından, hizmeti çağırabilmesi için hizmet hesabına Cloud Run çağırıcısı rolünü verin.
gcloud projects add-iam-policy-binding $PROJECT_ID \ --member serviceAccount:$SERVICE_ACCOUNT_ADDRESS \ --role=roles/run.invoker
4. .NET İçin İşlevler Çerçevesi
.NET için İşlev Çerçevesi, Google Cloud Functions ekibi tarafından sunulan ve taşınabilir .NET işlevleri yazmak için kullanılan açık kaynak bir FaaS (Hizmet Olarak İşlev) çerçevesidir.
İşlevler Çerçevesi, aşağıdakiler dahil olmak üzere birçok farklı ortamda çalışan basit işlevler yazmanıza olanak tanır:
- Google Cloud Run işlevleri
- Yerel geliştirme makineniz
- Cloud Run ve Cloud Run on GKE
- Knative tabanlı ortamlar
Bu codelab'de, C#'de Cloud Functions oluşturmak ve dağıtmak için .NET için Functions Framework'i ve şablonlarını kullanacaksınız.
Cloud Shell'de, dotnet
için Cloud Functions şablonlarını yüklemek üzere aşağıdaki komutu çalıştırın:
dotnet new install Google.Cloud.Functions.Templates
Bu işlem, dotnet
için 3 şablon yükler. Her şablon C#, F# ve VB dillerinde kullanıma sunulmuştur (ancak bu laboratuvarda yalnızca C#'yı kullanacaksınız). Aşağıdakileri çalıştırarak şablonların yüklendiğini doğrulayabilirsiniz:
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. HTTP İşlevi
HTTP isteklerine yanıt veren bir HTTP işlevi oluşturup dağıtacaksınız.
gcf-http
şablonunu kullanarak bir HTTP işlevi oluşturun:
mkdir HelloHttp cd HelloHttp dotnet new gcf-http
Bu işlem, bir proje ve HTTP isteklerine yanıt veren bir Function.cs
dosyası oluşturur.
.csproj
dosyasında hedef çerçeveyi net8.0
olarak değiştirin:
<TargetFramework>net8.0</TargetFramework>
Bir Cloud Run işlevini doğrudan Cloud Run'a dağıtmak için aşağıdaki komutu çalıştırın:
gcloud beta run deploy hello-http-function \ --source . \ --function HelloHttp.Function \ --base-image dotnet8 \ --region $REGION \ --allow-unauthenticated
2. nesil Cloud Functions olarak dağıtmayı tercih ediyorsanız aşağıdaki komutu kullanın:
gcloud functions deploy hello-http-function \ --allow-unauthenticated \ --entry-point HelloHttp.Function \ --gen2 \ --region $REGION \ --runtime dotnet8 \ --trigger-http
İşleviniz dağıtıldıktan sonra aşağıdaki curl komutunu kullanarak işlevi çağırabilirsiniz:
SERVICE_URL=$(gcloud run services describe hello-http-function --platform managed --region $REGION --format 'value(status.url)') curl $SERVICE_URL
6. CloudEvent İşlevi - GCS
Google Cloud Storage (GCS) etkinliklerine yanıt olarak bir CloudEvent İşlevi oluşturup dağıtacaksınız.
İlk olarak bir Cloud Storage paketi oluşturun. Daha sonra etkinlikleri dinleyeceğiniz paket budur:
BUCKET_NAME="cloud-functions-bucket-${PROJECT_ID}" gsutil mb -l us-central1 gs://${BUCKET_NAME}
gcf-event
şablonunu kullanarak bir CloudEvent işlevi oluşturun:
cd .. mkdir HelloGcs cd HelloGcs dotnet new gcf-event
Bu işlemle bir proje ve CloudEvent
isteklerine yanıt veren bir Function.cs
dosyası oluşturulur. Ayrıca, CloudEvent
verilerini StorageObjectData
olarak ayrıştırır.
.csproj
dosyasında hedef çerçeveyi net8.0
olarak değiştirin:
<TargetFramework>net8.0</TargetFramework>
Bir Cloud Run işlevini doğrudan Cloud Run'a dağıtmak için önce işlevi dağıtır, ardından işlev için bir tetikleyici oluşturursunuz.
gcloud beta run deploy hello-gcs-function \ --source . \ --function HelloGcs.Function \ --region $REGION \ --base-image dotnet8 \ --no-allow-unauthenticated
Şimdi Cloud Run işlevinin tetikleyicisini oluşturun.
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
2. nesil Cloud Functions olarak dağıtmayı tercih ediyorsanız işlevi trigger-event
ve trigger-resource
işaretlerini kullanarak dağıtmak için aşağıdaki komutu kullanabilirsiniz:
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
İşlev birkaç dakika sonra Cloud Console'da görünür:
Depolama paketine dosya yükleyerek işlevi tetikleyin:
echo "Hello from Storage" > random.txt gsutil cp random.txt gs://${BUCKET_NAME}
Günlükleri okuyarak işlevin tetiklendiğini doğrulayın:
Bir Cloud Run işlevi için şu komutu çalıştırabilirsiniz:
gcloud logging read "resource.labels.service_name=hello-gcs-function AND textPayload: Name" --format=json
2. nesil işlevi için şu komutu çalıştırabilirsiniz:
gcloud functions logs read hello-gcs-function \ --gen2 \ --region us-central1
7. CloudEvent İşlevi - Pub/Sub
Cloud Pub/Sub etkinliklerine yanıt veren bir CloudEvent işlevi oluşturup dağıtacaksınız.
İlk olarak etkinlik yayımlayacak bir Cloud Pub/Sub konusu oluşturun:
TOPIC_NAME=cloud-functions-topic gcloud pubsub topics create ${TOPIC_NAME}
gcf-event
şablonunu kullanarak bir CloudEvent işlevi oluşturun:
cd .. mkdir HelloPubSub cd HelloPubSub dotnet new gcf-event
Bu işlemle bir proje ve CloudEvent
isteklerine yanıt veren bir Function.cs
dosyası oluşturulur. Ayrıca varsayılan olarak CloudEvent
verilerini StorageObjectData
olarak ayrıştırır.
.csproj
dosyasında hedef çerçeveyi net8.0
olarak değiştirin:
<TargetFramework>net8.0</TargetFramework>
Pub/Sub mesajlarını ayrıştırmak için StorageObjectData
değerini MessagePublishedData
olarak değiştirin. Google.Events.Protobuf.Cloud.Storage.V1
değerini Google.Events.Protobuf.Cloud.PubSub.V1
olarak değiştirin.
İşleviniz sonunda aşağıdaki gibi görünmelidir:
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; } }
Bir Cloud Run işlevini doğrudan Cloud Run'a dağıtmak için önce işlevi dağıtmanız ve ardından tetikleyici oluşturmanız gerekir.
gcloud beta run deploy hello-pubsub-function \ --source . \ --function HelloPubSub.Function \ --region $REGION \ --base-image dotnet8 \ --no-allow-unauthenticated \ --service-account=$SERVICE_ACCOUNT_ADDRESS
Şimdi Cloud Run işlevinin tetikleyicisini oluşturun
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
2. nesil Cloud Functions işlevi olarak dağıtmayı tercih ederseniz trigger-topic
işaretini kullanarak işlevi dağıtmak için aşağıdaki komutu kullanabilirsiniz:
gcloud functions deploy hello-pubsub-function \ --allow-unauthenticated \ --entry-point HelloPubSub.Function \ --gen2 \ --region us-central1 \ --runtime dotnet8 \ --trigger-topic ${TOPIC_NAME}
Birkaç dakika sonra işlev Cloud Console'da görünür hale gelir:
Konuya mesaj yayınlayarak işlevi tetikleyin:
gcloud pubsub topics publish ${TOPIC_NAME} --message="World"
Günlükleri okuyarak işlevin tetiklendiğini doğrulayın.
Cloud Run işlevi için şu komutu çalıştırabilirsiniz:
gcloud logging read "resource.labels.service_name=hello-pubsub-function AND textPayload: World" --format=json
2. nesil işlevi için şu komutu çalıştırabilirsiniz:
gcloud functions logs read hello-pubsub-function \ --gen2 \ --region us-central1
8. CloudEvent İşlevi - Yazılmamış
CloudEvents ile deneme yapıyorsanız ve henüz taahhüt etmek istediğiniz bir yükü veri modeli yoksa veya işlevinizin herhangi bir Cloud Event'i işleyebilmesini istiyorsanız tür belirtilmemiş bir CloudEvent işlevi kullanabilirsiniz.
gcf-untyped-event
şablonunu kullanarak bir CloudEvent işlevi oluşturun:
cd .. mkdir HelloUntyped cd HelloUntyped dotnet new gcf-untyped-event
Bu işlem, CloudEvent
verilerini ayrıştırma girişiminde bulunmadan CloudEvent
isteklerine yanıt veren bir proje ve Function.cs
dosyası oluşturur.
.csproj
dosyasında hedef çerçeveyi net8.0
olarak değiştirin:
<TargetFramework>net8.0</TargetFramework>
Bir Cloud Run işlevini doğrudan Cloud Run'a dağıtmak için önce işlevi dağıtır, ardından işlev için bir tetikleyici oluşturursunuz.
gcloud beta run deploy hello-untyped-function \ --source . \ --function HelloUntyped.Function \ --region $REGION \ --base-image dotnet8 \ --no-allow-unauthenticated
Şimdi Cloud Run işlevinin tetikleyicisini oluşturun.
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
2. nesil Cloud Functions işlevi olarak dağıtmayı tercih ederseniz trigger-event
ve trigger-resource
işaretlerini kullanarak işlevi dağıtmak için aşağıdaki komutu kullanabilirsiniz:
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}
Depolama paketine dosya yüklendiğinde işlev tetiklenir.
İşlev birkaç dakika sonra Cloud Console'da görünür:
Depolama paketine dosya yükleyerek işlevi tetikleyin:
echo "Hello from Storage" > random.txt gsutil cp random.txt gs://${BUCKET_NAME}
Günlükleri okuyarak işlevin tetiklendiğini doğrulayın.
Cloud Run işlevi için şu komutu çalıştırabilirsiniz:
gcloud logging read "resource.labels.service_name=hello-gcs-function AND textPayload: Name" --format=json
2. nesil bir işlev için şu komutu çalıştırabilirsiniz:
gcloud functions logs read hello-untyped-function \ --gen2 \ --region us-central1
9. Tebrikler!
Codelab'i tamamladığınız için tebrikler.
Ele aldığımız konular
- .NET için Functions Framework.
- HTTP Cloud Functions işlevi yazma.
- Cloud Storage etkinliklerine yanıt veren CloudEvent İşlevi yazma.
- Cloud Pub/Sub etkinliklerine yanıt veren CloudEvent İşlevi yazma.
- Her tür etkinliğe yanıt veren bir CloudEvent işlevi yazma.