1. بررسی اجمالی
در آزمایشگاههای قبلی، یک نسخه رویداد محور از برنامه Pic-a-daily ساختهاید که از یک عملکرد ابری راهاندازی Google Cloud Storage برای سرویس تجزیه و تحلیل تصویر، یک کانتینر Cloud Run با استفاده از GCS از طریق Pub/Sub برای سرویس تصویر بندانگشتی و Eventarc برای فعال کردن سرویس Image Garbage Collector در Cloud Run. همچنین یک سرویس کلاژ Cloud Scheduler فعال شد:
در این آزمایشگاه، یک نسخه هماهنگ از برنامه ایجاد خواهید کرد. به جای انواع مختلف رویدادها که در سیستم جریان دارند، از Workflows برای هماهنگی و فراخوانی خدمات به شرح زیر استفاده خواهید کرد:
چیزی که یاد خواهید گرفت
- موتور برنامه
- Cloud Firestore
- توابع ابری
- Cloud Run
- گردش کار
2. راه اندازی و الزامات
تنظیم محیط خود به خود
- به کنسول Cloud وارد شوید و یک پروژه جدید ایجاد کنید یا از یک موجود استفاده مجدد کنید. (اگر قبلاً یک حساب Gmail یا Google Workspace ندارید، باید یک حساب ایجاد کنید .)
شناسه پروژه را به خاطر بسپارید، یک نام منحصر به فرد در تمام پروژه های Google Cloud (نام بالا قبلاً گرفته شده است و برای شما کار نخواهد کرد، متأسفیم!). بعداً در این آزمایشگاه کد به عنوان PROJECT_ID
نامیده خواهد شد.
- در مرحله بعد، برای استفاده از منابع Google Cloud، باید صورتحساب را در Cloud Console فعال کنید .
اجرا کردن از طریق این کد لبه نباید هزینه زیادی داشته باشد، اگر اصلاً باشد. حتماً دستورالعملهای موجود در بخش «تمیز کردن» را دنبال کنید که به شما توصیه میکند چگونه منابع را خاموش کنید تا بیش از این آموزش متحمل صورتحساب نشوید. کاربران جدید Google Cloud واجد شرایط برنامه آزمایشی رایگان 300 دلاری هستند.
Cloud Shell را راه اندازی کنید
در حالی که Google Cloud را می توان از راه دور از لپ تاپ شما کار کرد، در این کد لبه از Google Cloud Shell استفاده خواهید کرد، یک محیط خط فرمان که در Cloud اجرا می شود.
از کنسول GCP روی نماد Cloud Shell در نوار ابزار بالا سمت راست کلیک کنید:
تهیه و اتصال به محیط فقط چند لحظه طول می کشد. وقتی تمام شد، باید چیزی شبیه به این را ببینید:
این ماشین مجازی با تمام ابزارهای توسعه که شما نیاز دارید بارگذاری شده است. این یک فهرست اصلی 5 گیگابایتی دائمی را ارائه می دهد و در Google Cloud اجرا می شود و عملکرد و احراز هویت شبکه را تا حد زیادی افزایش می دهد. تمام کارهای شما در این آزمایشگاه به سادگی با یک مرورگر قابل انجام است.
3. مقدمه ای بر گردش کار
میتوانید از Workflows برای ایجاد گردشهای کاری بدون سرور استفاده کنید که مجموعهای از وظایف بدون سرور را به ترتیبی که شما تعریف میکنید به یکدیگر پیوند میدهند. میتوانید قدرت APIهای Google Cloud، محصولات بدون سرور مانند Cloud Functions و Cloud Run و تماسهای APIهای خارجی را برای ایجاد برنامههای بدون سرور انعطافپذیر ترکیب کنید.
همانطور که ممکن است از یک ارکستر انتظار داشته باشید، Workflows به شما این امکان را می دهد که جریان منطق کسب و کار خود را در یک زبان تعریف گردش کار مبتنی بر YAML/JSON تعریف کنید و یک Workflows Execution API و Workflows UI برای راه اندازی این جریان ها ارائه می دهد.
این چیزی بیش از یک ارکستر کننده صرف با این ویژگی های داخلی و قابل تنظیم است:
- کنترل مجدد و خطای انعطاف پذیر بین مراحل برای اجرای مطمئن مراحل.
- تجزیه JSON و عبور متغیر بین مراحل برای جلوگیری از چسب کد.
- فرمولهای بیان برای تصمیمگیریها امکان اجرای گامهای مشروط را میدهند.
- جریانهای فرعی برای گردشهای کاری مدولار و قابل استفاده مجدد.
- پشتیبانی از خدمات خارجی امکان هماهنگی سرویسها را فراتر از Google Cloud فراهم میکند.
- پشتیبانی از احراز هویت برای Google Cloud و خدمات خارجی برای اجرای ایمن مراحل.
- اتصالات به سرویسهای Google Cloud مانند Pub/Sub، Firestore، Tasks، Secret Manager برای ادغام آسانتر.
ناگفته نماند که Workflows یک محصول بدون سرور کاملاً مدیریت شده است. هیچ سروری برای پیکربندی یا مقیاس بندی وجود ندارد و شما فقط برای آنچه استفاده می کنید هزینه می پردازید.
4. API ها را فعال کنید
در این آزمایشگاه، خدمات Cloud Function و Cloud Run را با Workflows متصل خواهید کرد. شما همچنین از App Engine، Cloud Build، Vision API و سایر خدمات استفاده خواهید کرد.
در Cloud Shell، مطمئن شوید که تمام خدمات لازم فعال هستند:
gcloud services enable \ appengine.googleapis.com \ cloudbuild.googleapis.com \ cloudfunctions.googleapis.com \ compute.googleapis.com \ firestore.googleapis.com \ run.googleapis.com \ vision.googleapis.com \ workflows.googleapis.com \
پس از مدتی، باید عملیات را با موفقیت مشاهده کنید:
Operation "operations/acf.5c5ef4f6-f734-455d-b2f0-ee70b5a17322" finished successfully.
5. کد را دریافت کنید
اگر قبلاً در آزمایشگاههای کد قبلی نبودهاید، کد را دریافت کنید:
git clone https://github.com/GoogleCloudPlatform/serverless-photosharing-workshop
شما ساختار پوشه زیر را خواهید داشت که مربوط به این آزمایشگاه است:
frontend | workflows | ├── functions ├── |── trigger-workflow ├── |── vision-data-transform ├── services ├── |── collage ├── |── thumbnails ├── workflows.yaml
اینها پوشه های مربوطه هستند:
-
frontend
شامل قسمت جلویی App Engine است که از آزمایشگاه 4 مجدداً استفاده خواهیم کرد. -
functions
شامل توابع ابری است که برای گردش کار ایجاد شده است. -
services
شامل سرویس های Cloud Run هستند که برای گردش کار اصلاح شده اند. -
workflows.yaml
فایل تعریف گردش کار است.
6. گردش کار YAML را کاوش کنید
workflows.yaml گردش کار را در یک سری مراحل تعریف می کند. بیایید آن را مرور کنیم تا آن را بهتر درک کنیم.
در ابتدای گردش کار، برخی از پارامترها وجود دارد که به آنها منتقل می شود. بعداً به این توابع خواهیم رسید، اما گردش کار به این صورت شروع می شود:
در YAML، میتوانید ببینید که این پارامترها به متغیرهایی در مرحله init
مانند نام فایل و سطل که رویداد را راهاندازی میکنند، و آدرسهای اینترنتی برخی از توابع Cloud و سرویسهای Cloud Run که Workflows آنها را فراخوانی میکند، اختصاص مییابد:
main: params: [args] steps: - init: assign: - file: ${args.file} - bucket: ${args.bucket} - gsUri: ${"gs://" + bucket + "/" + file} - projectId: ${sys.get_env("GOOGLE_CLOUD_PROJECT_ID")} - urls: ${args.urls}
سپس، Workflows نوع رویداد را بررسی می کند. 2 نوع رویداد پشتیبانی می شود: object.finalize
(در صورت ذخیره یک فایل در سطل ذخیره سازی ابری منتشر می شود) و object.delete
(با حذف فایل منتشر می شود). هر چیز دیگری رویدادی را ایجاد می کند که پشتیبانی نمی شود.
در اینجا مرحله تعریف گردش کار YAML است که در آن نوع رویداد ذخیره سازی فایل را بررسی می کنیم:
- eventTypeSwitch: switch: - condition: ${args.eventType == "google.storage.object.finalize"} next: imageAnalysisCall - condition: ${args.eventType == "google.storage.object.delete"} next: pictureGarbageCollectionGCS - eventTypeNotSupported: raise: ${"eventType " + args.eventType + " is not supported"} next: end
توجه داشته باشید که چگونه Workflows از دستورهای سوئیچ و مدیریت استثنا پشتیبانی می کند، با دستور سوئیچ و شرایط مختلف آن، و دستورالعمل افزایش برای ایجاد خطا در زمانی که رویداد شناسایی نمی شود.
در مرحله بعد، بیایید نگاهی به imageAnalysisCall
بیندازیم. این مجموعهای از فراخوانهای Workflows برای فراخوانی Vision API برای تجزیه و تحلیل تصویر، تبدیل دادههای پاسخ Vision API برای مرتبسازی برچسبهای چیزهای شناساییشده در تصویر، انتخاب رنگهای غالب، بررسی ایمن بودن تصویر برای نمایش است و سپس ابرداده را در Cloud Firestore ذخیره کنید.
توجه داشته باشید که همه چیز در Workflow ها انجام می شود به جز Vision Transform Cloud Functions (که بعداً آن را اجرا خواهیم کرد):
مراحل در YAML به این صورت است:
- imageAnalysisCall: call: http.post args: url: https://vision.googleapis.com/v1/images:annotate headers: Content-Type: application/json auth: type: OAuth2 body: requests: - image: source: gcsImageUri: ${gsUri} features: - type: LABEL_DETECTION - type: SAFE_SEARCH_DETECTION - type: IMAGE_PROPERTIES result: imageAnalysisResponse - transformImageAnalysisData: call: http.post args: url: ${urls.VISION_DATA_TRANSFORM_URL} auth: type: OIDC body: ${imageAnalysisResponse.body} result: imageMetadata - checkSafety: switch: - condition: ${imageMetadata.body.safe == true} next: storeMetadata next: end - storeMetadata: call: http.request args: url: ${"https://firestore.googleapis.com/v1/projects/" + projectId + "/databases/(default)/documents/pictures/" + file + "?updateMask.fieldPaths=color&updateMask.fieldPaths=labels&updateMask.fieldPaths=created"} auth: type: OAuth2 method: PATCH body: name: ${"projects/" + projectId + "/databases/(default)/documents/pictures/" + file} fields: color: stringValue: ${imageMetadata.body.color} created: timestampValue: ${imageMetadata.body.created} labels: arrayValue: values: ${imageMetadata.body.labels} result: storeMetadataResponse
پس از تجزیه و تحلیل تصویر، دو مرحله بعدی ایجاد تصویر کوچک تصویر و کلاژی از جدیدترین تصاویر است. این کار با استقرار 2 سرویس Cloud Run و برقراری تماس با آنها از مراحل thumbnailCall
و collageCall
انجام می شود:
مراحل در YAML:
- thumbnailCall: call: http.post args: url: ${urls.THUMBNAILS_URL} auth: type: OIDC body: gcsImageUri: ${gsUri} result: thumbnailResponse - collageCall: call: http.get args: url: ${urls.COLLAGE_URL} auth: type: OIDC result: collageResponse
این شاخه از اجرا با بازگرداندن کدهای وضعیت از هر سرویس در مرحله finalizeCompleted
به پایان می رسد:
- finalizeCompleted: return: imageAnalysis: ${imageAnalysisResponse.code} storeMetadata: ${storeMetadataResponse.code} thumbnail: ${thumbnailResponse.code} collage: ${collageResponse.code}
شاخه دیگر اجرا زمانی است که یک فایل از سطل ذخیره اصلی حذف می شود که حاوی نسخه های با وضوح بالا از تصاویر است. در این شاخه، میخواهیم تصویر کوچک تصویر را در سطل حاوی ریز عکسها حذف کرده و ابرداده آن را از Firestore حذف کنیم. هر دوی این موارد با تماس های HTTP از Workflows انجام می شود:
مراحل در YAML:
- pictureGarbageCollectionGCS: try: call: http.request args: url: ${"https://storage.googleapis.com/storage/v1/b/thumbnails-" + projectId + "/o/" + file} auth: type: OAuth2 method: DELETE result: gcsDeletionResult except: as: e steps: - dummyResultInOutVar: assign: - gcsDeletionResult: code: 200 body: "Workaround for empty body response" - pictureGarbageCollectionFirestore: call: http.request args: url: ${"https://firestore.googleapis.com/v1/projects/" + projectId + "/databases/(default)/documents/pictures/" + file} auth: type: OAuth2 method: DELETE result: firestoreDeletionResult
شاخه حذف با بازگرداندن نتایج / کدهای هر مرحله به پایان می رسد:
- deleteCompleted: return: gcsDeletion: ${gcsDeletionResult} firestoreDeletion: ${firestoreDeletionResult.code}
در مراحل زیر، تمام وابستگی های خارجی Workflow ها را ایجاد خواهیم کرد: سطل ها، توابع ابری، سرویس های Cloud Run و پایگاه داده Firestore.
7. سطل ها را ایجاد کنید
برای تصاویر به 2 سطل نیاز دارید: 1 برای ذخیره تصاویر اصلی با وضوح بالا و 1 سطل برای ذخیره ریز عکسها.
با استفاده از ابزار gsutil
یک سطل عمومی منطقه ای (در این مورد در اروپا) با دسترسی یکسان برای آپلود تصاویر توسط کاربران ایجاد کنید:
export BUCKET_PICTURES=uploaded-pictures-${GOOGLE_CLOUD_PROJECT} gsutil mb -l EU gs://${BUCKET_PICTURES} gsutil uniformbucketlevelaccess set on gs://${BUCKET_PICTURES} gsutil iam ch allUsers:objectViewer gs://${BUCKET_PICTURES}
یک سطل منطقه ای عمومی دیگر برای تصاویر کوچک ایجاد کنید:
export BUCKET_THUMBNAILS=thumbnails-${GOOGLE_CLOUD_PROJECT} gsutil mb -l EU gs://${BUCKET_THUMBNAILS} gsutil uniformbucketlevelaccess set on gs://${BUCKET_THUMBNAILS} gsutil iam ch allUsers:objectViewer gs://${BUCKET_THUMBNAILS}
با مراجعه به بخش Cloud Storage در Cloud Console میتوانید دوباره بررسی کنید که سطلها ایجاد و عمومی شدهاند:
8. Vision Data Transform (عملکرد ابری)
Workflows.yaml با مراحل init
، eventTypeSwitch
، eventTypeNotSupported
شروع می شود. اینها مطمئن می شوند که رویدادهایی که از سطل ها می آیند به مراحل صحیح هدایت می شوند.
برای رویداد object.finalize
، مرحله imageAnalysisCall
با Vision API تماس می گیرد تا متادیتای تصویر ایجاد شده را استخراج کند. تمام این مراحل در Workflow ها انجام می شود:
در مرحله بعد، قبل از اینکه بتوانیم آن را در Firestore ذخیره کنیم، باید داده های برگشتی از Vision API را تبدیل کنیم. به طور دقیق تر، ما باید:
- برچسب های بازگشتی برای تصویر را فهرست کنید.
- رنگ غالب تصویر را بازیابی کنید.
- تعیین کنید که آیا تصویر ایمن است یا خیر.
این به صورت کد در یک Cloud Function انجام می شود و Workflows به سادگی این تابع را فراخوانی می کند:
کد را کاوش کنید
به عملکرد ابری vision-data-transform
میگویند. می توانید کد کامل آن را در index.js بررسی کنید. همانطور که می بینید، تنها هدف این تابع این است که تبدیل JSON به JSON را انجام دهد تا متادیتای تصویر را به راحتی در Firestore ذخیره کند.
استقرار در توابع ابری
به پوشه بروید:
cd workflows/functions/vision-data-transform/nodejs
منطقه مورد نظر خود را تنظیم کنید:
export REGION=europe-west1 gcloud config set functions/region ${REGION}
استقرار تابع با:
export SERVICE_NAME=vision-data-transform gcloud functions deploy ${SERVICE_NAME} \ --source=. \ --runtime nodejs10 \ --entry-point=vision_data_transform \ --trigger-http \ --allow-unauthenticated
هنگامی که تابع مستقر شد، مرحله Workflows transformImageAnalysisData
میتواند این تابع را برای تبدیل داده Vision API فراخوانی کند.
9. پایگاه داده را آماده کنید
مرحله بعدی در Workflow ها بررسی ایمنی تصویر از داده های تصویر و سپس ذخیره اطلاعات مربوط به تصویر بازگردانده شده توسط Vision API در پایگاه داده Cloud Firestore ، یک پایگاه داده اسناد NoSQL سریع، کاملاً مدیریت شده، بدون سرور و ابری است:
هر دوی اینها در Workflows انجام می شود، اما شما باید پایگاه داده Firestore را برای ذخیره سازی ابرداده ایجاد کنید.
ابتدا، یک اپلیکیشن App Engine را در منطقه ای که می خواهید پایگاه داده Firestore ایجاد کنید (الزامی برای Firestore):
export REGION_FIRESTORE=europe-west2 gcloud app create --region=${REGION_FIRESTORE}
سپس پایگاه داده Firestore را در همان منطقه ایجاد کنید:
gcloud firestore databases create --region=${REGION_FIRESTORE}
اسناد به صورت برنامه نویسی در مجموعه ما ایجاد می شوند و شامل 4 فیلد خواهند بود:
- name (string): نام فایل تصویر آپلود شده که کلید سند نیز می باشد
- برچسب ها (آرایه رشته ها): برچسب های موارد شناسایی شده توسط Vision API
- رنگ (رشته): کد رنگ هگزادسیمال رنگ غالب (یعنی #ab12ef)
- ایجاد (تاریخ): مُهر زمانی ذخیره شدن فراداده این تصویر
- تصویر بندانگشتی (بولی): یک فیلد اختیاری که در صورت ایجاد یک تصویر کوچک برای این تصویر وجود دارد و درست است.
از آنجایی که در Firestore برای یافتن تصاویری که دارای ریز عکسها هستند جستجو میکنیم و بر اساس تاریخ ایجاد مرتب میکنیم، باید یک فهرست جستجو ایجاد کنیم. با دستور زیر می توانید ایندکس را ایجاد کنید:
gcloud firestore indexes composite create --collection-group=pictures \ --field-config field-path=thumbnail,order=descending \ --field-config field-path=created,order=descending
توجه داشته باشید که ایجاد ایندکس می تواند تا 10 دقیقه یا بیشتر طول بکشد.
پس از ایجاد ایندکس، می توانید آن را در Cloud Console ببینید:
مرحله storeMetadata
Workflows میتواند هماکنون فراداده تصویر را در Firestore ذخیره کند.
10. سرویس تصویر کوچک (Cloud Run)
بعدی در زنجیره ایجاد یک تصویر کوچک از یک تصویر است. این به صورت کد در یک سرویس Cloud Run انجام می شود و Workflows این سرویس را در مرحله thumbnailCall
فراخوانی می کند:
کد را کاوش کنید
سرویس Cloud Run thumbnails
نامیده می شود. می توانید کد کامل آن را در index.js بررسی کنید.
تصویر ظرف را بسازید و منتشر کنید
Cloud Run کانتینرها را اجرا می کند اما ابتدا باید تصویر کانتینر را بسازید (تعریف شده در Dockerfile
). از Google Cloud Build می توان برای ساخت تصاویر کانتینر و سپس میزبانی در Google Container Registry استفاده کرد.
به پوشه بروید:
cd workflows/services/thumbnails/nodejs
ساخت:
export SERVICE_SRC=thumbnails export SERVICE_NAME=${SERVICE_SRC}-service gcloud builds submit \ . \ --tag gcr.io/${GOOGLE_CLOUD_PROJECT}/${SERVICE_NAME}
پس از یک یا دو دقیقه، ساخت باید با موفقیت انجام شود و کانتینر در Google Container Registry مستقر می شود.
در Cloud Run مستقر شوید
چند متغیر و پیکربندی مورد نیاز را تنظیم کنید:
export BUCKET_THUMBNAILS=thumbnails-${GOOGLE_CLOUD_PROJECT} export REGION=europe-west1 gcloud config set run/region ${REGION} gcloud config set run/platform managed
با دستور زیر مستقر کنید:
gcloud run deploy ${SERVICE_NAME} \ --image gcr.io/${GOOGLE_CLOUD_PROJECT}/${SERVICE_NAME} \ --no-allow-unauthenticated \ --memory=1Gi \ --update-env-vars BUCKET_THUMBNAILS=${BUCKET_THUMBNAILS}
هنگامی که سرویس مستقر شد، Workflows thumbnailCall
step میتواند این سرویس را فراخوانی کند.
11. سرویس کلاژ (Cloud Run)
بعدی در زنجیره ایجاد یک کلاژ از جدیدترین تصاویر است. این به صورت کد در یک سرویس Cloud Run انجام می شود و Workflows این سرویس را در مرحله collageCall
فراخوانی می کند:
کد را کاوش کنید
سرویس Cloud Run collage
نامیده می شود. می توانید کد کامل آن را در index.js بررسی کنید.
تصویر ظرف را بسازید و منتشر کنید
Cloud Run کانتینرها را اجرا می کند اما ابتدا باید تصویر کانتینر را بسازید (تعریف شده در Dockerfile
). از Google Cloud Build می توان برای ساخت تصاویر کانتینر و سپس میزبانی در Google Container Registry استفاده کرد.
به پوشه بروید:
cd services/collage/nodejs
ساخت:
export SERVICE_SRC=collage export SERVICE_NAME=${SERVICE_SRC}-service gcloud builds submit \ . \ --tag gcr.io/${GOOGLE_CLOUD_PROJECT}/${SERVICE_NAME}
پس از یک یا دو دقیقه، ساخت باید با موفقیت انجام شود و کانتینر در Google Container Registry مستقر می شود.
در Cloud Run مستقر شوید
چند متغیر و پیکربندی مورد نیاز را تنظیم کنید:
export BUCKET_THUMBNAILS=thumbnails-${GOOGLE_CLOUD_PROJECT} export REGION=europe-west1 gcloud config set run/region ${REGION} gcloud config set run/platform managed
استقرار:
gcloud run deploy ${SERVICE_NAME} \ --image gcr.io/${GOOGLE_CLOUD_PROJECT}/${SERVICE_NAME} \ --no-allow-unauthenticated \ --memory=1Gi \ --update-env-vars BUCKET_THUMBNAILS=${BUCKET_THUMBNAILS}
پس از استقرار سرویس، میتوانید بررسی کنید که هر دو سرویس در بخش Cloud Run در Cloud Console در حال اجرا هستند و مرحله Workflows collageCall
قادر به فراخوانی این سرویس خواهد بود:
12. استقرار گردش کار
ما تمام وابستگی های خارجی Workflow ها را مستقر کردیم. تمام مراحل باقی مانده ( finalizeCompleted
، pictureGarbageCollectionGCS
، pictureGarbageCollectionFirestore
، deleteCompleted
) را می توان توسط خود Workflows تکمیل کرد.
زمان استقرار Workflow ها فرا رسیده است!
به پوشه ای که حاوی فایل workflows.yaml
است بروید و آن را با:
export WORKFLOW_REGION=europe-west4 export WORKFLOW_NAME=picadaily-workflows gcloud workflows deploy ${WORKFLOW_NAME} \ --source=workflows.yaml \ --location=${WORKFLOW_REGION}
در چند ثانیه، Workflow باید مستقر شود و میتوانید آن را در بخش Workflows در Cloud Console ببینید:
در صورت تمایل می توانید روی Workflow کلیک کرده و آن را ویرایش کنید. در طول ویرایش، یک نمایش بصری خوب از گردش کار دریافت می کنید:
همچنین می توانید Workflow را از Cloud Console به صورت دستی با پارامترهای مناسب اجرا کنید. در عوض، ما آن را به صورت خودکار در پاسخ به رویدادهای Cloud Storage در مرحله بعد اجرا خواهیم کرد.
13. محرک های گردش کار (توابع ابری)
گردش کار مستقر و آماده است. اکنون، زمانی که فایلی در یک سطل ذخیرهسازی ابری ایجاد یا حذف میشود، باید Workflows را فعال کنیم. اینها به ترتیب رویدادهای storage.object.finalize
و storage.object.delete
هستند.
گردش کار دارای API و کتابخانه های سرویس گیرنده برای ایجاد، مدیریت و اجرای گردش کار است که می توانید از آنها استفاده کنید. در این مورد، شما از Workflows Execution API و به طور خاص از کتابخانه مشتری Node.js آن برای راه اندازی Workflow استفاده خواهید کرد.
شما گردشهای کاری را از عملکرد Cloud با گوش دادن به رویدادهای Cloud Storage فعال خواهید کرد. از آنجایی که یک Cloud Function فقط می تواند برای یک نوع رویداد گوش دهد، شما دو تابع Cloud را برای گوش دادن به رویدادها ایجاد و حذف می کنید:
کد را کاوش کنید
تابع Cloud را trigger-workflow
می نامند. می توانید کد کامل آن را در index.js بررسی کنید.
استقرار در توابع ابری
به پوشه بروید:
cd workflows/functions/trigger-workflow/nodejs
چند متغیر و پیکربندی مورد نیاز را تنظیم کنید:
export BUCKET_PICTURES=uploaded-pictures-${GOOGLE_CLOUD_PROJECT} export REGION=europe-west1 export WORKFLOW_NAME=picadaily-workflows export WORKFLOW_REGION=europe-west4 export COLLAGE_URL=$(gcloud run services describe collage-service --format 'value(status.url)') export THUMBNAILS_URL=$(gcloud run services describe thumbnails-service --format 'value(status.url)') export VISION_DATA_TRANSFORM_URL=$(gcloud functions describe vision-data-transform --format 'value(httpsTrigger.url)') gcloud config set functions/region ${REGION}
برای نهایی کردن رویدادها، تابع پاسخگو را مستقر کنید:
export SERVICE_NAME=trigger-workflow-on-finalize gcloud functions deploy ${SERVICE_NAME} \ --source=. \ --runtime nodejs10 \ --entry-point=trigger_workflow \ --trigger-resource=${BUCKET_PICTURES} \ --trigger-event=google.storage.object.finalize \ --allow-unauthenticated \ --set-env-vars GOOGLE_CLOUD_PROJECT=${GOOGLE_CLOUD_PROJECT},WORKFLOW_REGION=${WORKFLOW_REGION},WORKFLOW_NAME=${WORKFLOW_NAME},THUMBNAILS_URL=${THUMBNAILS_URL},COLLAGE_URL=${COLLAGE_URL},VISION_DATA_TRANSFORM_URL=${VISION_DATA_TRANSFORM_URL}
تابع دوم را که به حذف رویدادها پاسخ می دهد، مستقر کنید:
export SERVICE_NAME=trigger-workflow-on-delete gcloud functions deploy ${SERVICE_NAME} \ --source=. \ --runtime nodejs10 \ --entry-point=trigger_workflow \ --trigger-resource=${BUCKET_PICTURES} \ --trigger-event=google.storage.object.delete \ --allow-unauthenticated \ --set-env-vars GOOGLE_CLOUD_PROJECT=${GOOGLE_CLOUD_PROJECT},WORKFLOW_REGION=${WORKFLOW_REGION},WORKFLOW_NAME=${WORKFLOW_NAME},THUMBNAILS_URL=${THUMBNAILS_URL},COLLAGE_URL=${COLLAGE_URL},VISION_DATA_TRANSFORM_URL=${VISION_DATA_TRANSFORM_URL}
وقتی استقرار کامل شد، میتوانید هر دو عملکرد را در Cloud Console ببینید:
14. Frontend (App Engine)
در این مرحله، یک صفحه وب در Google App Engine از Pic-a-daily ایجاد میکنید: آزمایشگاه 4 — یک صفحه وب ایجاد کنید که به کاربران امکان میدهد تصاویر را از برنامه وب آپلود کنند و همچنین تصاویر آپلود شده و تصاویر کوچک آنها را مرور کنند.
میتوانید درباره App Engine بیشتر بدانید و توضیحات کد را در Pic-a-daily بخوانید: Lab 4—Create a web frontend .
کد را کاوش کنید
برنامه App Engine را frontend
می نامند. می توانید کد کامل آن را در index.js بررسی کنید.
استقرار در App Engine
به پوشه بروید:
cd frontend
منطقه مورد نظر خود را تنظیم کنید و همچنین GOOGLE_CLOUD_PROJECT
را در app.yaml با شناسه پروژه واقعی خود جایگزین کنید:
export REGION=europe-west1 gcloud config set compute/region ${REGION} sed -i -e "s/GOOGLE_CLOUD_PROJECT/${GOOGLE_CLOUD_PROJECT}/" app.yaml
استقرار:
gcloud app deploy app.yaml -q
پس از یک یا دو دقیقه، به شما گفته می شود که برنامه در حال ارائه ترافیک است:
Beginning deployment of service [default]... ╔════════════════════════════════════════════════════════════╗ ╠═ Uploading 8 files to Google Cloud Storage ═╣ ╚════════════════════════════════════════════════════════════╝ File upload done. Updating service [default]...done. Setting traffic split for service [default]...done. Deployed service [default] to [https://GOOGLE_CLOUD_PROJECT.appspot.com] You can stream logs from the command line by running: $ gcloud app logs tail -s default To view your application in the web browser run: $ gcloud app browse
همچنین میتوانید از بخش App Engine در Cloud Console دیدن کنید تا ببینید که برنامه مستقر است و ویژگیهای App Engine مانند نسخهسازی و تقسیم ترافیک را بررسی کنید:
15. گردش کار را آزمایش کنید
برای آزمایش، به URL پیشفرض App Engine برای برنامه ( https://<YOUR_PROJECT_ID>.appspot.com/
) بروید و باید رابط کاربری frontend را ببینید که در حال اجراست!
یک عکس آپلود کنید این باید گردشهای کاری را فعال کند و میتوانید اجرای گردش کار را در حالت Active
در کنسول Cloud ببینید:
هنگامی که گردش کار انجام شد، می توانید روی شناسه اجرا کلیک کنید و خروجی سرویس های مختلف را ببینید:
آپلود 3 عکس دیگر همچنین باید تصویر کوچک و کلاژ تصاویر را در سطلهای فضای ذخیرهسازی ابری و قسمت جلویی App Engine بهروزرسانی شده ببینید:
16. تمیز کردن (اختیاری)
اگر قصد ندارید برنامه را نگه دارید، می توانید با حذف کل پروژه، منابع را پاکسازی کنید تا در هزینه ها صرفه جویی کنید و در کل شهروند ابری خوبی باشید:
gcloud projects delete ${GOOGLE_CLOUD_PROJECT}
17. تبریک می گویم!
شما یک نسخه هماهنگ از برنامه را با استفاده از Workflows برای هماهنگی و تماس با خدمات ایجاد کردید.
آنچه را پوشش داده ایم
- موتور برنامه
- Cloud Firestore
- توابع ابری
- Cloud Run
- گردش کار