Cara Menjadwalkan Tugas Cloud Run dalam perimeter Kontrol Layanan VPC

1. Pengantar

Ringkasan

Jika project GCP Anda berada di dalam perimeter VPC SC, Anda harus melakukan langkah-langkah tambahan untuk menyiapkan tugas terjadwal. Karena Cloud Scheduler tidak dapat langsung memicu tugas dalam perimeter VPC SC, Anda harus melakukan proxy permintaan melalui komponen lain. Sebaiknya gunakan layanan Cloud Run sebagai proxy ini.

Arsitekturnya terlihat seperti ini:

Diagram Cloud Scheduler yang memicu layanan Cloud Run yang menjalankan tugas Cloud Run

Yang akan Anda pelajari

  • Cara menjalankan Tugas Cloud Run sesuai jadwal di dalam perimeter VPC SC
  • Cara membuat layanan Cloud Run yang memicu tugas Cloud Run menggunakan library klien Cloud Run
  • Cara mengonfigurasi Cloud Scheduler untuk memanggil layanan Cloud Run sesuai jadwal

2. Sebelum memulai

Pertama, pastikan Anda telah mengikuti langkah-langkah untuk menyiapkan Cloud Run untuk Kontrol Layanan VPC.

Selanjutnya, tetapkan variabel lingkungan yang akan digunakan di seluruh codelab ini.

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. Membuat tugas Cloud Run

Codelab ini menggunakan contoh penampung tugas Cloud Run.

Pertama, buat repo Artifact Registry untuk penampung tugas Cloud Run Anda.

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

Selanjutnya, salin contoh penampung tugas Cloud Run ke Artifact Registry dalam project yang dikonfigurasi dengan VPC SC. Anda dapat menggunakan alat gcrane untuk melakukannya dengan mengikuti petunjuk penginstalan ini. Anda dapat mempelajari gcrane lebih lanjut di dokumentasi untuk menyalin image antar-repositori.

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

Kedua, deploy tugas Cloud Run yang mematuhi Kontrol Layanan VPC.

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

Untuk informasi selengkapnya tentang cara membuat Tugas, ikuti langkah-langkah yang tercantum di sini dalam dokumentasi tugas Cloud Run.

4. Membuat Akun layanan

Akun layanan ini akan digunakan oleh Cloud Run untuk memanggil tugas Cloud Run.

Pertama, buat akun layanan dengan menjalankan perintah ini:

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

Kedua, berikan peran Cloud Run Invoker dan peran Cloud Run Viewer ke akun layanan.

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. Membuat layanan Cloud Run

Pada langkah ini, Anda akan men-deploy layanan Cloud Run yang bertindak sebagai proxy.

mkdir job-runner-service && cd $_

Buat file bernama main.py dengan kode berikut.

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)))

Buat file bernama requirements.txt dengan kode berikut.

google-cloud-run
flask

Terakhir, buat Dockerfile.

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"]

Selanjutnya, build container menggunakan perintah docker berikut. Perhatikan bahwa deployment berbasis Sumber dapat sulit disiapkan di lingkungan VPC SC. Jika Anda sudah memiliki pipeline build dan deployment, gunakan pipeline tersebut untuk mem-build kode sumber ke dalam container dan men-deploy container sebagai layanan Cloud Run.

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

Sekarang, deploy layanan Cloud Run Anda yang mematuhi Kontrol Layanan VPC.

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

Simpan URL endpoint layanan dengan menjalankan perintah ini:

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

6. Membuat tugas Cloud Scheduler untuk memicu layanan

# 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

Setelah Tugas Cloud Scheduler dibuat, Anda dapat menjalankan perintah berikut untuk segera menjalankan Tugas Cloud Scheduler untuk tujuan pengujian:

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

CATATAN:

Anda mungkin perlu menunggu beberapa menit hingga eksekusi tugas selesai. Anda dapat melacak statusnya di halaman Cloud Run Scheduler.

Pastikan tugas Cloud Run berhasil berjalan dengan menjalankan perintah berikut:

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

dan Anda akan melihat tampilan seperti berikut:

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

7. Selamat!

Selamat, Anda telah menyelesaikan codelab.

Yang telah kita bahas

  • Cara menjalankan Tugas Cloud Run sesuai jadwal di dalam perimeter VPC SC
  • Cara membuat layanan Cloud Run yang memicu tugas Cloud Run menggunakan library klien Cloud Run
  • Cara mengonfigurasi Cloud Scheduler untuk memanggil layanan Cloud Run sesuai jadwal

8. Pembersihan

Untuk menghindari tagihan yang tidak disengaja, (misalnya, jika layanan Cloud Run tidak sengaja dipanggil lebih dari alokasi pemanggilan Cloud Run bulanan Anda di paket gratis), Anda dapat menghapus layanan GCP atau menghapus project yang Anda buat di Langkah 2.

Untuk menghapus layanan Cloud Run dan tugas Cloud Run, buka Konsol Cloud Cloud Run di https://console.cloud.google.com/run, lalu hapus layanan tersebut.

Jika memilih untuk menghapus seluruh project, Anda dapat membuka https://console.cloud.google.com/cloud-resource-manager, memilih project yang Anda buat di Langkah 2, lalu memilih Hapus. Jika menghapus project, Anda harus mengubah project di Cloud SDK. Anda dapat melihat daftar semua project yang tersedia dengan menjalankan gcloud projects list.