יצירה ופריסה של פונקציית HTTP Cloud Run באמצעות Ruby (דור ראשון)

במדריך הזה נסביר איך לכתוב פונקציה של Cloud Run באמצעות זמן הריצה של Ruby. יש שני סוגים של פונקציות Cloud Run:

  • פונקציית HTTP, שמפעילים אותה מבקשות HTTP רגילות.
  • פונקציה מבוססת-אירועים, שמשמשת לטיפול באירועים מהתשתית של Cloud, כמו הודעות בנושא Pub/Sub או שינויים בקטגוריה של Cloud Storage.

בדוגמה מוצג איך ליצור פונקציית HTTP פשוטה.

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

  1. נכנסים לחשבון Google Cloud . אם אתם משתמשים חדשים ב- Google Cloud, צרו חשבון כדי שתוכלו להעריך את הביצועים של המוצרים שלנו בתרחישים מהעולם האמיתי. לקוחות חדשים מקבלים בחינם גם קרדיט בשווי 300$ להרצה, לבדיקה ולפריסה של עומסי העבודה.
  2. התקינו את ה-CLI של Google Cloud.

  3. אם אתם משתמשים בספק זהויות חיצוני (IdP), קודם אתם צריכים להיכנס ל-CLI של gcloud באמצעות המאגר המאוחד לניהול זהויות.

  4. כדי לאתחל את ה-CLI של gcloud, הריצו את הפקודה הבאה:

    gcloud init
  5. יוצרים או בוחרים Google Cloud פרויקט.

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

    • Select a project: כדי לבחור פרויקט לא צריך תפקיד IAM ספציפי – אפשר לבחור כל פרויקט שקיבלתם בו תפקיד.
    • יצירת פרויקט: כדי ליצור פרויקט, צריך את התפקיד Project Creator (יצירת פרויקטים) (roles/resourcemanager.projectCreator), שכולל את ההרשאה resourcemanager.projects.create. איך מקצים תפקידים
    • יוצרים Google Cloud פרויקט:

      gcloud projects create PROJECT_ID

      מחליפים את PROJECT_ID בשם של פרויקט Google Cloud שיוצרים.

    • בוחרים את הפרויקט שיצרתם: Google Cloud

      gcloud config set project PROJECT_ID

      מחליפים את PROJECT_ID בשם הפרויקט ב- Google Cloud .

  6. מוודאים שהחיוב מופעל בפרויקט Google Cloud .

  7. מפעילים את Cloud Functions API ואת Cloud Build API:

    תפקידים שנדרשים להפעלת ממשקי API

    כדי להפעיל ממשקי API, נדרשת ההרשאה serviceusage.services.enable. אם יצרתם את הפרויקט, סביר להניח שכבר יש לכם את ההרשאה הזו דרך התפקיד 'בעלים' (roles/owner). אחרת, תוכלו לקבל את ההרשאה הזו דרך התפקיד 'אדמין של Service Usage' (roles/serviceusage.serviceUsageAdmin). איך מקצים תפקידים

    gcloud services enable cloudfunctions cloudbuild.googleapis.com
  8. התקינו את ה-CLI של Google Cloud.

  9. אם אתם משתמשים בספק זהויות חיצוני (IdP), קודם אתם צריכים להיכנס ל-CLI של gcloud באמצעות המאגר המאוחד לניהול זהויות.

  10. כדי לאתחל את ה-CLI של gcloud, הריצו את הפקודה הבאה:

    gcloud init
  11. יוצרים או בוחרים Google Cloud פרויקט.

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

    • Select a project: כדי לבחור פרויקט לא צריך תפקיד IAM ספציפי – אפשר לבחור כל פרויקט שקיבלתם בו תפקיד.
    • יצירת פרויקט: כדי ליצור פרויקט, צריך את התפקיד Project Creator (יצירת פרויקטים) (roles/resourcemanager.projectCreator), שכולל את ההרשאה resourcemanager.projects.create. איך מקצים תפקידים
    • יוצרים Google Cloud פרויקט:

      gcloud projects create PROJECT_ID

      מחליפים את PROJECT_ID בשם של פרויקט Google Cloud שיוצרים.

    • בוחרים את הפרויקט שיצרתם: Google Cloud

      gcloud config set project PROJECT_ID

      מחליפים את PROJECT_ID בשם הפרויקט ב- Google Cloud .

  12. מוודאים שהחיוב מופעל בפרויקט Google Cloud .

  13. מפעילים את Cloud Functions API ואת Cloud Build API:

    תפקידים שנדרשים להפעלת ממשקי API

    כדי להפעיל ממשקי API, נדרשת ההרשאה serviceusage.services.enable. אם יצרתם את הפרויקט, סביר להניח שכבר יש לכם את ההרשאה הזו דרך התפקיד 'בעלים' (roles/owner). אחרת, תוכלו לקבל את ההרשאה הזו דרך התפקיד 'אדמין של Service Usage' (roles/serviceusage.serviceUsageAdmin). איך מקצים תפקידים

    gcloud services enable cloudfunctions cloudbuild.googleapis.com
  14. מכינים את סביבת הפיתוח.

    מעבר למדריך ההגדרה של Ruby

