Cloud Run işlevlerini kullanmaya başlama

Cloud Run işlevlerini kullanmaya başlama

Bu codelab hakkında

subjectSon güncelleme May 7, 2025
account_circleYazan: Mete Atamel

1. Giriş

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 veya php83). 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:

36ca0c5f39cc89cf.png

İ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:

391286a08ad3cdde.png

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:

36ca0c5f39cc89cf.png 391286a08ad3cdde.png

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.