מעבר משירות Images של App Engine ל-Cloud Run

מזהה אזור

REGION_ID הוא קוד מקוצר ש-Google מקצה על סמך האזור שבוחרים כשיוצרים את האפליקציה. הקוד לא תואם למדינה או למחוז, למרות שחלק ממזהי האזורים עשויים להיראות דומים לקודים נפוצים של מדינות ומחוזות. באפליקציות שנוצרו אחרי פברואר 2020, המחרוזת REGION_ID.r כלולה בכתובות ה-URL של App Engine. באפליקציות קיימות שנוצרו לפני התאריך הזה, מזהה האזור הוא אופציונלי בכתובת ה-URL.

מידע נוסף על מזהי אזורים

כדי לעדכן את עיבוד התמונות באפליקציות App Engine הקיימות, אפשר לפרוס שירות להמרת תמונות בקונטיינר ב-Cloud Run ולהפנות אליו את הקריאות לשירות התמונות של App Engine.

ההעברה הזו לא דורשת שינויים משמעותיים בקוד לעיבוד התמונות או באירוח של אפליקציית App Engine ב-Cloud Run. במקום זאת, כשמגדירים את האפליקציה, ה-SDK של שירותי App Engine מיירט את הקריאות לשירות App Engine Images ומנתב אותן לשירות Cloud Run. השירות מעבד את התמונות באמצעות מנוע Pillow בקוד פתוח דרך gRPC ומחזיר את התוצאות לאפליקציית App Engine. ההגדרה הזו מחליפה את הקצה העורפי של שירות התמונות הקודם של App Engine בפתרון מודרני שמותאם לענן.

מגבלות

  • כשמשתמשים בשירות לעיבוד תמונות בהתאמה אישית, אי אפשר ליצור כתובות URL להצגת תמונות. מערכת App Engine מחזירה חריגה בזמן ריצה כשמפעילים את השיטה getServingUrl(). ההגבלה הזו מונעת הסתמכות על הבק-אנד מדור קודם לאחסון ולהצגת תמונות.

    כדי להציג תמונות, מומלץ להציג אותן ישירות מכתובת URL של Cloud Storage, או להשתמש בקטגוריה של Cloud Storage שמגובה על ידי Cloud CDN, בהתאם לדרישות האפליקציה.

    כתובות URL קיימות שיצרתם באמצעות קריאות מדור קודם לשיטה getServingUrl() ימשיכו להציג תמונות.

  • כשמשדרגים את גרסת ה-SDK של שירותי App Engine, מערכת App Engine לא מנתבת אוטומטית קריאות של App Engine לשירות Cloud Run. האפליקציה שלכם תחיל את ההתנהגות החדשה רק אחרי שתגדירו את משתני הסביבה להעברה APPENGINE_USE_CUSTOM_IMAGES_GRPC_SERVICE ו-APPENGINE_IMAGES_SERVICE_ENDPOINT.

לפני שמתחילים

  1. מוודאים שיש לכם גישה לקוד המקור של App Engine.

  2. מפעילים את Cloud Run Admin API ואת Artifact Registry API:

    הפעלת ממשקי API

התפקידים הנדרשים

אתם יכולים ליצור חשבון שירות חדש או להשתמש באותו חשבון שירות בניהול המשתמשים ב-Cloud Run שבו אתם משתמשים ב-App Engine. אתם או האדמין שלכם צריכים להעניק לחשבון הפריסה ולחשבון השירות של Cloud Build את תפקידי ה-IAM הבאים.

לחצו כדי לראות את התפקידים הנדרשים לחשבון הפריסה

כדי לקבל את ההרשאות שנדרשות לבנייה ולפריסה ממקור, צריך לבקש מהאדמין להקצות לכם את תפקידי ה-IAM הבאים:

לחצו כדי לראות את התפקידים הנדרשים לחשבון השירות של Cloud Build

Cloud Build משתמש אוטומטית בחשבון השירות שמוגדר כברירת מחדל ב-Compute Engine כחשבון השירות שמוגדר כברירת מחדל ב-Cloud Build כדי לבנות את קוד המקור ואת משאב Cloud Run, אלא אם משנים את ההתנהגות הזו. כדי ש-Cloud Build יוכל לבצע build של המקורות, צריך לבקש מהאדמין להעניק את התפקיד Cloud Run Builder (roles/run.builder) לחשבון השירות שמוגדר כברירת מחדל ב-Compute Engine בפרויקט:

  gcloud projects add-iam-policy-binding PROJECT_ID \
      --member=serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com \
      --role=roles/run.builder
  

מחליפים את PROJECT_NUMBER במספר הפרויקט ואת PROJECT_ID במזהה הפרויקט. Google CloudGoogle Cloudהוראות מפורטות לאיתור מזהה הפרויקט ומספר הפרויקט זמינות במאמר יצירה וניהול של פרויקטים.

הענקת תפקיד ה-builder ב-Cloud Run לחשבון השירות שמוגדר כברירת מחדל ב-Compute Engine לוקחת כמה דקות עד שהיא מופצת.

רשימת ההרשאות והתפקידים ב-IAM שמשויכים ל-Cloud Run מופיעה במאמרים תפקידי IAM ב-Cloud Run והרשאות IAM ב-Cloud Run. אם שירות Cloud Run שלכם מתקשר עםGoogle Cloud ממשקי API, כמו ספריות לקוח ב-Cloud, כדאי לעיין במדריך להגדרת זהות שירות. מידע נוסף על מתן תפקידים זמין במאמרים הרשאות פריסה וניהול גישה.

תהליך ההעברה

