ציון יחסי תלות ב-Python (דור ראשון)

יש שתי דרכים לציין יחסי תלות לפונקציות Cloud Run שנכתבו ב-Python: באמצעות קובץ requirements.txt של כלי לניהול חבילות pip, או באמצעות אריזת יחסי תלות מקומיים לצד הפונקציה.

אין תמיכה בציון יחסי תלות באמצעות התקן Pipfile/Pipfile.lock. הפרויקט לא אמור לכלול את הקבצים האלה.

ציון יחסי תלות באמצעות pip

יחסי תלות ב-Python מנוהלים באמצעות pip ומפורטים בקובץ מטא-נתונים שנקרא requirements.txt. הקובץ הזה צריך להיות באותה ספרייה שבה נמצא קובץ main.py שמכיל את קוד הפונקציה.

כשפורסים או פורסים מחדש את הפונקציה, פונקציות Cloud Run משתמשות ב-pip כדי להוריד ולהתקין את הגרסה האחרונה של התלות שהוגדרה בקובץ requirements.txt. הקובץ requirements.txt מכיל שורה אחת לכל חבילה. כל שורה מכילה את שם החבילה, ואת הגרסה המבוקשת (אופציונלי). פרטים נוספים זמינים במאמר requirements.txt.

כדי למנוע השפעה של שינויים בגרסאות של יחסי תלות על הבנייה, כדאי להצמיד את חבילות יחסי התלות לגרסה ספציפית.

קובץ requirements.txt לדוגמה:

functions-framework
requests==2.20.0
numpy

Functions Framework הוא תלות חובה לכל הפונקציות. למרות שפונקציות Cloud Run מתקינות אותו בשמכם כשהפונקציה נוצרת, מומלץ לכלול אותו כתלות מפורשת כדי שהקוד יהיה ברור.

אם הפונקציה שלכם מסתמכת על יחסי תלות פרטיים, מומלץ לשכפל את functions-framework למאגר הפרטי שלכם. כדי להימנע מהתקנת החבילה מהאינטרנט הציבורי, צריך לכלול את functions-framework המשוכפל כהסתמכות בפונקציה.

אריזת יחסי תלות מקומיים

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

לדוגמה, אפשר להשתמש במבנה של ספרייה כמו זה שמופיע בהמשך:

myfunction/
├── main.py
└── localpackage/
    ├── __init__.py
    └── script.py

אחר כך תוכלו לייבא את הקוד כרגיל מ-localpackage באמצעות ההצהרה הבאה import.

# Code in main.py
from localpackage import script

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

יחסי תלות של יצירת עותק מקוד של צד שלישי (vendoring)

יחסי תלות של יצירת עותק מקוד של צד שלישי (vendoring) הם יחסי תלות שקוד המקור שלהם נכלל ישירות בחבילת קוד המקור שלכם ונבנה מחדש לצד הקוד שלכם. משתמשים במשתנה הסביבה של ה-build‏ GOOGLE_VENDOR_PIP_DEPENDENCIES כדי ליצור תלות ב-pip של ספקים ולהימנע מהתקנתם במהלך הפריסה.

יצירת יחסי תלות של יצירת עותק מקוד של צד שלישי (vendoring)

  1. מוודאים ש-python3 מותקן במערכת הפיתוח.

  2. מצהירים על יחסי התלות של האפליקציה בקובץ requirements.txt בתיקיית השורש של עץ הפיתוח.

  3. מצהירים על Functions Framework כדרישה על ידי הוספת functions-framework בשורה נפרדת בקובץ requirements.txt.

  4. מורידים את התלות של הפונקציה לספרייה המקומית. השלבים לביצוע הפעולה הזו משתנים בהתאם לסוג קובץ התלות: קובץ Python wheel ‏ (*.whl) או קובץ tar ‏ (*.tar.gz).

    1. אם התלות היא קובץ Python wheel ‏ (*.whl), מורידים אותו לספריית הבסיס של עץ הפיתוח באמצעות פקודת ה-pip הבאה:

      python3 -m pip download -r requirements.txt --only-binary=:all: \
         -d DIRECTORY \
         --python-version PYTHON_RUNTIME_VERSION \
         --platform manylinux2014_x86_64 \
         --implementation cp
      

      מחליפים את:

      • DIRECTORY: השם של הספרייה המקומית שאליה רוצים להוריד
      • PYTHON_RUNTIME_VERSION: גרסת Python שבה ייעשה שימוש לבדיקות תאימות. לדוגמה, 311 ל-Python 3.11. ‫
        הגרסה הזו חייבת להתאים לאחת מסביבות זמן הריצה הנתמכות של Python

      מבנה הספריות שמתקבל אמור להיראות כך:

      myfunction/
      ├── main.py
      └── requirements.txt
      └── DIRECTORY
         ├── dependency1.whl
         └── dependency2.whl
      
    2. אם התלות היא קובץ tar ‏ (*.tar.gz):

      1. אם יחסי התלות כתובים ב-Python, משתמשים ב-pip כדי להוריד אותם:

        python3 -m pip download -r requirements.txt \
           -d DIRECTORY
        
      2. אם התלות מורכבת מקוד שנכתב ב-C או ב-C++, צריך להוריד אותו ולקמפל אותו בנפרד.

  5. פורסים את הפונקציה ואת התלויות שלה:

    gcloud functions deploy FUNCTION_NAME \
      --runtime PYTHON_RUNTIME_NAME \
      --set-build-env-vars GOOGLE_VENDOR_PIP_DEPENDENCIES=DIRECTORY
    

    מחליפים את:

    • FUNCTION_NAME: השם של הפונקציה ב-Cloud Run Functions שפורסים
    • PYTHON_RUNTIME_NAME: השם של אחת מסביבות הריצה הנתמכות של Python להרצת הפונקציה שפרסתם – לדוגמה, python311. גרסת זמן הריצה של Python חייבת להיות זהה לגרסה שבה השתמשתם בסביבת הפיתוח המקומית.
    • DIRECTORY:השם של הספרייה שמכילה את התלות של הספק

