הפעלת פונקציות באמצעות Functions Framework

פונקציות Cloud Run משתמשות בספריות Functions Framework בקוד פתוח כדי לעטוף את הפונקציות שפרסתם באפליקציית HTTP מתמשכת.

ה-Functions Framework יכול לפעול גם בכל פלטפורמה אחרת שתומכת בשפה עצמה, כולל במחשב המקומי, בשרתים מקומיים, ב-Compute Engine וב-Cloud Run.

התקנת יחסי תלות

בספרייה של הפונקציה, מתקינים את ספריית Functions Framework בשפה הרצויה:

מידע נוסף זמין בספריית Java Functions Framework.

Node.js

npm install --save-dev @google-cloud/functions-framework

Python

pip install functions-framework

Go

go install github.com/GoogleCloudPlatform/functions-framework-go/funcframework

Java

Maven

אם משתמשים ב-Maven, צריך להוסיף את הקוד הבא לקובץ pom.xml:

<dependency>
  <groupId>com.google.cloud.functions</groupId>
  <artifactId>functions-framework-api</artifactId>
  <version>1.1.0</version>
  <scope>provided</scope>
</dependency>

Gradle

אם משתמשים ב-Gradle, מוסיפים את הקוד הבא לקובץ build.gradle:

dependencies {
  // Every function needs this dependency to get the Functions Framework API.
  compileOnly 'com.google.cloud.functions:functions-framework-api:1.1.0'

  // To run function locally using Functions Framework's local invoker
  invoker 'com.google.cloud.functions.invoker:java-function-invoker:1.3.1'
}

C#‎

הפקודות שבהמשך משתמשות בתבניות של ‎ .NET כדי ליצור בסיס קוד חדש של פונקציית Cloud Run ב-‎ .NET עם ספריית ‎.NET Functions Framework כתלות:

# HTTP functions
dotnet new gcf-http

# CloudEvent functions
dotnet new gcf-event

Ruby

ב-Ruby, חובה להוסיף את Functions Framework לתלות של הפונקציה כדי לפרוס אותה לפונקציות Cloud Run:

bundle add functions_framework

PHP

composer require google/cloud-functions-framework

הגדרת Functions Framework

לפני שמריצים פונקציה באמצעות Functions Framework, צריך קודם לציין את הסוג והשם של הפונקציה שרוצים להריץ. אפשר לציין את המאפיינים האלה כדגל בממשק שורת הפקודה (CLI) או כמשתני סביבה.

סוגי הפונקציות הנתמכות

‫Functions Framework תומך בכל שלושת סוגי הפונקציות שנתמכות על ידי פונקציות Cloud Run דור ראשון. כל זמני הריצה של השפות תומכים ב-http ובאחת מהאפשרויות event או cloudevent.

סוג הפונקציה סוג החתימה תיאור זמני ריצה נתמכים
פונקציות שמופעלות על ידי HTTP http פונקציות שמקבלות בקשות HTTP ומגיבות להן. כל סביבות זמן הריצה
פונקציות ברקע event פורמט אירועים ספציפי לפונקציות Cloud Run Node.js, Python, Go, Java
פונקציות CloudEvent cloudevent פורמט אירועים לפי התקן בתחום .NET, Ruby, PHP

ציון הפונקציה שרוצים להריץ

לפני שמריצים פונקציה באמצעות Functions Framework, צריך לציין איזו פונקציה בקוד תופעל. ברוב השפות, אפשר לעשות את זה על ידי ציון שם השיטה של פונקציית היעד, כמו שמוצג בטבלאות שלמטה. (חריגים לכלל הזה, כמו Java ו-.NET, מוצגים גם בהמשך).

הוראות לפי שפה

בטבלה שלמטה מפורטות אפשרויות ההגדרה שנתמכות בכל שפה.

Node.js

