شروع به کار با عملکردهای اجرای ابری رویداد محور

1. مقدمه

نمای کلی

توابع Cloud Run روشی جدید برای استقرار بارهای کاری با استفاده از پارادایم های رویداد GCF و امضای تابع است. توابع Cloud Run به‌جای استفاده از فرآیند ساخت و پیکربندی‌های استقرار نظر ما، کنترل مستقیمی بر سرویس زیربنایی ایجاد شده در Cloud Run به شما می‌دهد.

با توابع Cloud Run، ما UX ساده از استقرار منبع Cloud Run را ارائه می‌کنیم که به توسعه‌دهندگان کنترل کاملی بر حجم کاری خود با استفاده از تنظیمات Cloud Run می‌دهیم.

در این بخش، نحوه استقرار یک تابع رویداد محور در Node را خواهید آموخت. شما تابعی را اجرا خواهید کرد که هر زمان که یک شی در یک سطل ذخیره‌سازی ابری Google نهایی شود، راه‌اندازی می‌شود.

این کد لبه از نمونه های nodejs در مثال های زیر استفاده می کند. با این حال، می‌توانید از نمونه‌های کد نسل دوم Cloud Functions به زبان انتخابی خود استفاده کنید:

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

  • نحوه استقرار یک تابع Cloud Run مبتنی بر رویداد که هر زمان که یک شی در یک سطل GCS آپلود می شود فعال می شود
  • نحوه ایجاد یک حساب کاربری با نقش های مناسب برای دریافت یک رویداد از فضای ذخیره سازی ابری و فراخوانی عملکرد Cloud Run

2. متغیرهای محیط را راه اندازی کنید و API ها را فعال کنید

gcloud CLI را به روز کنید

این کد لبه نیاز به یک نسخه جدید از gcloud CLI نصب شده دارد. شما می توانید CLI را با اجرا به روز کنید

gcloud components update

API ها را فعال کنید

قبل از اینکه بتوانید از این کد لبه استفاده کنید، چندین API وجود دارد که باید آنها را فعال کنید. این آزمایشگاه کد نیاز به استفاده از API های زیر دارد. با اجرای دستور زیر می توانید آن API ها را فعال کنید:

gcloud services enable run.googleapis.com \
    cloudbuild.googleapis.com \
    storage.googleapis.com \
    artifactregistry.googleapis.com

تنظیم متغیرهای محیطی

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

PROJECT_ID=<YOUR_PROJECT_ID>
REGION=<YOUR_REGION, e.g. us-central1>

gcloud config set project $PROJECT_ID
SERVICE_NAME=crf-event-codelab
BUCKET_NAME=$PROJECT_ID-$SERVICE_NAME
TRIGGER_NAME=$SERVICE_NAME-trigger

3. یک Storage Bucket و یک Service Account ایجاد کنید

یک سطل ذخیره سازی ایجاد کنید

با اجرای دستور زیر می توانید یک سطل فضای ذخیره سازی ابری ایجاد کنید:

gsutil mb -l us-central1 gs://$BUCKET_NAME

یک حساب کاربری ایجاد کنید

برای این مثال، یک حساب سرویس با مجوزهای مورد نیاز EventArc و نقش فراخوان دهنده Cloud Run برای دریافت یک رویداد از Cloud Storage و فراخوانی تابع Cloud Run ایجاد خواهید کرد.

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

PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format='value(projectNumber)')

SERVICE_ACCOUNT="cloud-run-functions"
SERVICE_ACCOUNT_ADDRESS=$SERVICE_ACCOUNT@$PROJECT_ID.iam.gserviceaccount.com

gcloud iam service-accounts create $SERVICE_ACCOUNT \
  --display-name="Cloud Run functions Eventarc service account"

در مرحله بعد، نقش گیرنده رویداد Eventarc (roles/eventarc.eventReceiver) در پروژه را به حساب سرویس مرتبط با ماشه Eventarc خود اعطا کنید تا تریگر بتواند رویدادها را از ارائه دهندگان رویداد دریافت کند.

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member serviceAccount:$SERVICE_ACCOUNT_ADDRESS \
  --role=roles/eventarc.eventReceiver

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

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member serviceAccount:$SERVICE_ACCOUNT_ADDRESS \
  --role=roles/run.invoker

4. ایجاد و استقرار تابع

ابتدا یک دایرکتوری برای کد منبع و سی دی در آن دایرکتوری ایجاد کنید.

mkdir ../$SERVICE_NAME && cd $_

سپس یک فایل package.json با محتوای زیر ایجاد کنید:

{
    "dependencies": {
        "@google-cloud/functions-framework": "^3.0.0"
    }
}

سپس یک فایل index.js با محتوای زیر ایجاد کنید:

const functions = require("@google-cloud/functions-framework");

