VPC Hizmet Kontrolleri çevresinde Cloud Run işi planlama

1. Giriş

Genel Bakış

GCP projeniz bir VPC SC çevresindeyse planlanmış işler oluşturmak için ek adımlar atmanız gerekir. Cloud Scheduler, VPC SC çevresindeki 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 tetiklemesini gösteren şema

Neler öğreneceksiniz?

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

2. Başlamadan önce

Öncelikle, VPC Hizmet Kontrolleri için Cloud Run'u 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 kod laboratuvarında örnek Cloud Run jobs kapsayıcısı kullanılır.

Öncelikle, Cloud Run 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ş kapsayıcısını VPC SC yapılandırılmış projenizdeki bir Artifact Registry'ye kopyalayın. Bu işlemi yapmak için kurulum talimatlarını uygulayarak gcrane aracını kullanabilirsiniz. gcrane hakkında daha fazla bilgiyi replikalar arasında resim kopyalamayla ilgili belgelerde 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 ile uyumlu 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

İşlev oluşturma hakkında daha fazla bilgi için lütfen Cloud Run işlevleri dokümanlarında 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, aşağıdaki 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 olarak çalışan bir Cloud Run hizmeti dağıtacaksınız.

mkdir job-runner-service && cd $_

Aşağıdaki kodu içeren 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 içeren requirements.txt adlı bir dosya oluşturun.

google-cloud-run
flask

Son olarak, bir 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ı derleyin. 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 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

Artık VPC Hizmet Kontrolleri ile uyumlu Cloud Run hizmetinizi dağıtabilirsiniz.

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

Aşağıdaki 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 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 Planlayıcı 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!

Codelab'i tamamladığınız için tebrikler.

İşlediğimiz konular

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

8. Temizleme

Yanlışlıkla yapılan ödemeleri önlemek için (örneğin, Cloud Run hizmetleri yanlışlıkla ücretsiz kademede aylık Cloud Run çağrısı tahsisatınızdan daha fazla kez ç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 adresindeki Cloud Run Cloud Console'a gidip hizmeti silin.

Projenin tamamını silmeyi seçerseniz https://console.cloud.google.com/cloud-resource-manager adresine gidip 2. adımda oluşturduğunuz projeyi seçin ve Sil'i tıklayın. 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.