ארגומנט של CLI משתנה סביבה תיאור
--port PORT היציאה להאזנה לבקשות. (ברירת מחדל: 8080)
--target FUNCTION_TARGET השם של הפונקציה export שתופעל. (ברירת מחדל: function)
--signature-type FUNCTION_SIGNATURE_TYPE סוג החתימה שמשמש את הפונקציה. יכול להיות אחד מהערכים הבאים: http (ברירת המחדל), event או cloudevent.

Python

ארגומנט של CLI משתנה סביבה תיאור
--port PORT היציאה להאזנה לבקשות. (ברירת מחדל: 8080)
--target FUNCTION_TARGET השם של הפונקציה export שתופעל. (ברירת מחדל: function)
--signature-type FUNCTION_SIGNATURE_TYPE סוג החתימה שמשמש את הפונקציה. יכול להיות אחד מהערכים הבאים: http (ברירת המחדל), event או cloudevent.

Go

משתנה סביבה תיאור
PORT היציאה להאזנה לבקשות. (ברירת מחדל: 8080)

Java

שם הארגומנט משתנה סביבה תיאור
run.port PORT היציאה להאזנה לבקשות. (ברירת מחדל: 8080)
run.functionTarget FUNCTION_TARGET השם של הפונקציה export שתופעל. (ברירת מחדל: function)

C#‎

ארגומנט של CLI משתנה סביבה תיאור
--port PORT היציאה להאזנה לבקשות. (ברירת מחדל: 8080)
--target (או הארגומנט היחיד) FUNCTION_TARGET שם המחלקה של הפונקציה שתופעל. (ברירת מחדל: function)

Ruby

ארגומנט של CLI משתנה סביבה תיאור
--port PORT היציאה להאזנה לבקשות. (ברירת מחדל: 8080)
--target FUNCTION_TARGET השם של הפונקציה export שתופעל. (ברירת מחדל: function)

PHP

משתנה סביבה תיאור
FUNCTION_TARGET השם של הפונקציה שתופעל. (ברירת מחדל: function)
FUNCTION_SIGNATURE_TYPE סוג החתימה שמשמש את הפונקציה. יכול להיות אחד מהערכים הבאים: http (ברירת המחדל), event או cloudevent.

כדי להגדיר ולהפעיל את Functions Framework, פועלים לפי ההוראות הבאות:

Node.js

ה-Node.js Functions Framework מאפשר לכם לציין את שם הפונקציה ואת סוג החתימה שלה כארגומנטים בשורת הפקודה או כמשתני סביבה.

אפשר גם לציין את הערכים האלה בקובץ buildfile‏ package.json על ידי הוספת סקריפט start עם ארגומנטים נדרשים של CLI, כמו בדוגמה שלמטה.

"scripts": {
  "start": "npx functions-framework --target=YOUR_FUNCTION_NAME [--signature-type=YOUR_SIGNATURE_TYPE]"
}

אפשר לעשות את אותו הדבר באמצעות משתני סביבה:

"scripts": {
  "start": "FUNCTION_TARGET=YOUR_FUNCTION_NAME FUNCTION_SIGNATURE_TYPE=YOUR_SIGNATURE_TYPE npx functions-framework"
}

מחליפים את YOUR_FUNCTION_NAME בשם השיטה של הפונקציה, ואת YOUR_SIGNATURE_TYPE (אם רלוונטי) בסוג החתימה של הפונקציה, כמו שמופיע בטבלה שלמעלה.

Python

ה-Python Functions Framework מאפשר לציין את שם הפונקציה ואת סוג החתימה שלה כארגומנטים של שורת הפקודה או כמשתני סביבה. כשמריצים את המסגרת, צריך לציין את הארגומנטים בשורת הפקודה.

Go

ב-Go Functions Framework נעשה שימוש ב-funcframework.RegisterHTTPFunctionContext כדי לציין את יעד הפונקציה ואת סוג החתימה.

Java

‫Java Functions Framework מקבל נתוני הגדרה משלושה מקורות שונים, לפי סדר העדיפות הבא (מהספציפי ביותר לפחות ספציפי):

  • ארגומנטים בשורת הפקודה
  • קבצים של Build
  • משתני סביבה

