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 memicu tugas secara langsung 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. Buat tugas Cloud Run

Codelab ini menggunakan container tugas Cloud Run contoh.

Pertama, buat repositori Artifact Registry untuk container 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 container tugas Cloud Run contoh ke Artifact Registry dalam project yang dikonfigurasi SC VPC Anda. Anda dapat menggunakan alat gcrane untuk melakukannya dengan mengikuti petunjuk penginstalan ini. Anda dapat mempelajari lebih lanjut gcrane 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 Anda yang sesuai untuk 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 mengetahui 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. Buat 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, bangun container menggunakan perintah docker berikut. Perhatikan bahwa deployment berbasis Sumber mungkin sulit disiapkan di lingkungan VPC SC. Jika Anda memiliki pipeline build dan deployment yang sudah ada, gunakan pipeline tersebut untuk membangun 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 sesuai untuk 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. Buat 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 menjalankan Tugas Cloud Scheduler segera 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.

Verifikasi bahwa tugas Cloud Run berhasil dijalankan 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 sesuatu yang mirip dengan 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 dipanggil secara tidak sengaja lebih banyak daripada alokasi pemanggilan Cloud Run bulanan Anda di tingkat 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 Run di https://console.cloud.google.com/run, lalu hapus layanan.

Jika Anda 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.