Etkinlik odaklı Cloud Run işlevlerini kullanmaya başlama

1. Giriş

Genel Bakış

Cloud Run işlevleri, bilinen EBOB etkinlik paradigmalarını ve işlev imzalarını kullanarak iş yüklerini dağıtmanın yeni bir yoludur. Cloud Run işlevleri, ayrıntılı derleme sürecimizi ve dağıtım yapılandırmalarımızı kullanmak yerine Cloud Run'da oluşturulan temel Hizmet üzerinde doğrudan kontrol sağlar.

Cloud Run işlevleriyle basit bir Cloud Run kaynak dağıtımı kullanıcı deneyimi sunarak geliştiricilerin Cloud Run yapılandırmalarını kullanarak iş yükleri üzerinde tam kontrol sahibi olmasını sağlıyoruz.

Bu bölümde, Düğüm'de etkinliğe dayalı işlevleri nasıl dağıtacağınızı öğreneceksiniz. Google Cloud Storage paketinde bir nesne nihai hale geldiğinde tetiklenen bir işlev dağıtacaksınız.

Bu codelab'de, aşağıdaki örneklerde yer alan nodejs örnekleri kullanılır. Bununla birlikte, Cloud Functions 2. nesil kod örneklerini istediğiniz dilde kullanabilirsiniz:

Neler öğreneceksiniz?

  • GCS paketine bir nesne yüklendiğinde tetiklenen etkinliğe dayalı Cloud Run işlevini dağıtma
  • Cloud Storage'dan etkinlik almak ve Cloud Run işlevini çağırmak için uygun rollere sahip bir hizmet hesabı oluşturma

2. Ortam değişkenlerini ayarlayın ve API'leri etkinleştirin

gcloud CLI'ı güncelleyin

Bu codelab'de gcloud KSA'nın yeni bir sürümü yüklü olmalıdır. KSA'yı şu komutu çalıştırarak güncelleyebilirsiniz:

gcloud components update

API'leri etkinleştir

Bu codelab'i kullanmaya başlamadan önce etkinleştirmeniz gereken birkaç API vardır. Bu codelab'de aşağıdaki API'lerin kullanılması gerekir. Bu API'leri şu komutu çalıştırarak etkinleştirebilirsiniz:

gcloud services enable run.googleapis.com \
    cloudbuild.googleapis.com \
    storage.googleapis.com \
    artifactregistry.googleapis.com

Ortam değişkenlerini ayarlama

Bu codelab'de kullanılacak ortam değişkenlerini ayarlayabilirsiniz.

PROJECT_ID=<YOUR_PROJECT_ID>
REGION=<YOUR_REGION, e.g. us-central1>

gcloud config set project $PROJECT_ID
SERVICE_NAME=crf-event-codelab
BUCKET_NAME=$PROJECT_ID-$SERVICE_NAME
TRIGGER_NAME=$SERVICE_NAME-trigger

3. Storage Paketi ve Hizmet Hesabı Oluşturma

Storage paketi oluşturma

Aşağıdaki komutu çalıştırarak Cloud Storage paketi oluşturabilirsiniz:

gsutil mb -l us-central1 gs://$BUCKET_NAME

Hizmet hesabı oluşturma

Bu örnekte, 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.

İlk olarak hizmet hesabını oluşturun.

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. İşlevi oluşturma ve dağıtma

İlk olarak, kaynak kodu için bir dizin oluşturun ve bu dizin için cd'yi kullanın.

mkdir ../$SERVICE_NAME && cd $_

Ardından, aşağıdaki içeriğe sahip bir package.json dosyası oluşturun:

{
    "dependencies": {
        "@google-cloud/functions-framework": "^3.0.0"
    }
}

Sonra, aşağıdaki içeriğe sahip bir index.js dosyası oluşturun:

const functions = require("@google-cloud/functions-framework");

// Register a CloudEvent callback with the Functions Framework that will
// be triggered by Cloud Storage.
functions.cloudEvent("helloGCS", (cloudEvent) => {
    console.log(`Event ID: ${cloudEvent.id}`);
    console.log(`Event Type: ${cloudEvent.type}`);

    const file = cloudEvent.data;
    console.log(`Bucket: ${file.bucket}`);
    console.log(`File: ${file.name}`);
    console.log(`Metageneration: ${file.metageneration}`);
    console.log(`Created: ${file.timeCreated}`);
    console.log(`Updated: ${file.updated}`);
});

Şimdi aşağıdaki komutu çalıştırarak Cloud Run işlevini dağıtabilirsiniz:

gcloud beta run deploy $SERVICE_NAME \
 --source . \
      --function helloGCS \
      --region $REGION \
      --no-allow-unauthenticated

