1. Giriş
Genel Bakış
Cloud Run işlevleri, bilinen GCF etkinlik oluşturma paradigmalarını ve işlev imzasını kullanarak iş yüklerini dağıtmanın yeni bir yoludur. Cloud Run işlevleri, kendi görüşlerimize dayalı 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 sahibi olmanızı sağlar.
Cloud Run işlevleriyle, Cloud Run kaynak dağıtımının basit kullanıcı deneyimini 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, Node'da etkinlik odaklı bir işlevi nasıl dağıtacağınızı öğreneceksiniz. Bir Google Cloud Storage paketinde bir nesne sonlandırıldığında tetiklenen bir işlev dağıtacaksınız.
Bu kod laboratuvarında, aşağıdaki örneklerde nodejs örnekleri kullanılmaktadır. Ancak, Cloud Functions 2. nesil kod örneklerini istediğiniz dilde kullanabilirsiniz:
- Python işlevi örnekleri
- Node.js işlevi örnekleri
- Go işlevi örnekleri
- Java işlevi örnekleri
- PHP işlevi örnekleri
- Ruby işlevi örnekleri
- .NET işlevi örnekleri
Neler öğreneceksiniz?
- Bir GCS paketine nesne yüklendiğinde tetiklenen, etkinliğe dayalı bir Cloud Run işlevi 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 ayarlama ve API'leri etkinleştirme
gcloud CLI'yı güncelleme
Bu codelab için gcloud CLI'nin yeni bir sürümünün yüklü olması gerekir. KSA'yı güncellemek için şu komutu çalıştırabilirsiniz:
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 aşağıdaki 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 boyunca 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 bir 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 invoker rolüne sahip bir hizmet hesabı oluşturacaksınız.
Öncelikle 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 projede 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, hizmet hesabına Cloud Run Invoker rolünü vererek işlevi çağırmasına izin 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
Öncelikle kaynak kodu için bir dizin oluşturun ve bu dizine gidin.
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"
}
}
Ardından, 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
Lütfen şunları unutmayın:
- –source işareti, Cloud Run'a işlevi çalıştırılabilir bir kapsayıcı tabanlı hizmet olarak oluşturmasını söylemek 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.
- (isteğe bağlı) İşlevinizin herkese açık olarak çağrılmasını önlemek için –no-allow-unauthenticated
Aşağıdaki komutu çalıştırarak yeni hizmetinizi crf-event-codelab görüntüleyebilirsiniz:
gcloud beta run services describe $SERVICE_NAME
5. Etkinlik oluşturma
Google Cloud Storage'da bir nesne sonlandırıldığında işlevimize mesaj göndermek için bir Eventarc tetikleyicisi oluşturabiliriz:
BUCKET_REGION=$REGION
gcloud eventarc triggers create $TRIGGER_NAME \
--location=$REGION \
--destination-run-service=$SERVICE_NAME \
--destination-run-region=$BUCKET_REGION \
--event-filters="type=google.cloud.storage.object.v1.finalized" \
--event-filters="bucket=$BUCKET_NAME" \
--service-account=$SERVICE_ACCOUNT_ADDRESS
Lütfen şunları unutmayın:
- gcs-function-trigger, tetikleyicinin adıdır.
- crf-event-codelab, 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 hizmeti ayarlama ile ilgili ayrıntılı bir eğitime Cloud Run belgelerinden ulaşabilirsiniz: 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 jetonunuzla veya Cloud Run Invoker rolüne sahip bir asıl öğenin kimlik jetonuyla kimliği doğrulanmış bir istek göndermeniz gerekir.
# get the Service URL SERVICE_URL="$(gcloud run services describe $SERVICE_NAME --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ıldığı ve tetikleyici oluşturulduğu için artık işlevi çağırmaya hazırız.
Bir dosya oluşturun ve Cloud Storage paketinize yükleyin. Bu işlemi Cloud Console web arayüzü üzerinden veya gsutil KSA aracını kullanarak yapabilirsiniz. Örneğin:
echo "hello world" > test.txt gsutil cp test.txt gs://$BUCKET_NAME
Dosya başarıyla yüklendiğinde bir etkinlik oluşturulur ve işleviniz, nesneyle ilgili bazı temel bilgileri (ör. dosya adı) yazdırır. Bu çıkışı, Cloud Console'daki işlevin günlük girişlerinde bulabilirsiniz. Alternatif olarak, gcloud CLI'yı kullanarak bu çıkışı sorgulayabilirsiniz:
gcloud logging read "resource.labels.service_name=$SERVICE_NAME AND textPayload: File" --format=json
ve aşağıdaki çıkışı görmeniz gerekir.
"textPayload": "File: test.txt"
7. Tebrikler!
Tebrikler, codelab'i tamamladınız.
Cloud Run işlevleriyle ilgili dokümanları incelemenizi öneririz.
İşlediğimiz konular
- Bir GCS paketine nesne yüklendiğinde tetiklenen, etkinliğe dayalı bir Cloud Run işlevi 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 ücretlendirilmemek için (örneğin, bu Cloud Run hizmeti ücretsiz katmandaki aylık Cloud Run çağırma tahsisinizden daha fazla sayıda yanlışlıkla ç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 gidin ve 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 gidebilir, 2. adımda oluşturduğunuz projeyi seçip Sil'i tıklayabilirsiniz. Projeyi silerseniz Cloud SDK'nızda projeleri değiştirmeniz gerekir. gcloud projects list komutunu çalıştırarak kullanılabilir tüm projelerin listesini görüntüleyebilirsiniz.