Bu codelab hakkında
1. Giriş
Genel Bakış
Cloud Run işlevleri, Google Cloud'un Cloud Run ve Eventarc tarafından desteklenen Hizmet Olarak İşlev teklifidir. Bu teklif, performans ve ölçeklenebilirlik üzerinde daha gelişmiş kontrol ve 90'dan fazla etkinlik kaynağından gelen işlev çalışma zamanı ve tetikleyiciler üzerinde daha fazla kontrol sağlar.
Bu kod laboratuvarında, HTTP çağrılarına yanıt veren ve Pub/Sub mesajları ile Cloud Denetleme Günlükleri tarafından tetiklenen Cloud Run işlevleri oluşturma konusunda size yol gösterilecektir.
Bu codelab'de, --base-image
işaretçisini kullanarak bir temel resim belirterek işlev dağıtımları için otomatik temel resim güncellemeleri de kullanılır. Cloud Run için otomatik temel görüntü güncellemeleri, Google'ın temel görüntünün işletim sistemine ve dil çalışma zamanı bileşenlerine otomatik olarak güvenlik yamaları uygulamasını sağlar. Temel görüntünün güncellenmesi için hizmetinizi yeniden oluşturmanız veya yeniden dağıtmanız gerekmez. Daha fazla bilgi için otomatik temel görüntü güncellemeleri başlıklı makaleyi inceleyin.
Otomatik temel görüntü güncellemelerini kullanmayı tercih etmiyorsanız bu kod laboratuvarındaki örneklerden --base-image
işaretini kaldırabilirsiniz.
Neler öğreneceksiniz?
- Cloud Run işlevlerine ve otomatik temel görüntü güncellemelerinin nasıl kullanılacağına genel bakış.
- HTTP çağrılarına yanıt veren bir işlev yazma
- Pub/Sub mesajlarına yanıt veren bir işlev yazma
- Cloud Storage etkinliklerine yanıt veren bir işlev yazma
- Trafik iki revizyon arasında nasıl bölünür?
- Minimum sayıda örnekle soğuk başlatma sorunundan kurtulma.
2. Kurulum ve Gereksinimler
Kök klasör oluşturma
Tüm örnekler için bir kök klasör oluşturun.
mkdir crf-codelab cd crf-codelab
Ortam değişkenlerini ayarlama
Bu codelab boyunca kullanılacak ortam değişkenlerini ayarlayın/
gcloud config set project <YOUR-PROJECT-ID> REGION=<YOUR_REGION> PROJECT_ID=$(gcloud config get-value project)
API'leri etkinleştir
Gerekli tüm hizmetleri etkinleştirin:
gcloud services enable \ artifactregistry.googleapis.com \ cloudbuild.googleapis.com \ eventarc.googleapis.com \ run.googleapis.com \ logging.googleapis.com \ pubsub.googleapis.com
3. HTTP İşlevi
İlk işlev için HTTP isteklerine yanıt veren kimliği doğrulanmış bir Node.js işlevi oluşturalım. Bir işlevin HTTP isteklerine yanıt vermek için nasıl daha fazla zamana sahip olabileceğini göstermek amacıyla 10 dakikalık bir zaman aşımı da kullanalım.
Oluştur
Uygulama için bir klasör oluşturun ve klasöre gidin:
mkdir hello-http cd hello-http
HTTP isteklerine yanıt veren bir index.js
dosyası oluşturun:
const functions = require('@google-cloud/functions-framework'); functions.http('helloWorld', (req, res) => { res.status(200).send('HTTP with Node.js in Cloud Run functions!'); });
Bağımlılıkları belirtmek için bir package.json
dosyası oluşturun:
{ "name": "nodejs-run-functions-codelab", "version": "0.0.1", "main": "index.js", "dependencies": { "@google-cloud/functions-framework": "^2.0.0" } }
Dağıtım
İşlevi dağıtın:
gcloud run deploy nodejs-run-function \ --source . \ --function helloWorld \ --base-image nodejs22 \ --region $REGION \ --timeout 600 \ --no-allow-unauthenticated
Bu komut, işlev kaynak kodunuzu üretime hazır bir kapsayıcı görüntüsüne dönüştürmek için buildpack'leri kullanır.
Önemli:
--source
işareti, Cloud Run'a işlevi çalıştırılabilir bir kapsayıcı tabanlı hizmet olarak derlemesini bildirmek için kullanılır.--function
işareti (yeni), yeni hizmetin giriş noktasını çağrılmasını istediğiniz işlev imzası olarak ayarlamak için kullanılır.--base-image
işareti (yeni), işlevinizin temel resim ortamını belirtir (ör.nodejs22
,python312
,go123
,java21
,dotnet8
,ruby33
veyaphp83
). Temel resimler ve her resme dahil edilen paketler hakkında daha fazla bilgi için Çalışma zamanı temel resimleri başlıklı makaleyi inceleyin.- (isteğe bağlı)
--timeout
işareti, işlevin HTTP isteklerine yanıt vermek için daha uzun bir zaman aşımı süresine sahip olmasını sağlar. Bu örnekte, 10 dakikalık yanıt süresini göstermek için 600 saniye kullanılmıştır. - (isteğe bağlı) işlevinizin herkese açık olarak çağrılamasını önlemek için
--no-allow-unauthenticated
Test
İşlevi aşağıdaki komutlarla test edin:
# get the Service URL SERVICE_URL="$(gcloud run services describe nodejs-run-function --region $REGION --format 'value(status.url)')" # invoke the service curl -H "Authorization: bearer $(gcloud auth print-identity-token)" -X GET $SERVICE_URL
Yanıt olarak HTTP with Node.js in Cloud Run functions!
mesajını görürsünüz.
4. Pub/Sub işlevi
İkinci işlev için belirli bir konuya yayınlanan bir Pub/Sub mesajı tarafından tetiklenen bir Python işlevi oluşturalım.
Pub/Sub kimlik doğrulama jetonlarını ayarlama
Pub/Sub hizmet hesabını 8 Nisan 2021'de veya öncesinde etkinleştirdiyseniz Pub/Sub hizmet hesabına iam.serviceAccountTokenCreator
rolünü verin:
PROJECT_NUMBER=$(gcloud projects list --filter="project_id:$PROJECT_ID" --format='value(project_number)') gcloud projects add-iam-policy-binding $PROJECT_ID \ --member serviceAccount:service-$PROJECT_NUMBER@gcp-sa-pubsub.iam.gserviceaccount.com \ --role roles/iam.serviceAccountTokenCreator
Oluştur
Sana Özel örneğinde kullanılacak bir Pub/Sub konusu oluşturun:
TOPIC=cloud-run-functions-pubsub-topic gcloud pubsub topics create $TOPIC
Uygulama için bir klasör oluşturun ve klasöre gidin:
mkdir ../hello-pubsub cd ../hello-pubsub
CloudEvent kimliğini içeren bir mesajı günlüğe kaydeden bir main.py
dosyası oluşturun:
import functions_framework @functions_framework.cloud_event def hello_pubsub(cloud_event): print('Pub/Sub with Python in Cloud Run functions! Id: ' + cloud_event['id'])
Bağımlılıkları belirtmek için aşağıdaki içeriği içeren bir requirements.txt
dosyası oluşturun:
functions-framework==3.*
Dağıtım
İşlevi dağıtın:
gcloud run deploy python-pubsub-function \ --source . \ --function hello_pubsub \ --base-image python313 \ --region $REGION \ --no-allow-unauthenticated
Hizmet hesabı kimliği için kullanılacak proje numarasını alın.
PROJECT_NUMBER=$(gcloud projects list --filter="project_id:$PROJECT_ID" --format='value(project_number)')
Tetikleyiciyi oluşturma
gcloud eventarc triggers create python-pubsub-function-trigger \ --location=$REGION \ --destination-run-service=python-pubsub-function \ --destination-run-region=$REGION \ --event-filters="type=google.cloud.pubsub.topic.v1.messagePublished" \ --transport-topic=projects/$PROJECT_ID/topics/$TOPIC \ --service-account=$PROJECT_NUMBER-compute@developer.gserviceaccount.com
Test
Konuya mesaj göndererek işlevi test edin:
gcloud pubsub topics publish $TOPIC --message="Hello World"
Alınan CloudEvent'i günlüklerde görürsünüz:
gcloud run services logs read python-pubsub-function --region $REGION --limit=10
5. Cloud Storage işlevi
Bir sonraki işlev için Cloud Storage paketindeki etkinliklere yanıt veren bir Node.js işlevi oluşturalım.
Kur
Cloud Storage işlevlerini kullanmak için Cloud Storage hizmet hesabına pubsub.publisher
IAM rolünü verin:
SERVICE_ACCOUNT=$(gsutil kms serviceaccount -p $PROJECT_NUMBER) gcloud projects add-iam-policy-binding $PROJECT_ID \ --member serviceAccount:$SERVICE_ACCOUNT \ --role roles/pubsub.publisher
Oluştur
Uygulama için bir klasör oluşturun ve klasöre gidin:
mkdir ../hello-storage cd ../hello-storage
Yalnızca Cloud Storage etkinliklerine yanıt veren bir index.js
dosyası oluşturun:
const functions = require('@google-cloud/functions-framework'); functions.cloudEvent('helloStorage', (cloudevent) => { console.log('Cloud Storage event with Node.js in Cloud Run functions!'); console.log(cloudevent); });
Bağımlılıkları belirtmek için bir package.json
dosyası oluşturun:
{ "name": "nodejs-crf-cloud-storage", "version": "0.0.1", "main": "index.js", "dependencies": { "@google-cloud/functions-framework": "^2.0.0" } }
Dağıtım
Öncelikle bir Cloud Storage paketi oluşturun (veya mevcut bir paketi kullanın):
export BUCKET_NAME="gcf-storage-$PROJECT_ID" export BUCKET="gs://gcf-storage-$PROJECT_ID" gsutil mb -l $REGION $BUCKET
İşlevi dağıtın:
gcloud run deploy nodejs-crf-cloud-storage \ --source . \ --base-image nodejs22 \ --function helloStorage \ --region $REGION \ --no-allow-unauthenticated
İşlev dağıtıldıktan sonra Cloud Console'un Cloud Run bölümünde görebilirsiniz.
Şimdi Eventarc tetikleyicisini oluşturun.
BUCKET_REGION=$REGION gcloud eventarc triggers create nodejs-crf-cloud-storage-trigger \ --location=$BUCKET_REGION \ --destination-run-service=nodejs-crf-cloud-storage \ --destination-run-region=$REGION \ --event-filters="type=google.cloud.storage.object.v1.finalized" \ --event-filters="bucket=$BUCKET_NAME" \ --service-account=$PROJECT_NUMBER-compute@developer.gserviceaccount.com
Test
Pakete dosya yükleyerek işlevi test edin:
echo "Hello World" > random.txt gsutil cp random.txt $BUCKET/random.txt
Alınan CloudEvent'i günlüklerde görürsünüz:
gcloud run services logs read nodejs-crf-cloud-storage --region $REGION --limit=10
6. Trafiği bölme
Cloud Run işlevleri, işlevlerinizin birden fazla revizyonunu destekler, trafiği farklı revizyonlar arasında böler ve işlevinizi önceki bir sürüme geri alır.
Bu adımda, bir işlevin 2 düzeltmesini dağıtacak ve ardından trafiği 50-50 olarak böleceksiniz.
Oluştur
Uygulama için bir klasör oluşturun ve klasöre gidin:
mkdir ../traffic-splitting cd ../traffic-splitting
Bir renk ortam değişkenini okuyan ve bu arka plan renginde Hello World
ile yanıt veren bir Python işlevi içeren bir main.py
dosyası oluşturun:
import os color = os.environ.get('COLOR') def hello_world(request): return f'<body style="background-color:{color}"><h1>Hello World!</h1></body>'
Bağımlılıkları belirtmek için aşağıdaki içeriği içeren bir requirements.txt
dosyası oluşturun:
functions-framework==3.*
Dağıtım
Fonksiyonun ilk düzeltmesini turuncu arka planla dağıtın:
COLOR=orange gcloud run deploy hello-world-colors \ --source . \ --base-image python313 \ --function hello_world \ --region $REGION \ --allow-unauthenticated \ --update-env-vars COLOR=$COLOR
Bu noktada, tarayıcınızda HTTP tetikleyiciyi (yukarıdaki dağıtım komutunun URI çıkışı) görüntüleyerek işlevi test ederseniz turuncu arka planlı Hello World
simgesini görürsünüz:
İkinci düzeltmeyi sarı arka planla dağıtın:
COLOR=yellow gcloud run deploy hello-world-colors \ --source . \ --base-image python313 \ --function hello_world \ --region $REGION \ --allow-unauthenticated \ --update-env-vars COLOR=$COLOR
Bu en son düzeltme olduğundan işlevi test ettiğinizde sarı arka planlı Hello World
simgesini görürsünüz:
Trafiğin yarısını ayırın
Turuncu ve sarı düzeltmeler arasında trafik ayırmak için Cloud Run hizmetlerinin düzeltme kimliklerini bulmanız gerekir. Düzeltme kimliklerini görme komutu şu şekildedir:
gcloud run revisions list --service hello-world-colors \ --region $REGION --format 'value(REVISION)'
Çıkış şuna benzer şekilde görünecektir:
hello-world-colors-00001-man hello-world-colors-00002-wok
Ardından, trafiği bu iki düzeltme arasında aşağıdaki gibi bölüştürün (X-XXX
değerini düzeltme adlarınıza göre güncelleyin):
gcloud run services update-traffic hello-world-colors \ --region $REGION \ --to-revisions hello-world-colors-0000X-XXX=50,hello-world-colors-0000X-XXX=50
Test
İşlevi, herkese açık URL'sini ziyaret ederek test edin. Zamanların yarısında turuncu düzeltmeyi, diğer yarısında ise sarı düzeltmeyi görürsünüz:
Daha fazla bilgi için geri alma, kademeli kullanıma sunma ve trafik taşıma başlıklı makaleyi inceleyin.
7. Minimum örnek sayısı
Cloud Run işlevlerinde, etkin durumda tutulacak ve istek sunmaya hazır olacak minimum sayıda işlev örneği belirtebilirsiniz. Bu, sıfırdan başlatma sayısını sınırlandırmak için yararlıdır.
Bu adımda, yavaş başlatma özelliğine sahip bir işlev dağıtacaksınız. Soğuk başlatma sorununu gözlemleyebilirsiniz. Ardından, sıfırdan başlatma sorununu ortadan kaldırmak için işlevi minimum örnek değeri 1 olarak ayarlayarak dağıtırsınız.
Oluştur
Uygulama için bir klasör oluşturun ve bu klasöre gidin:
mkdir ../min-instances cd ../min-instances
main.go
dosyası oluşturun. Bu Go hizmetinde, uzun bir başlatmayı simüle etmek için 10 saniye boyunca uyuyan bir init
işlevi vardır. Ayrıca HTTP çağrılarına yanıt veren bir HelloWorld
işlevi de vardır:
package p import ( "fmt" "net/http" "time" ) func init() { time.Sleep(10 * time.Second) } func HelloWorld(w http.ResponseWriter, r *http.Request) { fmt.Fprint(w, "Slow HTTP Go in Cloud Run functions!") }
Dağıtım
İşlevin ilk düzeltmesini, varsayılan minimum örnek değeri sıfır olacak şekilde dağıtın:
gcloud run deploy go-slow-function \ --source . \ --base-image go123 \ --function HelloWorld \ --region $REGION \ --no-allow-unauthenticated
İşlevi şu komutla test edin:
# get the Service URL SERVICE_URL="$(gcloud run services describe go-slow-function --region $REGION --format 'value(status.url)')" # invoke the service curl -H "Authorization: bearer $(gcloud auth print-identity-token)" -X GET $SERVICE_URL
İlk aramada 10 saniyelik bir gecikme (soğuk başlatma) görürsünüz ve ardından mesajı görürsünüz. Sonraki aramalar hemen geri dönmelidir.
Minimum örnek sayısını ayarlama
İlk istekte sıfırdan başlatma sorununu ortadan kaldırmak için işlevi --min-instances
bayrağı 1 olarak ayarlanmış şekilde aşağıdaki gibi yeniden dağıtın:
gcloud run deploy go-slow-function \ --source . \ --base-image go123 \ --function HelloWorld \ --region $REGION \ --no-allow-unauthenticated \ --min-instances 1
Test
İşlevi tekrar test edin:
curl -H "Authorization: bearer $(gcloud auth print-identity-token)" -X GET $SERVICE_URL
Artık ilk istekte 10 saniyelik gecikme görmeyeceksiniz. Minimum örnekler sayesinde ilk çağrı için soğuk başlatma sorunu (uzun bir süre sonra) ortadan kalktı.
Daha fazla bilgi için minimum sayıda örnek kullanma bölümüne bakın.
8. Tebrikler!
Codelab'i tamamladığınız için tebrikler.
Ele aldığımız konular
- Cloud Run işlevlerine ve otomatik temel görüntü güncellemelerinin nasıl kullanılacağına genel bakış.
- HTTP çağrılarına yanıt veren bir işlev yazma
- Pub/Sub mesajlarına yanıt veren bir işlev yazma
- Cloud Storage etkinliklerine yanıt veren bir işlev yazma
- Trafik iki revizyon arasında nasıl bölünür?
- Minimum sayıda örnekle soğuk başlatma sorunundan kurtulma.