// Register a CloudEvent callback with the Functions Framework that will
// be triggered by Cloud Storage.
functions.cloudEvent("helloGCS", (cloudEvent) => {
    console.log(`Event ID: ${cloudEvent.id}`);
    console.log(`Event Type: ${cloudEvent.type}`);

    const file = cloudEvent.data;
    console.log(`Bucket: ${file.bucket}`);
    console.log(`File: ${file.name}`);
    console.log(`Metageneration: ${file.metageneration}`);
    console.log(`Created: ${file.timeCreated}`);
    console.log(`Updated: ${file.updated}`);
});

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

gcloud beta run deploy $SERVICE_NAME \
 --source . \
      --function helloGCS \
      --region $REGION \
      --no-allow-unauthenticated

لطفا به موارد زیر توجه کنید:

  • از پرچم منبع استفاده می شود تا به Cloud Run بگوید که تابع را در یک سرویس مبتنی بر کانتینر قابل اجرا بسازد.
  • پرچم -function (جدید) برای تنظیم نقطه ورودی سرویس جدید به عنوان امضای تابعی که می خواهید فراخوانی شود استفاده می شود.
  • (اختیاری) -no-allow-unauthenticated برای جلوگیری از فراخوانی عمومی عملکرد شما

با اجرای دستور زیر می توانید سرویس جدید crf-nodejs-event خود را مشاهده کنید:

gcloud beta run services describe $SERVICE_NAME

5. رویداد را ایجاد کنید

می‌توانیم هر بار که یک شی در Google Cloud Storage نهایی می‌شود، یک راه‌انداز Eventarc ایجاد کنیم تا پیام‌هایی را به عملکرد خود ارسال کنیم:

BUCKET_REGION=$REGION

gcloud eventarc triggers create $TRIGGER_NAME \
     --location=$REGION \
     --destination-run-service=crf-nodejs-event \
  --destination-run-region=$BUCKET_REGION \
     --event-filters="type=google.cloud.storage.object.v1.finalized" \
     --event-filters="bucket=$BUCKET_NAME" \
     --service-account=$SERVICE_ACCOUNT_ADDRESS

لطفا به موارد زیر توجه کنید:

  • gcs-function-trigger نام تریگر است
  • crf-nodejs-event نام سرویس Cloud Run است که تابع ما در آن مستقر است.
  • برای پرچم –event-filters، از پیشوند gs:// در نام سطل خود استفاده نکنید.

آموزش دقیق راه‌اندازی سرویس Trigger از Cloud Storage با استفاده از Eventarc را می‌توانید در مستندات Cloud Run در اینجا بیابید: https://cloud.google.com/run/docs/tutorials/eventarc

6. تابع را تست کنید

وقتی استقرار کامل شد، URL سرویس را خواهید دید. برای فراخوانی تابع، باید یک درخواست احراز هویت شده با کد هویت خود یا نشانه هویت اصلی که نقش فراخوان اجرای ابری دارد، ارسال کنید، مانند شکل زیر:

# get the Service URL
SERVICE_URL="$(gcloud run services describe crf-nodejs-event --region us-central1 --format 'value(status.url)')"

# invoke the service
curl -H "Authorization: bearer $(gcloud auth print-identity-token)" -X GET $SERVICE_URL

با استفاده از تابع ما و ایجاد یک ماشه، اکنون آماده فراخوانی تابع هستیم.

یک فایل ایجاد کنید و آن را در سطل فضای ذخیره سازی ابری خود آپلود کنید. می توانید این کار را از طریق رابط وب کنسول Cloud یا با استفاده از ابزار gsutil CLI انجام دهید، به عنوان مثال

echo "hello world" > test.txt
gsutil cp test gs://$BUCKET_NAME

هنگامی که فایل با موفقیت آپلود شد، یک رویداد ایجاد می شود و تابع شما برخی از اطلاعات اولیه در مورد شی را چاپ می کند، مانند نام فایل. می‌توانید این خروجی را در ورودی‌های گزارش عملکرد در کنسول Cloud پیدا کنید. همچنین، می‌توانید با استفاده از gcloud CLI این خروجی را درخواست کنید:

gcloud logging read "resource.labels.service_name=crf-nodejs-event AND textPayload: File" --format=json 

و باید خروجی زیر را ببینید

"textPayload": "File: test.txt"

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

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

توصیه می کنیم اسناد مربوط به عملکردهای Cloud Run را بررسی کنید

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

  • نحوه استقرار یک تابع Cloud Run مبتنی بر رویداد که هر زمان که یک شی در یک سطل GCS آپلود می شود فعال می شود
  • نحوه ایجاد یک حساب کاربری با نقش های مناسب برای دریافت یک رویداد از فضای ذخیره سازی ابری و فراخوانی عملکرد Cloud Run

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

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

برای حذف سرویس های Cloud Run، به کنسول Cloud Run Cloud در https://console.cloud.google.com/run/ بروید و سرویس crf-event-codelab را که در این Codelab ایجاد کرده اید حذف کنید.

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