יצירת פונקציה

  1. יוצרים ספרייה במערכת המקומית לקוד הפונקציה:

    ‫Linux או Mac OS X

    mkdir ~/helloworld
    cd ~/helloworld
    

    Windows

    mkdir %HOMEPATH%\helloworld
    cd %HOMEPATH%\helloworld
    
  2. יוצרים קובץ app.rb בספרייה helloworld עם התוכן הבא:

    require "functions_framework"
    require "cgi/escape"
    require "json"
    
    FunctionsFramework.http "hello_http" do |request|
      # The request parameter is a Rack::Request object.
      # See https://www.rubydoc.info/gems/rack/Rack/Request
      name = request.params["name"] ||
             begin
               request.body.rewind
               JSON.parse(request.body.read)["name"]
             rescue StandardError
               nil
             end ||
             "World"
      # Return the response body as a string.
      # You can also return a Rack::Response object, a Rack response array, or
      # a hash which will be JSON-encoded into a response.
      "Hello #{CGI.escape_html name}!"
    end

    הפונקציה לדוגמה הזו מקבלת שם שסופק בבקשת ה-HTTP ומחזירה ברכה, או "Hello World!‎" אם לא סופק שם.

ציון יחסי תלות

יחסי תלות ב-Ruby מנוהלים באמצעות bundler ומופיעים בקובץ בשם Gemfile.

כשפורסים את הפונקציה, פונקציות Cloud Run מורידות ומתקינות את התלויות שמוצהרות ב-Gemfile וב-Gemfile.lock באמצעות bundler.

ב-Gemfile מפורטים החבילות שנדרשות לפונקציה, יחד עם אילוצים אופציונליים לגבי הגרסה. בפונקציית Cloud Run, אחד מהחבילות האלה צריך להיות ה-gem‏ functions_framework.

לצורך התרגיל הזה, יוצרים קובץ בשם Gemfile באותה תיקייה שבה נמצא הקובץ app.rb שמכיל את קוד הפונקציה, עם התוכן הבא:

source "https://rubygems.org"

gem "functions_framework", "~> 0.7"

מריצים את הפקודה הבאה כדי להתקין את קובץ ה-functions_framework gem ותלות אחרת:

bundle install

פיתוח ובדיקה באופן מקומי

לפני שמפיצים את הפונקציה, אפשר לפתח ולבדוק אותה באופן מקומי. מריצים את הפקודה הבאה כדי להשתמש בקובץ ההפעלה functions-framework-ruby כדי להפעיל שרת אינטרנט מקומי שמריץ את הפונקציה hello_http:

bundle exec functions-framework-ruby --target hello_http
# ...starts the web server in the foreground

אם הפונקציה נוצרת בהצלחה, מוצגת כתובת ה-URL שאפשר להיכנס אליה בדפדפן האינטרנט כדי לראות את הפונקציה בפעולה: http://localhost:8080/. אמורה להופיע ההודעה Hello World!.

לחלופין, אפשר לשלוח בקשות לפונקציה הזו באמצעות curl מחלון טרמינל אחר:

curl localhost:8080
# Output: Hello World!

מידע נוסף על בדיקת פונקציות זמין במאמר בנושא Testing Functions במסמכי התיעוד של Ruby Functions Framework.

פריסת הפונקציה

כדי לפרוס את הפונקציה עם טריגר HTTP, מריצים את הפקודה הבאה בספרייה helloworld:

gcloud functions deploy hello_http --no-gen2 --runtime ruby40 --trigger-http --allow-unauthenticated

הדגל --allow-unauthenticated מאפשר להגיע לפונקציה ללא אימות. כדי לדרוש אימות, לא מציינים את הדגל.

בדיקת הפונקציה שנפרסה

  1. אחרי שהפונקציה מסיימת את הפריסה, כדאי לשים לב למאפיין httpsTrigger.url או למצוא אותו באמצעות הפקודה הבאה:

    gcloud functions describe hello_http
    

    הוא אמור להיראות כך:

    https://GCP_REGION-PROJECT_ID.cloudfunctions.net/hello_http
  2. נכנסים לכתובת ה-URL הזו בדפדפן. אמורה להופיע ההודעה Hello World!‎.

    אפשר לנסות להעביר שם בבקשת ה-HTTP, למשל באמצעות כתובת ה-URL הבאה:

    https://GCP_REGION-PROJECT_ID.cloudfunctions.net/hello_http?name=NAME

    ההודעה "Hello NAME!‎" אמורה להופיע.

צפייה ביומנים

אפשר לצפות ביומנים של פונקציות Cloud Run בממשק המשתמש של Cloud Logging או באמצעות Google Cloud CLI.

צפייה ביומנים באמצעות כלי שורת הפקודה

כדי להציג את היומנים של הפונקציה באמצעות ה-CLI של gcloud, משתמשים בפקודה logs read ואחריה שם הפונקציה:

gcloud functions logs read hello_http

הפלט אמור להיראות כך:

LEVEL  NAME       EXECUTION_ID  TIME_UTC                 LOG
D      helloHttp  rvb9j0axfclb  2019-09-18 22:06:25.983  Function execution started
D      helloHttp  rvb9j0axfclb  2019-09-18 22:06:26.001  Function execution took 19 ms, finished with status code: 200

צפייה ביומנים במרכז השליטה של רישום ביומן

אפשר גם לצפות ביומנים של פונקציות Cloud Run ממסוףGoogle Cloud .