ארגומנטים בשורת הפקודה

Maven

כדי לציין את הפונקציה שרוצים להריץ, מוסיפים את הדגל הבא של ממשק שורת הפקודה (CLI) לפקודות mvn:

-Drun.functionTarget=YOUR_FUNCTION_NAME

אפשר גם לציין את יעד היציאה על ידי הוספת הדגל הבא של ה-CLI באופן דומה:

-Drun.port=12345

Gradle

הדגלים ב-CLI של Gradle כמעט זהים לאלה של Maven. השינוי היחיד ש-Gradle מבצע הוא החלפת התו -D שמופיע בתחילת כל דגל בתו -P, כמו שמוצג בדוגמה שלמטה:

# Maven version
-Drun.functionTarget=...

# Gradle version
-Prun.functionTarget=...

קבצים של Build

אפשר גם לציין את הפונקציה שרוצים להפעיל בקובץ הבנייה של הפרויקט. ל-Maven ול-Gradle יש דגלים דומים ב-CLI, אבל הסעיפים בקובץ ה-build שונים מאוד.

Maven

שם קובץ ה-build של Maven הוא pom.xml. מוסיפים את הסעיף הבא לקובץ כדי לציין פונקציית יעד:

<plugin>
  <groupId>com.google.cloud.functions</groupId>
  <artifactId>function-maven-plugin</artifactId>
  <version>0.11.0</version>
  <configuration>
    <functionTarget>functions.HelloWorld</functionTarget>
  </configuration>
</plugin>

מחליפים את <functionTarget> בשם המחלקה של הפונקציה. (לדוגמה, לפונקציה בחבילה functions עם שם המחלקה HelloCloudFunctions יהיה שם המחלקה functions.HelloCloudFunctions. הנתיב הזה הוא יחסי לקובץ ה-build של האב – pom.xml או build.gradle).

Gradle

השם של קובצי ה-build של Gradle הוא build.gradle. מוסיפים את הסעיף הבא לקובץ הזה כדי לציין פונקציית יעד:

// Register a "runFunction" task to run the function locally
tasks.register("runFunction", JavaExec) {
  main = 'com.google.cloud.functions.invoker.runner.Invoker'
  classpath(configurations.invoker)
  inputs.files(configurations.runtimeClasspath, sourceSets.main.output)
  args(
    '--target', project.findProperty('run.functionTarget') ?: '',
    '--port', project.findProperty('run.port') ?: 8080
  )
  doFirst {
    args('--classpath', files(configurations.runtimeClasspath, sourceSets.main.output).asPath)
  }
}

C#‎

אם יוצרים את הפרויקט באמצעות dotnet new ואחת מהתבניות שצוינו למעלה, ה-Functions Framework של ‎ .NET יזהה את הפונקציה באופן אוטומטי.

אם הפרויקט מכיל כמה פונקציות, בקטע הפעלת המסגרת מוסבר איך להפעיל פונקציה ספציפית.

Ruby

בעזרת Ruby Functions Framework אפשר לציין את שם הפונקציה ואת סוג החתימה שלה כארגומנטים בשורת הפקודה או כמשתני סביבה. כשמריצים את המסגרת, צריך לציין את הארגומנטים בשורת הפקודה.

PHP

ב-PHP Functions Framework אפשר לציין משתני סביבה כארגומנטים של שורת הפקודה.

אפשר גם לציין את הערכים האלה בקובץ buildfile‏ composer.json על ידי הוספת סקריפט start כמו בדוגמה שלמטה.

"scripts": {
   "start": [
       "Composer\\Config::disableProcessTimeout",
       "FUNCTION_TARGET=YOUR_FUNCTION_NAME php -S localhost:${PORT:-8080} vendor/bin/router.php"
    ]
}

מחליפים את YOUR_FUNCTION_NAME בשם הפונקציה ואת YOUR_SIGNATURE_TYPE (אם רלוונטי) בסוג החתימה של הפונקציה, כפי שמופיע בטבלה שלמעלה.

הפעלת Functions Framework

