מה זה Lambda? עד לא מזמן, כשראיתי את הלוגו הזה (λ), הוא תמיד היה מתקשר רק עם דבר אחד – Half Life! אחד המשחקים האהובים עלי מלפני קצת (הרבה) יותר מעשור (וכמובן Counter Strike, המבוסס על אותו המנוע).
ואז באו אמזון ולקחו בעלות על אחד מהזיכרונות הטובים שלי והפכו אותו לעוד שרות של AWS, אבל לא סתם עוד שרות, משהו שבאמת מדליק אצלי כמה וכמה נורות של – הנה משהו ששווה לשים אליו לב. זה אמנם לא מגניב כמו Half Life אבל יש פה פוטנציאל למשהו גדול.
מה זה Lambda?
זהו שרות של AWS, המאפשר להריץ קוד על השרתים של אמזון בלי הצורך להגדיר שרת (תקראו את זה שוב). הקוד יושב באמזון ומורץ כתוצאה מטריגרים היכולים להגיע מכל מני מקורות. הטריגים כוללים פעולות שמתבצעות ב – S3, עדכונים ב – DynamoDB, מידע שמגיע מ – Kinesis או בקשות ל – AWS API Gateway. לדוגמא, אם תרצו ליצר Thumbnails מתמונות שאתה מעלים ל – S3, ניתן ליצור טריגר שעל כל תמונה חדשה שנשמרת ב – Bucket מסויים, יורץ קוד Lambda ששומר גרסה מוקטנת של התמונה שהעלתם. הקוד שלכם ירוץ עבור כל תמונה חדשה ב – Bucket ויעלם מיד לאחר סיום פעולת העיבוד. מופע חדש שלו יעלה עבור התמונה הבאה (או במקביל) וכך הלאה.
היחוד של השרות הוא שאמזון אחראים על כל התשתית על מנת להריץ את הקוד שלכם ותדע להתמודד (תאורטית) עם כל עומס שתזרקו על המערכת וכל זאת מבלי שהרמתם אפילו EC2 Instance אחד.
התשלום עבור השרות מבוסס על מספר הבקשות להריץ את הקוד שלכם (Requests) וכמה זמן לוקח להריץ אותו, במודל אמיתי של לא הרצת לא שילמת. המחיר למליון הבקשות הראשונות הוא $0 (חינם) ומעל זה $0.20 לכל מיליון נוספים. החישוב של זמן ריצה הוא קצת יותר מסובך ומבוסס על כמה זמן לקח לפונקציה להחזיר תשובה או לסיים את הפעולה שלה, בתלות בכמות הזיכרון שהקצתם לפונקציה. מבלי להיכנס לחישוב המדוייק, הרצה של פונקציה שלוקח לה שניה זמן ריצה, עם זיכרון מוקצה של 512MB ו – 3 מיליון קריאות בחודש, תעלה קרוב ל – $20 לחודש.
אז מי שמחפש מה לעשות עם Lambda כבר היום הנה כמה רעיונות:
מי צריך שרת לאתר אינטרנט?
כבר לפני כמה שנים כתבתי פוסט על איך מארחים אתר אינטנרט בשקל שכולו מבוסס על שמירת אתרים ב – S3. במסגרת הפוסט כתבתי:
מהיום, יכול כל אחד להעלות מבנה תקיות של אתר לשרתי S3 ולגרום, אחרי מספר צעדים פשוטים מאד, לאותו מבנה תקיות להפוך לאתר אינטרנט רגיל לחלוטין. התנאי היחיד הוא שהאתר סטאטי לחלוטין ומכיל קוד HTML, תמונות, JavaScript ו – CSS בלבד. אתרים מבוססי S3 לא יכולים להריץ קוד על השרת דוגמת PHP או Java.
אז זהו – עם Lambda גם זאת כבר אינה מגבלה וכיום ניתן לבנות אתרים שלמים, הכוללים דפי HTML, תוכן וסקריפטים על S3 וקוד הדרוש לאינטראקציות עם המשתמש, כגון הרשמה, שליחת טפסים, עיבוד קבצים, ניהול DB וכו׳ באמצעות Lambda.
לצורך הדוגמא, נניח שרציתם לבנות Landing Page למוצר החדש שלכם, שיכיל מידע שיווקי ואפשרות רישום ללקוחות לתערוכה בה תציגו את המוצר.כל דפי האתר נשמרים על S3, יחד עם קבצי התמונות, JavaScript ו – CSS. כתובת העמוד מקושרת לאותו S3 Bucket וכל פעם שלקוח מבקש להירשם, אתם שולחים את טופס הרישום ל – AWS API Gateway (שגם לו מגיע פוסט נפרד) בכתובת register/, כתוצאה מכך, API Gateway מייצר טריגר להרצת פונקציית Lambda (שבשלב זה חייבת להיות כתובה ב – Node.js, Python, או Java) המקבלת את נתוני המשתמש מה – API Call ושומרת אותם בבסיס הנתונים לשימוש עתידי.
איפה השרת בסיפור הזה? אז זהו שאין! ואם הגעתם עם המוצר שלכם לאופרה ומליון איש עשו Registration מיד לאחר התוכנית, אתם עדיין יכולים לישון בלילה, כי מישהו אחר דואג שהמערכת הקטנה שבנינו תמשיך לעבוד ואף משתמש לא ילך לאיבוד.
אפשר לראות איך זה עובד בתרשים הבא:
בגלל הרקע שלי בפיתוח אינטרנט, אפשרות זו של Lambda לא נותנת לי מנוח כבר כמה שבועות. אין יום בו אני לא חושב על כל אותם אתרים שבנתי במשך השנים, כמה קשה עבדתי על מנת להחזיק אותם באויר וכמה כסף הושקע בחומרה עבור אותם אתרים. חיי היו יכולים להיות פשוטים הרבה יותר, לו רק היתה לי גישה ל – Lambda לפני 15 שנים….
עיבוד קבצים אוטומטי
בין אם מדובר בעיבוד תמונות שנשמרו ב – S3 (כפי שכבר ציינתי) או קבצי Log של שרתים, הנשמרים מכל המכנות שרצות ב – Production שלי (ולא רק ב – AWS), קל מאד ליצור Triggers שיפעילו קוד לעיבוד קבצים אלו באמצעות Lambda.
אם מדובר בעיבוד תמונה, אני יכול לייצר גדלים שונים ורמות איכות שונות של תמונות שמשתמשים מעלים לאתר שלי. אם מדובר על Log Files, אני יכול לסנן שורות שאין לי צורך בהן (למשל, כל שורות ה – Info), לאחד קבצים או לשמור קבצים שונים לרמות דיווח שונות (קובץ יומי נפרד ל – Warnings וקובץ נוסף ל – Critical) או כל אפשרות אחרת שתעלה על הדעת.
אוטומציה
אני שוב חוזר לעולם ה – Web Apps שלי אבל מכיוון קצת אחר. אם יש לכם אתר מסחר אלקטרוני ואתם רוצים לבנות מערכת טיפול בהזמנות Servless לחלוטין, שמירה של הזמנות חדשות ב – DynamoDB תיצר Trigger לפונקציית Lambda ששולחת (באמצעות AWS SNS) הודעת SMS למנהל החנות על הזמנה חדשה ואימייל למחסן עם כל פרטי ההזמנה, על מנת לשלוח אותה ללקוח.
כמובן שמדובר רק על קצה הקרחון ויש אין סוף תרחישים שאפשר לבנות באמצעות Services שונים. פה טמון הפוטנציאל העצום של Lambda. אם אתם בונים היום אפליקציה חדשה, לא משנה באיזה תחום, שווה לקחת צעד אחורה ולבדוק האם ארכיטקטורת Serverless יכולה להתאים לפחות לחלק מהשרותים שאתם עומדים לבנות. יש לכם רעיונות מוצלחים במיוחד (וגם כאלו שלא), שתפו את הקוראים בתגובות!
עכשיו כל מה שחסר לי זה תמיכה של Lambda ב – PHP וזה הופך להיות כלי מושלם מבחינתי.