סביבת זמן ריצה של Python 3

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

זמן הריצה של Python ב-App Engine בסביבה הרגילה מוצהר בקובץ app.yaml:

runtime: pythonVERSION

VERSION הוא מספר הגרסה של Python MAJOR ו-MINOR. לדוגמה, כדי להשתמש בגרסה העדכנית ביותר של Python, ‏Python 3.15 (גרסת טרום-השקה), מציינים את 315.

בלוח הזמנים לתמיכה בסביבות זמן ריצה מפורטות גרסאות Python נתמכות אחרות וגרסת Ubuntu שתואמת לגרסת Python שלכם.

גרסאות Python 3

גרסת Python העדכנית ביותר שנתמכת היא 3.15 (גרסת טרום-השקה). סביבת זמן הריצה של Python משתמשת בגרסה היציבה האחרונה שצוינה בקובץ app.yaml. ‫App Engine מעדכן באופן אוטומטי לגרסאות תיקון חדשות, אבל לא מעדכן באופן אוטומטי את הגרסה המשנית.

לדוגמה, יכול להיות שהאפליקציה שלכם תופעל ב-Python 3.7.0 ותעודכן באופן אוטומטי ל-Python 3.7.1, אבל היא לא תעודכן באופן אוטומטי לגרסה המשנית הבאה, Python 3.8.0.

אפליקציות Python פועלות ב-App Engine בקונטיינר שמאובטח על ידי gVisor, בהפצה עדכנית של Ubuntu Linux.

יחסי תלות

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

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

הפעלת האפליקציה

סביבת זמן הריצה מפעילה את האפליקציה באמצעות הפקודה שציינתם בשדה entrypoint בקובץ app.yaml. אם הגדרתם נקודת כניסה לשרת אינטרנט של Gunicorn בקובץ app.yaml, אתם צריכים להוסיף גם את gunicorn לקובץ requirements.txt.

נקודת הכניסה צריכה להפעיל שרת אינטרנט שמאזין ליציאה שצוינה במשתנה הסביבה PORT. לדוגמה:

entrypoint: gunicorn -b :$PORT main:app

מסגרת האינטרנט שבה האפליקציה משתמשת אחראית לניתוב הבקשות ל-handlers המתאימים באפליקציה.

אם האפליקציה עומדת בדרישות הבאות, App Engine יפעיל אותה עם שרת האינטרנט gunicorn, אם לא תציינו את השדה entrypoint:

  • תיקיית השורש של האפליקציה מכילה קובץ main.py עם אובייקט תואם-WSGI שנקרא app.

  • האפליקציה שלך לא מכילה קובצי Pipfile או Pipfile.lock.

אם לא תציינו נקודת כניסה לסביבת זמן הריצה של Python 3, ‏ App Engine יגדיר ויפעיל את שרת האינטרנט Gunicorn שמוגדר כברירת מחדל באמצעות מחלקת ה-worker‏ gthread עם 4 שרשורים לכל worker. במכונות F1 ו-B1, מחלקת ה-worker של gthread משתמשת ב-4 workers, ובמכונות F2, B2 ומכונות גדולות יותר, היא משתמשת ב-8 workers. אם מציינים entrypoint בהתאמה אישית בלי להגדיר את --workers (-w), ברירת המחדל של Gunicorn היא וורקר sync אחד.

שיטות מומלצות לנקודות כניסה

  • מוודאים שמודול Python שנדרש כדי להריץ את נקודת הכניסה שצוינה ב-app.yaml נמצא בקובץ requirements.txt. מוסיפים את gunicorn לקובץ requirements.txt רק אם נקודת קצה (endpoint) של gunicorn צוינה במפורש בקובץ app.yaml.

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

  • אתם יכולים להשתמש בשדה entrypoint כדי לשפר את הביצועים של האפליקציה. לדוגמה, אם אתם משתמשים ב-gunicorn כשרת אינטרנט, אתם יכולים להשתמש בדגל --workers בשדה entrypoint כדי להגדיר את מספר ה-workers שמשרתים את האפליקציה.

    מספר ה-workers שאתם מציינים צריך להתאים לסוג המכונה של אפליקציית App Engine:

    סוג המכונה עובדים
    F1 4
    F2 8
    F4 8
    F4_1G 8
    B1 4
    B2 8
    B4 8
    B4_1G 8
    B8 8

    ההנחיות האלה הן נקודת התחלה לבחירת מספר ה-workers. יכול להיות שתצטרכו להשתמש במספר שונה של תהליכי worker, בהתאם למאפייני הביצועים של האפליקציה. בדוגמה הבאה מוצג פריסת App Engine שמשתמשת בשני קבוצות עובדים של gunicorn להצגת אפליקציות:

    entrypoint: gunicorn -b :$PORT -w 2 main:app
    
  • מומלץ להגדיר את שרת האינטרנט כך שיאזין לבקשות HTTP ויגיב להן ביציאה שצוינה על ידי משתנה הסביבה $PORT. אם משתמשים ביציאת ברירת המחדל 8080, App Engine לא יכול להשתמש בשכבת ה-NGINX שלו כדי לדחוס תגובות HTTP. שימו לב שאם אתם משתמשים ביציאה 8080, אזהרות לגבי יציאה 8080 ו-NGINX יופיעו בקובצי היומן של האפליקציה.

