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

۱. مقدمه

نمای کلی

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

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

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

آنچه یاد خواهید گرفت

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

۲. قبل از شروع

ابتدا مطمئن شوید که مراحل راه‌اندازی 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

۳. کار 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 jobs را در یک 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 را دنبال کنید.

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

این حساب سرویس توسط 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

۵. سرویس 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"]

در مرحله بعد، با استفاده از دستورات داکر زیر، کانتینر را بسازید. توجه داشته باشید که راه‌اندازی استقرارهای مبتنی بر منبع در محیط 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)')

۶. یک کار زمان‌بندی ابری برای راه‌اندازی سرویس ایجاد کنید

# 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

۷. تبریک می‌گویم!

تبریک می‌گویم که آزمایشگاه کد را تمام کردید!

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

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

۸. تمیز کردن

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

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

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