מידע נוסף על השימוש ב-Buildpack זמין במאמר פיתוח פונקציה באמצעות Buildpack.

שימוש בתלות פרטית

יחסי תלות פרטיים מ-Artifact Registry

מאגר Python ב-Artifact Registry יכול לארח יחסי תלות פרטיים של פונקציית Python. כשפורסים פונקציות ב-Cloud Run, תהליך ה-build ייצור באופן אוטומטי פרטי כניסה ל-Artifact Registry עבור חשבון השירות ב-Cloud Build. צריך לכלול רק את כתובת ה-URL של Artifact Registry שב-requirements.txt בלי ליצור פרטי כניסה נוספים. לדוגמה:

--index-url REPOSITORY_URL
sampleapp
Flask==0.10.1
google-cloud-storage

אם אתם צריכים כמה מאגרים בשביל ה-build, אתם יכולים להשתמש במאגר וירטואלי ב-Artifact Registry כדי לשלוט בבטחה בסדר שבו pip מחפש במאגרים.

יחסי תלות פרטיים ממאגרים אחרים

ההתקנה של יחסי התלות מתבצעת בסביבת Cloud Build שלא מספקת גישה למפתחות SSH. חבילות שמתארחות במאגרים שנדרש בהם אימות מבוסס-SSH צריכות להיות מסוג vendored ולהיות מועלות יחד עם הקוד של הפרויקט, כמו שמתואר בקטע הקודם.

אפשר להשתמש בפקודה pip install עם הדגל -t DIRECTORY כדי להעתיק תלות פרטית לספרייה מקומית לפני פריסת האפליקציה, באופן הבא:

  1. מעתיקים את התלות לספרייה מקומית:

    pip install -t DIRECTORY DEPENDENCY
  2. מוסיפים קובץ ריק בשם __init__.py לספרייה DIRECTORY כדי להפוך אותה למודול.

  3. כדי להשתמש בתלות, מייבאים אותה מהמודול הזה:

    import DIRECTORY.DEPENDENCY

חבילות שהותקנו מראש

חבילות Python הבאות מותקנות באופן אוטומטי לצד הפונקציה במהלך הפריסה. אם אתם משתמשים באחת מהחבילות האלה בקוד הפונקציה, מומלץ לכלול את הגרסאות הבאות בקובץ requirements.txt:

Python 3.7

aiohttp==3.8.1
aiosignal==1.2.0
async-timeout==4.0.2
attrs==21.4.0
cachetools==4.2.4
certifi==2021.10.8
chardet==4.0.0
charset-normalizer==2.0.10
click==8.0.3
Flask==2.0.2
frozenlist==1.2.0
google-api-core==2.3.2
google-api-python-client==2.34.0
google-auth==2.3.3
google-auth-httplib2==0.1.0
google-cloud-core==2.2.1
google-cloud-trace==1.5.1
googleapis-common-protos==1.54.0
grpcio==1.43.0
grpcio-status==1.43.0
httplib2==0.20.2
idna==3.3
itsdangerous==2.0.1
Jinja2==3.1.6
MarkupSafe==2.0.1
multidict==5.2.0
opencensus==0.8.0
opencensus-context==0.1.2
packaging==21.3
proto-plus==1.19.8
protobuf==3.19.1
pyasn1==0.4.8
pyasn1-modules==0.2.8
pyparsing==3.0.6
pytz==2021.3
PyYAML==6.0
requests==2.27.1
rsa==4.8
setuptools==60.3.1
six==1.16.0
uritemplate==4.1.1
urllib3==1.26.7
Werkzeug==2.0.2
wrapt==1.13.3
yarl==1.7.2

‫Python 3.8 ואילך

anyio==4.5.2
blinker==1.8.2
click==8.1.8
cloudevents==1.11.0
deprecation==2.1.0
exceptiongroup==1.3.0
Flask==3.0.3
functions-framework==3.9.1
gunicorn==23.0.0
h11==0.16.0
idna==3.10
importlib_metadata==8.5.0
itsdangerous==2.2.0
Jinja2==3.1.6
MarkupSafe==2.1.5
packaging==25.0
sniffio==1.3.1
# Install starlette 0.44.0 for Python 3.8
starlette==0.44.0; python_version == '3.8'
# Install starlette 0.49.1 for Python versions greater than 3.8
starlette==0.49.1; python_version > '3.8'
typing_extensions==4.13.2
uvicorn==0.33.0
uvicorn-worker==0.2.0
watchdog==4.0.2
Werkzeug==3.0.6
zipp==3.20.2

* `pip` (latest version)
* `setuptools` (latest version)
* `wheel` (determined by product requirements)

בנוסף, סביבת זמן הריצה של Python כוללת מספר חבילות מערכת בסביבת ההפעלה. אם הפונקציה שלכם משתמשת בתלות שדורשת חבילת מערכת שלא מופיעה ברשימה, אתם יכולים לבקש חבילה.