מערכי Framework אחרים לאינטרנט

בנוסף ל-Django ול-Flask, אתם יכולים להשתמש ב-App Engine עם סביבות פיתוח אחרות לאינטרנט, כמו uwsgi ו-Tornado. בדוגמה הבאה מוסבר איך משתמשים ב-uwsgi עם App Engine:

runtime: python313
entrypoint: uwsgi --http-socket :$PORT --wsgi-file main.py --callable app --master --processes 1 --threads 2
uwsgi==2.0.22
Flask==3.1.3; python_version >= '3.9'

משתני סביבה

משתני הסביבה הבאים מוגדרים על ידי סביבת זמן הריצה:

משתנה הסביבה תיאור
GAE_APPLICATION המזהה של אפליקציית App Engine. למזהה הזה יש קידומת "region code~‎", למשל "e~‎" לאפליקציות שנפרסו באירופה.
GAE_DEPLOYMENT_ID המזהה של הפריסה הנוכחית.
GAE_ENV סביבת App Engine. הגדרת הערך standard.
GAE_INSTANCE המזהה של המכונה שבה השירות פועל כרגע.
GAE_MEMORY_MB נפח הזיכרון שזמין לתהליך של האפליקציה, ב-MB.
GAE_RUNTIME סביבת זמן הריצה שצוינה בקובץ app.yaml.
GAE_SERVICE שם השירות שצוין בקובץ app.yaml. אם לא מציינים שם שירות, הוא מוגדר כ-default.
GAE_VERSION תווית הגרסה הנוכחית של השירות.
GOOGLE_CLOUD_PROJECT מזהה הפרויקט ב- Google Cloud שמשויך לאפליקציה.
PORT היציאה שמקבלת בקשות HTTP.
‫NODE_ENV (זמין רק בסביבת זמן הריצה של Node.js) הגדירו את הערך production כשהשירות שלכם נפרס.

אתם יכולים להגדיר משתני סביבה נוספים בקובץ app.yaml, אבל אי אפשר לשנות את הערכים שלמעלה, חוץ מאשר את NODE_ENV.

שרתי פרוקסי להעברה ו-HTTPS

‫App Engine מסיים את חיבורי ה-HTTPS במאזן העומסים ומעביר את הבקשות לאפליקציה. באפליקציות מסוימות צריך לזהות את כתובת ה-IP ואת הפרוטוקול של הבקשה המקורית. כתובת ה-IP של המשתמש זמינה בכותרת הרגילה X-Forwarded-For. באפליקציות שדורשות את המידע הזה, צריך להגדיר את מסגרת האינטרנט כך שתיתן אמון בשרת ה-proxy.

מערכת קבצים

סביבת זמן הריצה כוללת מערכת קבצים מלאה. מערכת הקבצים היא לקריאה בלבד, חוץ מהמיקום /tmp, שהוא דיסק וירטואלי שמאחסן נתונים ב-RAM של המכונה של App Engine.

שרת מטא-נתונים

כל מכונה של האפליקציה יכולה להשתמש בשרת המטא-נתונים של App Engine כדי לשלוח שאילתות לגבי מידע על המכונה ועל הפרויקט.

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

  • http://metadata
  • http://metadata.google.internal

בקשות שנשלחות לשרת המטא-נתונים חייבות לכלול את כותרת הבקשה Metadata-Flavor: Google. הכותרת הזו מציינת שהבקשה נשלחה במטרה לאחזר ערכים של מטא-נתונים.

בטבלה הבאה מפורטות נקודות הקצה שבהן אפשר לשלוח בקשות HTTP למטא-נתונים ספציפיים:

נקודת קצה של מטא-נתונים תיאור
/computeMetadata/v1/project/numeric-project-id מספר הפרויקט שהוקצה לפרויקט שלכם.
/computeMetadata/v1/project/project-id מזהה הפרויקט שהוקצה לפרויקט שלכם.
/computeMetadata/v1/instance/region האזור שבו המכונה פועלת.
/computeMetadata/v1/instance/service-accounts/default/aliases
/computeMetadata/v1/instance/service-accounts/default/email כתובת האימייל של חשבון השירות שמוגדר כברירת מחדל ומוקצה לפרויקט.
/computeMetadata/v1/instance/service-accounts/default/ מציגה את כל חשבונות השירות שמוגדרים כברירת מחדל בפרויקט.
/computeMetadata/v1/instance/service-accounts/default/scopes רשימה של כל ההיקפים הנתמכים בחשבונות השירות שמוגדרים כברירת מחדל.
/computeMetadata/v1/instance/service-accounts/default/token מחזירה את אסימון האימות שבו אפשר להשתמש כדי לאמת את האפליקציה שלכם מול ממשקי Google Cloud API אחרים.

לדוגמה, כדי לאחזר את מזהה הפרויקט, שולחים בקשה אל http://metadata.google.internal/computeMetadata/v1/project/project-id.