Önemli:

  • -source işareti, Cloud Run'a işlevi çalıştırılabilir container tabanlı bir hizmette derlemesini bildirmek için kullanılır
  • İşlev işareti (yeni), yeni hizmetin giriş noktasını çağrılmasını istediğiniz fonksiyon imzası olarak ayarlamak için kullanılır
  • (isteğe bağlı) İşlevinizin herkese açık şekilde çağrılmasını önlemek için –no-allow-unauthenticated

Aşağıdaki komutu çalıştırarak crf-nodejs-event adlı yeni hizmetinizi görüntüleyebilirsiniz:

gcloud beta run services describe $SERVICE_NAME

5. Etkinlik oluşturma

Google Cloud Storage'da bir nesne her kesinleştirildiğinde işlevimize mesaj göndermek için Eventarc tetikleyicisi oluşturabiliriz:

BUCKET_REGION=$REGION

gcloud eventarc triggers create $TRIGGER_NAME \
     --location=$REGION \
     --destination-run-service=crf-nodejs-event \
  --destination-run-region=$BUCKET_REGION \
     --event-filters="type=google.cloud.storage.object.v1.finalized" \
     --event-filters="bucket=$BUCKET_NAME" \
     --service-account=$SERVICE_ACCOUNT_ADDRESS

Önemli:

  • gcs-function-trigger, tetikleyicinin adıdır
  • crf-nodejs-event, işlevimizin dağıtıldığı Cloud Run hizmetinin adıdır.
  • -event-filters işareti için paket adınızda gs:// önekini kullanmayın.

Eventarc'ı kullanarak Cloud Storage'dan Tetikleyici hizmetini ayarlamayla ilgili ayrıntılı bir eğiticiyi buradaki Cloud Run belgelerinde bulabilirsiniz: https://cloud.google.com/run/docs/tutorials/eventarc

6. İşlevi Test Etme

Dağıtım tamamlandığında hizmet URL'sini görürsünüz. İşlevi çağırmak için kimlik jetonunuz veya Cloud Run Çağırıcısı rolüne sahip bir ilkenin kimlik jetonuyla aşağıda gösterildiği gibi kimliği doğrulanmış bir istek göndermeniz gerekir:

# get the Service URL
SERVICE_URL="$(gcloud run services describe crf-nodejs-event --region us-central1 --format 'value(status.url)')"

# invoke the service
curl -H "Authorization: bearer $(gcloud auth print-identity-token)" -X GET $SERVICE_URL

İşlevimiz dağıtılıp bir tetikleyici oluşturulduktan sonra artık işlevi çağırmaya hazırız.

Bir dosya oluşturun ve bunu Cloud Storage paketinize yükleyin. Bu işlemi Cloud Console web arayüzünden veya gsutil CLI aracını kullanarak (ör.

echo "hello world" > test.txt
gsutil cp test gs://$BUCKET_NAME

Dosya başarıyla yüklendiğinde bir etkinlik oluşturulur ve fonksiyonunuz nesne hakkında bazı temel bilgileri yazdırır (ör. girin. Bu çıkışı Cloud Console'da işlevin günlük girişlerinde bulabilirsiniz. Alternatif olarak, gcloud KSA'yı kullanarak bu çıkışı sorgulayabilirsiniz:

gcloud logging read "resource.labels.service_name=crf-nodejs-event AND textPayload: File" --format=json 

Aşağıdaki çıkışı göreceksiniz

"textPayload": "File: test.txt"

7. Tebrikler!

Tebrikler, codelab'i tamamladınız.

Cloud Run işlevleri ile ilgili belgeleri incelemenizi öneririz.

İşlediklerimiz

  • GCS paketine bir nesne yüklendiğinde tetiklenen etkinliğe dayalı Cloud Run işlevini dağıtma
  • Cloud Storage'dan etkinlik almak ve Cloud Run işlevini çağırmak için uygun rollere sahip bir hizmet hesabı oluşturma

8. Temizleme

Yanlışlıkla ücret almamak için (örneğin, bu Cloud Run hizmeti yanlışlıkla ücretsiz katmandaki aylık Cloud Run çağırma hizmetinden daha fazla kez çağrılırsa) Cloud Run hizmetini veya 2. adımda oluşturduğunuz projeyi silebilirsiniz.

Cloud Run hizmetlerini silmek için https://console.cloud.google.com/run/ adresinden Cloud Run Cloud Console'a gidip bu codelab'de oluşturduğunuz crf-event-codelab hizmetini silin.

Projenin tamamını silmeyi tercih ederseniz https://console.cloud.google.com/cloud-resource-manager adresine gidip 2. adımda oluşturduğunuz projeyi, ardından Sil'i seçebilirsiniz. Projeyi silerseniz Cloud SDK'nızdaki projeleri değiştirmeniz gerekir. gcloud projects list komutunu çalıştırarak mevcut tüm projelerin listesini görüntüleyebilirsiniz.