VPC Hizmet Kontrolleri çevresinde Cloud Run işi planlama

1. Giriş

Genel Bakış

GCP projeniz bir VPC SC çevresindeyse planlanmış işleri ayarlamak için ek adımlar atmanız gerekir. Cloud Scheduler, VPC SC sınırları içindeki işleri doğrudan tetikleyemediğinden isteği başka bir bileşen üzerinden proxy'lemeniz gerekir. Bu proxy olarak bir Cloud Run hizmeti kullanmanızı öneririz.

Mimari şu şekildedir:

Cloud Scheduler'ın Cloud Run işi yürüten bir Cloud Run hizmetini tetiklediği diyagram

Neler öğreneceksiniz?

  • VPC SC çevresinde planlanmış bir Cloud Run işini çalıştırma
  • Cloud Run istemci kitaplıklarını kullanarak Cloud Run işini tetikleyen bir Cloud Run hizmeti oluşturma
  • Cloud Scheduler'ı, planlı olarak Cloud Run hizmeti çağıracak şekilde yapılandırma

2. Başlamadan önce

Öncelikle, Cloud Run'ı VPC Hizmet Kontrolleri için ayarlama adımlarını uyguladığınızdan emin olun.

Ardından, bu codelab boyunca kullanılacak ortam değişkenlerini ayarlayın.

PROJECT_ID=<YOUR_PROJECT_ID>
REGION=<YOUR_REGION>
AR_REPO=sample-job-repo
CLOUD_RUN_SERVICE=job-runner-service
CLOUD_RUN_JOB=sample-job
CLOUD_SCHEDULER=job-scheduler
SERVICE_ACCOUNT="cloud-run-invoker-sa"
SERVICE_ACCOUNT_ADDRESS=$SERVICE_ACCOUNT@$PROJECT_ID.iam.gserviceaccount.com
NETWORK=default
SUBNET=default

3. Cloud Run işini oluşturma

Bu codelab'de örnek Cloud Run işleri kapsayıcısı kullanılır.

Öncelikle Cloud Run işi kapsayıcınız için bir Artifact Registry deposu oluşturun.

gcloud artifacts repositories create $AR_REPO --repository-format=docker --location=$REGION --description="codelab for Cloud Run jobs on schedule within VPC SC"

Ardından, örnek Cloud Run işleri kapsayıcısını VPC SC yapılandırılmış projenizdeki bir Artifact Registry'ye kopyalayın. Bu işlemi yapmak için gcrane aracını kullanabilir ve yükleme talimatlarını uygulayabilirsiniz. gcrane hakkında daha fazla bilgiyi depolar arasında resim kopyalama belgelerinde bulabilirsiniz.

gcrane cp us-docker.pkg.dev/cloudrun/container/job:latest $REGION-docker.pkg.dev/$PROJECT_ID/$AR_REPO/$CLOUD_RUN_JOB:latest

İkinci olarak, VPC Hizmet Kontrolleri'ne uygun Cloud Run işinizi dağıtın.

gcloud run jobs create $CLOUD_RUN_JOB --region $REGION \
 --image $REGION-docker.pkg.dev/$PROJECT_ID/$AR_REPO/$CLOUD_RUN_JOB:latest \
 --network=$NETWORK \
 --subnet=$SUBNET \
 --vpc-egress=all-traffic

İş oluşturma hakkında daha fazla bilgi için lütfen Cloud Run işleri belgelerinde burada listelenen adımları uygulayın.

4. Hizmet hesabı oluşturma

Bu hizmet hesabı, Cloud Run işini çağırmak için Cloud Run tarafından kullanılır.

Öncelikle şu komutu çalıştırarak hizmet hesabını oluşturun:

gcloud iam service-accounts create $SERVICE_ACCOUNT \
  --display-name="Cloud Run to run a Cloud Run job"

İkinci olarak, hizmet hesabına Cloud Run Çağırıcısı rolünü ve Cloud Run Görüntüleyici rolünü verin.

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member serviceAccount:$SERVICE_ACCOUNT_ADDRESS \
  --role=roles/run.invoker

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member serviceAccount:$SERVICE_ACCOUNT_ADDRESS \
  --role=roles/run.viewer

5. Cloud Run hizmetini oluşturma

Bu adımda, proxy görevi gören bir Cloud Run hizmeti dağıtacaksınız.

mkdir job-runner-service && cd $_

Aşağıdaki kodu kullanarak main.py adlı bir dosya oluşturun.

import os
from flask import Flask
app = Flask(__name__)

# pip install google-cloud-run
from google.cloud import run_v2

