Bu codelab hakkında
1. Giriş
Google Cloud Run işlevleri, etkinlik odaklı bir sunucusuz işlem platformudur. Cloud Run işlevleri, kaynak sağlama veya değişen gereksinimleri karşılamak için ölçeklendirme hakkında endişelenmeden kod yazmanıza olanak tanır.
İ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#'de kendi Cloud Run işlevlerinizi oluşturma konusunda size yol gösterilir. 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
Kendine ait tempoda 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ının görünen adıdı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 (ayarlandıktan sonra değiştirilemez). Cloud Console, benzersiz bir dize otomatik olarak oluşturur. Bu dizenin ne olduğu genellikle önemli değildir. Çoğu kod laboratuvarında proje kimliğine (genellikle
PROJECT_ID
olarak tanımlanır) referans vermeniz gerekir. Oluşturulan kimliği beğenmezseniz rastgele başka bir kimlik 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.
- Ardından, 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ğitimden sonra faturalandırılmamak için kaynakları kapatmak üzere oluşturduğunuz kaynakları veya projenin tamamını silebilirsiniz. Google Cloud'un yeni kullanıcıları 300 ABD doları değerindeki ücretsiz deneme programına uygundur.
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 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 yapabilirsiniz. Hiçbir şey yüklemeniz gerekmez.
3. Başlamadan önce
Cloud Shell'de, gerekli hizmetleri etkinleştirmek için 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 kod laboratuvarında, Cloud Storage'dan etkinlik almak ve Cloud Run işlevini çağırmak için gerekli EventArc izinlerine ve Cloud Run çağırıcı 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, işlevi çağırabilmesi için hizmet hesabına Cloud Run çağırıcı rolü verin.
gcloud projects add-iam-policy-binding $PROJECT_ID \ --member serviceAccount:$SERVICE_ACCOUNT_ADDRESS \ --role=roles/run.invoker
4. .NET için Functions Framework
.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.
Functions Framework, 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 GKE'de Cloud Run
- 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'de kullanılabilir (ancak bu laboratuvarda yalnızca C#'yi kullanacaksınız). Şablonların yüklendiğini doğrulamak için aşağıdaki komutu çalıştırın:
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 veren bir CloudEvent işlevi oluşturup dağıtacaksınız.
Öncelikle 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şlem, bir proje ve CloudEvent
isteklerine yanıt veren bir Function.cs
dosyası oluşturur. 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ğıtmanız, ardından işlev için bir tetikleyici oluşturmanız gerekir.
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:
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-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.
Öncelikle, etkinlik yayınlayacak 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şlem, bir proje ve CloudEvent
isteklerine yanıt veren bir Function.cs
dosyası oluşturur. Ayrıca CloudEvent
verilerini varsayılan olarak 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ğıtır, ardından işlev için bir tetikleyici oluşturursunuz.
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 olarak dağıtmayı tercih ediyorsanız işlevi trigger-topic
işaretini kullanarak 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}
İşlev birkaç dakika sonra Cloud Console'da görünür:
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 bir işlev için şu komutu çalıştırabilirsiniz:
gcloud functions logs read hello-pubsub-function \ --gen2 \ --region us-central1
8. CloudEvent İşlevi - Türsüz
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ğıtmanız, ardından işlev için bir tetikleyici oluşturmanız gerekir.
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 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-untyped-function \ --allow-unauthenticated \ --entry-point HelloUntyped.Function \ --gen2 \ --region us-central1 \ --runtime dotnet8 \ --trigger-event google.storage.object.finalize \ --trigger-resource ${BUCKET_NAME}
İşlev, bir depolama paketine dosya yüklendiğinde 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 bir CloudEvent işlevi yazma
- Cloud Pub/Sub etkinliklerine yanıt veren bir CloudEvent işlevi yazma.
- Her tür etkinliğe yanıt veren bir CloudEvent işlevi yazma.