ההעברה הזו כוללת את השלבים הבאים:

  1. פורסים את שירות המרת התמונות ב-Cloud Run כדי לקבל את כתובת ה-URL של השירות.
  2. מגדירים את קובצי המקור של App Engine עם כתובת ה-URL של שירות Cloud Run ועם דגלי הניתוב, ואז פורסים מחדש את אפליקציית App Engine.
  3. בודקים את האפליקציה כדי לוודא שפונקציית עיבוד התמונות פועלת.

פריסת שירות להמרת תמונות ב-Cloud Run

כדי לפרוס את שירות שינוי התמונות ולהגדיר את הגישה שלו ל-Cloud Storage, פועלים לפי השלבים הבאים:

  1. פורסים את הקונטיינר של שירות טרנספורמציית התמונות שנבנה מראש בשירות Cloud Run. חשוב לוודא שפריסת האפליקציה מתבצעת עם אימות חובה (--no-allow-unauthenticated). ערכת ה-SDK של שירותי App Engine מטפלת באימות כשמתבצעות קריאות לשירות הזה:

    gcloud run deploy image-processing-service \
        --image=us-central1-docker.pkg.dev/gae-bundled-services-images/image-processing-service-staging/image-processing-service:public-image-d476f7ef9d1b \
        --no-allow-unauthenticated \
        --region=REGION
    

    מחליפים את REGION באזור שבו אתם פורסים את שירות Cloud Run. מומלץ לפרוס את השירות באותו אזור שבו נמצא שירות App Engine.

    רושמים את כתובת ה-URL של השירות של Cloud Run שפרסתם, לדוגמה, https://image-processing-service-xyz-uc.a.run.app.

  2. מקצים את התפקיד Cloud Run Invoker‏ (roles/run.invoker) לחשבון השירות שמוגדר כברירת מחדל של App Engine. כך אפליקציית App Engine יכולה לאשר ולנתב קריאות לשירות Cloud Run פרטי:

    gcloud run services add-iam-policy-binding image-processing-service \
        --member="serviceAccount:PROJECT_ID@appspot.gserviceaccount.com" \
        --role="roles/run.invoker" \
        --region=REGION
    
  3. מקצים את התפקיד Cloud Storage Object Viewer‏ (roles/storage.objectViewer) לחשבון השירות שמוגדר כברירת מחדל ב-Compute Engine. ההרשאה הזו מאפשרת לשירות להמרת תמונות לקרוא תמונות שמאוחסנות ב-Cloud Storage:

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member="serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com" \
        --role="roles/storage.objectViewer"
    

    מחליפים את מה שכתוב בשדות הבאים:

    • PROJECT_ID: מזהה הפרויקט שבו אתם פורסים את שירות Cloud Run.
    • PROJECT_NUMBER: מספר הפרויקט שבו אתם פורסים את שירות Cloud Run.

הגדרת קובצי המקור

כדי להגדיר את אפליקציית Java כך שתשתמש בשירות להמרת תמונות ב-Cloud Run, פועלים לפי השלבים הבאים:

  1. מעדכנים את הקובץ pom.xml כדי לכלול את יחסי התלות הבאים:

    • מוסיפים או מעדכנים את התלות appengine-api-1.0-sdk:

      <dependency>
        <groupId>com.google.appengine</groupId>
        <artifactId>appengine-api-1.0-sdk</artifactId>
        <version>5.0.5-beta.1</version>
      </dependency>
      
    • מוסיפים את התלות google-auth-library-oauth2-http לתקשורת מאובטחת עם Cloud Run:

      <dependency>
        <groupId>com.google.auth</groupId>
        <artifactId>google-auth-library-oauth2-http</artifactId>
        <version>1.20.0</version>
      </dependency>
      
  2. מעדכנים את הקובץ appengine-web.xml כדי להגדיר את משתני הסביבה הנדרשים:

    <?xml version="1.0" encoding="utf-8"?>
    <appengine-web-app xmlns="http://appengine.google.com/ns/1.0">
        <runtime>RUNTIME</runtime> <!-- a supported Java runtime version -->
        <threadsafe>true</threadsafe>
    
        <!-- List the Images service -->
        <app-engine-bundled-services>
            <api>images</api>
        </app-engine-bundled-services>
    
        <env-variables>
            <!-- Enable the custom gRPC Images service -->
            <env-var name="APPENGINE_USE_CUSTOM_IMAGES_GRPC_SERVICE" value="true" />
    
            <!-- The URL of the Cloud Run service you deployed -->
            <env-var name="APPENGINE_IMAGES_SERVICE_ENDPOINT" value="RUN_SERVICE_URL" />
        </env-variables>
    </appengine-web-app>
    

    מחליפים את מה שכתוב בשדות הבאים:

    • RUNTIME: גרסת Java runtime נתמכת.
    • RUN_SERVICE_URL: כתובת ה-URL של שירות Cloud Run שפרסתם.
  3. פורסים את האפליקציה ב-App Engine:

    mvn clean package appengine:deploy clean
    
  4. מפעילים את הדפדפן וניגשים לשירות האינטרנט על ידי הרצת הפקודה הבאה:

    gcloud app browse
    

בדיקת האפליקציה

כדי לוודא שהאפליקציה משתמשת בהצלחה בשירות להמרת תמונות ב-Cloud Run:

  1. מפעילים את הפונקציונליות של עיבוד התמונות באפליקציית App Engine שפרסתם.
  2. בודקים את Logs Explorer עבור אפליקציית App Engine. מוודאים שאין שגיאות שקשורות לשיחות com.google.appengine.api.images.
  3. בודקים את היומנים של Cloud Run image-processing-service כדי לוודא ש-Cloud Run קיבל את הבקשות ועיבד אותן.

המאמרים הבאים