כדי להריץ את הפונקציה באמצעות Functions Framework, משתמשים בפקודה הבאה. כברירת מחדל, הפונקציה תהיה נגישה בכתובת localhost:8080, אלא אם תציינו במפורש ערך של PORT.

Node.js

npm start

Python

שימוש בארגומנטים בשורת הפקודה:

functions-framework --target=YOUR_FUNCTION_NAME

באמצעות משתני סביבה:

FUNCTION_TARGET=YOUR_FUNCTION_NAME functions-framework

מחליפים את YOUR_FUNCTION_NAME בשם השיטה של הפונקציה.

Go

cd cmd
go build
./cmd

באמצעות משתני סביבה:

cd cmd
go build
PORT=8080 ./cmd

Java

Maven

כדי להריץ פונקציה שצוינה ב-pom.xml, משתמשים בפקודה הבאה:

mvn function:run

כדי להריץ פונקציה שצוינה בארגומנט של שורת הפקודה, משתמשים בפקודה הבאה:

mvn function:run -Drun.functionTarget=YOUR_FUNCTION_NAME

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

FUNCTION_TARGET=YOUR_FUNCTION_NAME mvn function:run

מחליפים את YOUR_FUNCTION_NAME בשם המחלקה של הפונקציה.

Gradle

כדי להריץ פונקציה שצוינה ב-build.gradle, משתמשים בפקודה הבאה:

./gradlew runFunction

כדי להריץ פונקציה שצוינה בארגומנט של שורת הפקודה, משתמשים בפקודה הבאה:

./gradlew runFunction -Prun.functionTarget=YOUR_FUNCTION_NAME

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

FUNCTION_TARGET=YOUR_FUNCTION_NAME ./gradlew runFunction

מחליפים את YOUR_FUNCTION_NAME בשם המחלקה של הפונקציה.

C#‎

כדי להריץ את הפונקציה כשקיימת בדיוק פונקציה אחת בפרויקט הנוכחי של ‎ .NET, משתמשים בפקודה הבאה. (זהו מבנה ברירת המחדל של פרויקטים שנוצרו מתבנית).

dotnet run

אם פרויקט ‎ .NET מכיל כמה פונקציות, משתמשים בפקודה הבאה כדי להריץ פונקציה ספציפית. מחליפים את YOUR_FUNCTION_CLASSNAME בשם המחלקה של הפונקציה, כולל מרחב השמות.

dotnet run YOUR_FUNCTION_CLASSNAME

אם רוצים להריץ כמה פונקציות בו-זמנית, צריך להריץ כמה מופעים של Functions Framework. כדי למנוע התנגשויות בין מופעים של מסגרות פעילות, כל מופע צריך להשתמש בערך PORT שונה. הפקודה הבאה מראה איך להפעיל פונקציה עם ערך PORT של 8080.

שימוש בארגומנטים בשורת הפקודה:

dotnet run --target YOUR_FUNCTION_CLASSNAME --port 8080

באמצעות משתני סביבה:

FUNCTION_TARGET=YOUR_FUNCTION_CLASSNAME PORT=8080 dotnet run

Ruby

שימוש בארגומנטים בשורת הפקודה:

bundle exec functions-framework-ruby --target YOUR_FUNCTION_NAME

באמצעות משתני סביבה:

FUNCTION_TARGET=YOUR_FUNCTION_NAME bundle exec functions-framework-ruby

מחליפים את YOUR_FUNCTION_NAME בשם השיטה של הפונקציה.

PHP

export FUNCTION_TARGET=YOUR_FUNCTION_NAME
php -S localhost:8080 vendor/bin/router.php

מחליפים את YOUR_FUNCTION_NAME בשם הפונקציה.

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

בקישור הבא מוסבר איך ליצור אינטראקציה עם הפונקציה שפועלת באופן מקומי: קריאה לפונקציות מקומיות.

הסרת המשאבים

כשמסיימים להריץ את הפונקציה, מפסיקים את הפעלה של מופע המסגרת על ידי הקשה על Control+C.