יצירה של פונקציית Cloud Run שמחזירה תוצאות של Spanner

בעזרת פונקציות Cloud Run אפשר ליצור שירותים ללא שרת שמבצעים שאילתות על נתונים ב-Spanner ומציגים אותם באמצעות HTTP. במדריך הזה תכתבו ותפרסו פונקציה שמופעלת באמצעות HTTP ומאחזרת רשומות ממסד נתונים של Spanner.

מטרות

כותבים, פורסים ומפעילים פונקציית HTTP שניגשת ל-Spanner.

עלויות

במאמר הזה משתמשים ב-Spanner וב-Cloud Run, שהם רכיבים בתשלום ב- Google Cloud.

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

  1. במאמר הזה אנחנו מניחים שיש לכם מכונה של Spanner בשם test-instance ומסד נתונים בשם example-db שמשתמש בסכימה של אפליקציית המוזיקה. כדי ליצור מכונה ומסד נתונים עם סכימה של אפליקציית מוזיקה, תוכלו להיעזר במדריך למתחילים באמצעות המסוף או במדריכים לתחילת העבודה ב-Node.js או ב-Python.

  2. מפעילים את Cloud Run API ואת Cloud Build API.

    הפעלת ממשקי ה-API

  3. מתקינים ומפעילים את ה-CLI של gcloud.

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

    gcloud components update
    
  4. הכנת סביבת הפיתוח:

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

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

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

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

אתם או האדמין שלכם צריכים להקצות לחשבון השירות של Cloud Build את תפקיד ה-IAM הבא.

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

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

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

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

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

תפקידים של הזהות בשירות

אתם צריכים להקצות את תפקיד ה-IAM הבא לזהות השירות שבה אתם משתמשים בשירות Cloud Run.

  • קורא מסדי נתונים של Spanner‏ (roles/spanner.databaseReader)

איך מנהלים את הגישה ברמת הפרויקט, התיקייה והארגון

הכנת הבקשה

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

    Node.js

    git clone https://github.com/GoogleCloudPlatform/nodejs-docs-samples.git

    אפשר גם להוריד את הקובץ לדוגמה כקובץ ZIP ולחלץ אותו.

    Python

    git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git

    אפשרות נוספת היא להוריד את הדוגמה כקובץ ZIP ולחלץ אותה.

  2. עוברים לספרייה שמכילה את הקוד לדוגמה של פונקציות Cloud Run לגישה ל-Spanner:

    Node.js

    cd nodejs-docs-samples/functions/spanner

    Python

    cd python-docs-samples/functions/spanner
  3. הנה קוד לדוגמה:

    Node.js

    // Imports the Google Cloud client library
    const {Spanner} = require('@google-cloud/spanner');
    
    // Imports the functions framework to register your HTTP function
    const functions = require('@google-cloud/functions-framework');
    
    // Instantiates a client
    const spanner = new Spanner();
    
    // Your Cloud Spanner instance ID
    const instanceId = 'test-instance';
    
    // Your Cloud Spanner database ID
    const databaseId = 'example-db';
    
    /**
     * HTTP Cloud Function.
     *
     * @param {Object} req Cloud Function request context.
     * @param {Object} res Cloud Function response context.
     */
    functions.http('spannerQuickstart', async (req, res) => {
      // Gets a reference to a Cloud Spanner instance and database
      const instance = spanner.instance(instanceId);
      const database = instance.database(databaseId);
    
      // The query to execute
      const query = {
        sql: 'SELECT * FROM Albums',
      };
    
      // Execute the query
      try {
        const results = await database.run(query);
        const rows = results[0].map(row => row.toJSON());
        rows.forEach(row => {
          res.write(
            `SingerId: ${row.SingerId}, ` +
              `AlbumId: ${row.AlbumId}, ` +
              `AlbumTitle: ${row.AlbumTitle}\n`
          );
        });
        res.status(200).end();
      } catch (err) {
        res.status(500).send(`Error querying Spanner: ${err}`);
      }
    });

    Python

    import functions_framework
    from google.cloud import spanner
    
    instance_id = "test-instance"
    database_id = "example-db"
    
    client = spanner.Client()
    instance = client.instance(instance_id)
    database = instance.database(database_id)
    
    
    @functions_framework.http
    def spanner_read_data(request):
        query = "SELECT * FROM Albums"
    
        outputs = []
        with database.snapshot() as snapshot:
            results = snapshot.execute_sql(query)
    
            for row in results:
                output = "SingerId: {}, AlbumId: {}, AlbumTitle: {}".format(*row)
                outputs.append(output)
    
        return "\n".join(outputs)
    
    

    הפונקציה שולחת שאילתת SQL כדי לאחזר את כל הנתונים מסוג Albums ממסד הנתונים. הפונקציה מופעלת כששולחים בקשת HTTP לנקודת הקצה של הפונקציה.

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

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

Node.js

gcloud run deploy nodejs-spanner-function \
    --source . \
    --region REGION \
    --function spannerQuickstart \
    --base-image RUNTIME_ID \
    --log-http

Python

gcloud run deploy python-spanner-function \
    --source . \
    --region REGION \
    --function spanner_read_data \
    --base-image RUNTIME_ID \
    --log-http

מחליפים את:

פריסת הפונקציה עשויה להימשך עד שתי דקות.

שימו לב לערך של url שמוחזר בסיום הפריסה של הפונקציה. תשתמשו בו כשמפעילים את הפונקציה.

אפשר לראות את הפונקציות שנפרסו בדף Cloud Run במסוףGoogle Cloud . בדף הזה אפשר גם ליצור ולערוך פונקציות, ולקבל פרטים וניתוחים לגבי הפונקציות.

הפעלת הפונקציה

שולחים בקשת HTTP לפונקציה:

curl URL

מחליפים את URL בערך כתובת ה-URL שמוחזר כשהפריסה של הפונקציה מסתיימת.

אמור להופיע פלט עם התוצאות של שאילתת ה-SQL, בהנחה שביצעתם את השלבים במדריך למתחילים ואכלסתם את מסד הנתונים:

SingerId: 2, AlbumId: 2, AlbumTitle: Forever Hold Your Peace
SingerId: 1, AlbumId: 2, AlbumTitle: Go, Go, Go
SingerId: 2, AlbumId: 1, AlbumTitle: Green
SingerId: 2, AlbumId: 3, AlbumTitle: Terrified
SingerId: 1, AlbumId: 1, AlbumTitle: Total Junk

אפשר גם להיכנס לכתובת ה-URL של הפונקציה בדפדפן כדי לראות את התוצאה של שאילתת ה-SQL.

הסרת המשאבים

כדי להימנע מצבירת חיובים נוספים בחשבון Google Cloud על המשאבים של Spanner ופונקציות Cloud Run שבהם השתמשתם במאמר הזה:

  1. מוחקים את המכונה:

    gcloud CLI instances delete test-instance
    
  2. מוחקים את השירות ב-Cloud Run שפרסתם במדריך הזה:

    Node.js

    gcloud run services delete nodejs-spanner-function

    Python

    gcloud run services delete python-spanner-function

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