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

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

מטרות

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

עלויות

במסמך הזה נעשה שימוש ב-Spanner וב-Cloud Run, שהם רכיבים של Google Cloudשחלים עליהם חיובים.

  • מידע על העלות של שימוש ב-Spanner מופיע במאמר בנושא תמחור Spanner.

  • במאמר תמחור של Cloud Run מופיע מידע על עלות השימוש ב-Cloud Run, כולל הפעלות בחינם.

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

  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 שלכם מתקשר עםGoogle Cloud ממשקי API, כמו ספריות לקוח ב-Cloud, כדאי לעיין במדריך להגדרת זהות שירות. מידע נוסף על מתן תפקידים זמין במאמרים הרשאות פריסה וניהול גישה.

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

אתם או האדמין שלכם צריכים להקצות לחשבון השירות של Cloud Build את תפקיד ה-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 לוקחת כמה דקות עד שהיא מופצת.

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

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

  • קורא מסד נתונים של 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

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