@app.route('/')
def hello():

    client = run_v2.JobsClient()

    # UPDATE TO YOUR JOB NAME, REGION, AND PROJECT ID
    job_name = 'projects/YOUR_PROJECT_ID/locations/YOUR_JOB_REGION/jobs/YOUR_JOB_NAME' 

    print("Triggering job...")
    request = run_v2.RunJobRequest(name=job_name)
    operation = client.run_job(request=request)
    response = operation.result()

    print(response)
    return "Done!"

if __name__ == '__main__':
    app.run(debug=True, host="0.0.0.0", port=int(os.environ.get("PORT", 8080)))

Aşağıdaki kodu kullanarak requirements.txt adlı bir dosya oluşturun.

google-cloud-run
flask

Son olarak, Dockerfile oluşturun.

FROM python:3.9-slim-buster
# for logging purposes
ENV PYTHONUNBUFFERED=True

WORKDIR /app

COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt

COPY . .

CMD ["python3", "main.py"]

Ardından, aşağıdaki Docker komutlarını kullanarak kapsayıcıyı oluşturun. Kaynak tabanlı dağıtımların VPC SC ortamında ayarlanmasının zor olabileceğini unutmayın. Mevcut bir derleme ve dağıtım ardışık düzeniniz varsa kaynak kodu bir kapsayıcıya derlemek ve kapsayıcıyı Cloud Run hizmeti olarak dağıtmak için bu ardışık düzeni kullanın.

docker build -t $CLOUD_RUN_SERVICE .

docker tag $CLOUD_RUN_SERVICE $REGION-docker.pkg.dev/$PROJECT_ID/$AR_REPO/$CLOUD_RUN_SERVICE

docker push $REGION-docker.pkg.dev/$PROJECT_ID/$AR_REPO/$CLOUD_RUN_SERVICE

Şimdi VPC Hizmet Kontrolleri'ne uygun Cloud Run hizmetinizi dağıtın.

gcloud run deploy $CLOUD_RUN_SERVICE --region $REGION \
 --image $REGION-docker.pkg.dev/$PROJECT_ID/$AR_REPO/$CLOUD_RUN_SERVICE \
 --service-account $SERVICE_ACCOUNT_ADDRESS \
 --network=$NETWORK \
 --subnet=$SUBNET \
 --vpc-egress=all-traffic \
 --no-allow-unauthenticated \
 --ingress internal

Şu komutu çalıştırarak hizmet uç noktası URL'sini kaydedin:

SERVICE_URL=$(gcloud run services describe $CLOUD_RUN_SERVICE --region $REGION --format 'value(status.url)')

6. Hizmeti tetiklemek için bir Cloud Scheduler işi oluşturun.

# create the Cloud Scheduler job
gcloud scheduler jobs create http $CLOUD_SCHEDULER \
  --location=$REGION \
  --schedule="0 0 1 * *" \
  --uri=$SERVICE_URL \
  --http-method=GET \
  --oidc-service-account-email=$SERVICE_ACCOUNT_ADDRESS

Cloud Scheduler işi oluşturulduktan sonra, test amacıyla Cloud Scheduler işini hemen çalıştırmak için aşağıdaki komutu çalıştırabilirsiniz:

gcloud scheduler jobs run $CLOUD_SCHEDULER --location=$REGION

NOT:

İşin yürütülmesinin tamamlanması için birkaç dakika beklemeniz gerekebilir. Durumunu Cloud Run Scheduler sayfasından takip edebilirsiniz.

Aşağıdaki komutları çalıştırarak Cloud Run işinin başarıyla çalıştığını doğrulayın:

EXECUTION_NAME=$(gcloud run jobs describe $CLOUD_RUN_JOB --region $REGION --format 'value(status.latestCreatedExecution.name)')

gcloud run jobs executions describe $EXECUTION_NAME --region $REGION

Aşağıdakine benzer bir ifade görürsünüz:

✔ Execution sample-job-w6hrj in region us-central1
1 task completed successfully
Elapsed time: 28 seconds

7. Tebrikler!

Tebrikler, codelab'i tamamladınız.

İşlediğimiz konular

  • VPC SC çevresinde planlanmış bir Cloud Run işini çalıştırma
  • Cloud Run istemci kitaplıklarını kullanarak Cloud Run işini tetikleyen bir Cloud Run hizmeti oluşturma
  • Cloud Scheduler'ı, planlı olarak Cloud Run hizmeti çağıracak şekilde yapılandırma

8. Temizleme

Yanlışlıkla ücretlendirilmemek için (örneğin, Cloud Run hizmetleri ücretsiz katmanda aylık Cloud Run çağırma tahsisinizden daha fazla sayıda çağrılırsa) GCP hizmetlerini veya 2. adımda oluşturduğunuz projeyi silebilirsiniz.

Cloud Run hizmetini ve Cloud Run işini silmek için https://console.cloud.google.com/run adresinden Cloud Run Cloud Console'a gidin ve hizmeti 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.