نحوه برنامه ریزی یک کار اجرای ابری در محیط کنترل های سرویس VPC

1. مقدمه

نمای کلی

اگر پروژه GCP شما در محیط VPC SC قرار دارد، برای تنظیم کارهای برنامه ریزی شده باید اقدامات بیشتری انجام دهید. از آنجایی که Cloud Scheduler نمی تواند مستقیماً کارها را در محیط های VPC SC راه اندازی کند، باید درخواست را از طریق مؤلفه دیگری پراکسی کنید. توصیه می کنیم از یک سرویس Cloud Run به عنوان این پروکسی استفاده کنید.

معماری به شکل زیر است:

نمودار Cloud Scheduler که سرویس Cloud Run را راه اندازی می کند که یک کار Cloud Run را اجرا می کند

چیزی که یاد خواهید گرفت

  • نحوه اجرای Cloud Run Job بر اساس برنامه زمانی در محیط VPC SC
  • نحوه ایجاد یک سرویس Cloud Run که یک کار Cloud Run را با استفاده از کتابخانه های کلاینت Cloud Run راه اندازی می کند
  • نحوه پیکربندی Cloud Scheduler برای فراخوانی یک سرویس Cloud Run در یک برنامه زمانبندی

2. قبل از شروع

ابتدا مطمئن شوید که مراحل راه اندازی Cloud Run برای کنترل های سرویس VPC را دنبال کرده اید.

در مرحله بعد، متغیرهای محیطی را تنظیم کنید که در سراسر این کد لبه مورد استفاده قرار خواهند گرفت.

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 را ایجاد کنید

این کد لبه از نمونه کانتینر کارهای Cloud Run استفاده می کند.

ابتدا یک مخزن Artifact Registry برای محفظه کار Cloud Run خود ایجاد کنید.

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

سپس، نمونه کانتینر کارهای Cloud Run را در یک Artifact Registry در پروژه پیکربندی شده VPC SC خود کپی کنید. با دنبال کردن این دستورالعمل‌های نصب ، می‌توانید از ابزار gcrane برای انجام این کار استفاده کنید. در اسناد کپی کردن تصاویر بین مخازن می توانید درباره gcrane اطلاعات بیشتری کسب کنید.

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

دوم، کار Cloud Run خود را که برای کنترل‌های سرویس 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

برای اطلاعات بیشتر در مورد ایجاد مشاغل، لطفاً مراحل ذکر شده در اینجا در مستندات مشاغل Cloud Run را دنبال کنید.

4. یک حساب سرویس ایجاد کنید

این حساب سرویس توسط Cloud Run برای فراخوانی کار Cloud Run استفاده خواهد شد.

ابتدا با اجرای این دستور اکانت سرویس ایجاد کنید:

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

دوم، نقش Cloud Run Invoker و نقش Cloud Run Viewer را به حساب سرویس اختصاص دهید.

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 را ایجاد کنید

در این مرحله، یک سرویس Cloud Run را مستقر خواهید کرد که به عنوان یک پروکسی عمل می کند.

mkdir job-runner-service && cd $_

یک فایل به نام main.py با کد زیر ایجاد کنید.

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

فایلی با نام requirements.txt با کد زیر ایجاد کنید.

google-cloud-run
flask

در نهایت یک 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"]

سپس با استفاده از دستورات docker زیر، کانتینر را بسازید. توجه داشته باشید که راه‌اندازی‌های مبتنی بر منبع می‌تواند در محیط VPC SC چالش‌برانگیز باشد. اگر یک خط لوله ساخت و استقرار موجود دارید، از آن برای ساخت کد منبع در یک کانتینر و استقرار کانتینر به عنوان یک سرویس 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

اکنون سرویس Cloud Run خود را که برای کنترل‌های سرویس 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

با اجرای این دستور URL نقطه پایانی سرویس را ذخیره کنید:

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

6. یک کار Cloud Schedule برای راه اندازی سرویس ایجاد کنید

# 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 Job ایجاد شد، می توانید دستور زیر را برای اجرای فوری Cloud Scheduler Job برای اهداف آزمایشی اجرا کنید:

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

توجه:

ممکن است لازم باشد چند دقیقه صبر کنید تا اجرای کار کامل شود. می توانید وضعیت آن را در صفحه Cloud Run Scheduler پیگیری کنید.

با اجرای دستورات زیر بررسی کنید که کار Cloud Run با موفقیت اجرا شده است:

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

و شما باید چیزی شبیه به زیر ببینید:

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

7. تبریک می گویم!

برای تکمیل کد لبه تبریک می گویم!

آنچه را پوشش داده ایم

  • نحوه اجرای Cloud Run Job بر اساس برنامه زمانی در محیط VPC SC
  • نحوه ایجاد یک سرویس Cloud Run که یک کار Cloud Run را با استفاده از کتابخانه های کلاینت Cloud Run راه اندازی می کند
  • نحوه پیکربندی Cloud Scheduler برای فراخوانی یک سرویس Cloud Run در یک برنامه زمانبندی

8. پاکسازی کنید

برای جلوگیری از هزینه‌های غیرعمدی، (به عنوان مثال، اگر سرویس‌های Cloud Run سهواً بیشتر از تخصیص فراخوانی ماهانه Cloud Run در ردیف رایگان فراخوانی می‌شوند)، می‌توانید خدمات GCP را حذف کنید یا پروژه‌ای را که در مرحله 2 ایجاد کرده‌اید حذف کنید.

برای حذف سرویس Cloud Run و کار Cloud Run، به Cloud Run Cloud Console در https://console.cloud.google.com/run بروید و سرویس را حذف کنید.

اگر تصمیم به حذف کل پروژه دارید، می‌توانید به https://console.cloud.google.com/cloud-resource-manager بروید، پروژه‌ای را که در مرحله ۲ ایجاد کرده‌اید انتخاب کنید و حذف را انتخاب کنید. اگر پروژه را حذف کنید، باید پروژه ها را در Cloud SDK خود تغییر دهید. با اجرای gcloud projects list می توانید لیست تمام پروژه های موجود را مشاهده کنید.