• בלוג
  • טיפ דיבאג - שימו לב לגירסאות

טיפ דיבאג - שימו לב לגירסאות

06/03/2023

סאם הוא כלי פיתוח של AWS שעוזר לכתוב קוד מקומי, לבדוק מקומית חלק מהדברים, ליצור את כל התשתית בתור קוד (קבצי yaml) ולהעלות ל AWS את כל העבודה שלכם. בגדול באמת אחלה כלי אבל יש לו די הרבה באגים וכמו כל העולם של AWS צריך לדעת לעבוד איתו.

הסיפור היום הוא על אחד הבאגים של סאם שכמעט עלה לי בשעתיים מבוזבזות, והזכיר לי את אחת הבעיות בעבודה עם requirements.txt.

1. מה יכול להשתבש

קובץ requirements.txt מאפשר לנו להגדיר את הספריות שתוכנית הפייתון שלנו צריכה, ובעזרת פקודת:

$ pip install -r requirementst.txt

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

מה שנוטים לשכוח הוא שפייתון לא בודק בעליה של התוכנית שהגירסאות של הספריות שיש לו מתאימות למה שביקשתם ב requirements.txt.

תיאורטית אם מנסים לעשות import לחבילה שצריכה התקנה והחבילה הותקנה, אז היא כנראה הותקנה מהגירסה שביקשתם. אם היא לא הותקנה בכלל אז ה import ייכשל. המצב השלישי הוא הבעייתי - מה אם מי שמריץ את הסקריפט הוא Docker Image שכבר מותקנות בו חבילות מסוימות בגירסאות מסוימות, ובמקרה החבילה שרציתם כבר מותקנת בגירסה ישנה יותר?

2. הבאג של סאם

הפקודה:

sam init --runtime python3.9 --name location-demo

יוצרת פרויקט Sam מקומי חדש עבור פייתון. תבנית ה Quickstart שלהם יוצרת קובץ בשם requirements.txt והפקודה:

sam local start-api

מפעילה שרת מקומי שיפעיל את תוכנית הפייתון ויחזיר תשובה. אבל אף אחד מהצעדים האלה לא מתקין את החבילות ב requirements.txt. בשביל להתקין את החבילות יש להפעיל:

sam build

האתגר הוא שחבילות מסוימות כבר מותקנות בתוך ה Image שסאם מריץ, ולכן גם אם לא תפעילו build עדיין תקבלו לדוגמה את חבילת boto3 שאיתה אפשר לפנות ל AWS, אבל בגירסה ישנה שלפעמים מחזירה מידע חלקי (בלי הודעות שגיאה, מי צריך אותן).

האתגר השני הוא שעד שלא הפעלתם build אתם עובדים עם האימג' הדיפולטי ואז סאם מזהה שינויים בקוד ומיד אתם מקבלים על השרת את הגירסה העדכנית ביותר (Hot Reloading). מרגע שהפעלתם build פעם אחת זיהוי שינויים אוטומטי יפסיק לעבוד ותצטרכו להפעיל build אחרי כל שינוי בקוד.

3. איך בכל זאת רואים את זה

האמת שהחשד הראשון שלי כשראיתי את המידע החלקי בלי הודעות שגיאה היה בעיית גירסאות, וכדי לאמת אותו הוספתי לקוד הפייתון שלי את הבלוק:

import boto3

if boto3.__version__ != "1.26.82":
    raise Exception(f"Incorrect Boto Version {boto3.__version__}")

וכצפוי התוכנית התרסקה עם הודעת שגיאה מפורשת.