מילון מושגים:
Terraform - כלי להגדרת תשתית כקוד, שמאפשר ליצור ולנהל משאבי ענן ותשתית בעזרת קובצי תצורה.
EC2 - שירות של AWS להפעלת שרתים וירטואליים בענן לפי דרישה ולפי שימוש.
Bash - מעטפת שורת פקודה נפוצה במערכות Linux, המשמשת להרצת פקודות ולכתיבת סקריפטים.
sudo - פקודה ב-Linux שמריצה פקודה אחרת בהרשאות מוגברות, בדרך כלל של משתמש העל (root).
root - משתמש העל במערכות Linux, בעל הרשאות מלאות לכל פעולה. גם הרמה העליונה בעץ של תיקיות או נתונים.
משתנה סביבה - ערך בעל שם שמוגדר במערכת ההפעלה ומשמש תוכנות להגדרות, כמו נתיבים או מפתחות תצורה.
Git - מערכת מבוזרת לניהול גרסאות של קוד, שעוקבת אחר שינויים ומאפשרת עבודה משותפת בענפים.
ריפוזיטורי - מאגר שמרכז את קוד המקור של פרויקט ואת היסטוריית השינויים שלו, לרוב מנוהל ב-Git.
סקריפט שמתקין npm - פרויקט NodeJS
בשיעור זה מתחברים ב-SSH למכונה הווירטואלית הריקה בענן, לומדים איך מנסחים סקריפט התקנה ב-user data של Terraform, מתקינים גיט ו-Node.js ומריצים התקנה אוטומטית של האתר, ומסיימים בהבנה מה עוד חסר לחיבור לדאטאבייס.
נושאי הסיכום המוצגים בשיעור:
1. התחברות ב-SSH למכונה: ה-EC2 שלנו עובד ריק עם מערכת הפעלה בלבד, ונכנסים אליו ב-SSH עם המפתח הפרטי והמשתמש המתאים, אחרי אימות שהמכונה במצב running וכתובת ה-IP תקינה, והשרת שואל אותנו אם טביעת האצבע של התעודה הדיגיטלית נכונה, שמאשרת שזה השרת הנכון ושאין מישהו שנכנס באמצע התקשורת, ואחרי אישור אנחנו בפנים.
2. מהו user data ב-Terraform: באובייקט של ה-EC2 ב-Terraform יש מאפיין שנקרא user data שמקבל פקודות לביצוע, הוא ירוץ פעם אחת בלבד במעמד ההתקנה, יעשה כל מה שנרצה ויהיה סקריפט חד פעמי, והכוונה לבדוק קודם את הפקודות בשרת ורק אחר כך להעתיק אותן ל-Terraform כדי שבהקמת המכונה הסקריפט ירוץ אוטומטית.
3. איך מכניסים כמה שורות למשתנה אחד: במקום לכתוב הכל בשורה אחת משתמשים בסימן מיוחד של שני חצים פנימה עם זיהוי שבוחרים, נהוג לקרוא לו EOF, סוף קובץ, וכל מה שבין שני הסימנים נחשב כאילו שורה אחת, וצריך גם לציין באיזה shell להריץ את הפקודות, למשל bash, שהוא כמו שורת הפקודה בווינדוס, ובעולם הלינוקס יש יותר מ-shell אחד כמו שגם בווינדוס יש כמה אפשרויות.
4. בדיקת מערכת ההפעלה ומנהל ההתקנות: לפני שמתקינים גיט בודקים איזו מערכת הפעלה יש, כי יש שני מנהלי התקנות שעושים את אותו הדבר, apt ששייך לעולם אובונטו ו-dnf ששייך לפדורה, ובדיקת קובץ מידע המערכת מגלה שהמכונה על פדורה, ולכן הפקודות צריכות להיות תואמות לפדורה ומשתמשים ב-dnf.
5. עדכון מאגר התוכנות: הפקודה של העדכון דורשת הרשאות מנהל על, ומוסיפים לה sudo, ומוסיפים לה מינוס y כדי שלא תשאל שאלות כן לא, ותמיד מתחילים בעדכון המאגר המרכזי של התוכנות, אחרת בהתקנת הגיט אפשר בטעות להתקין גרסה ישנה, ושווה לדעת שהסקריפט של ה-user data ירוץ בפועל תחת ה-root כי הוא רץ פעם אחת במעמד ההתקנה, ואנחנו בשרת תחת המשתמש הרגיל.
6. מעבר ל-root לתרגול: כדי לתרגל פקודות כמו שהן יהיו בסקריפט עוברים ל-root, וכשמבקשים החלפת משתמש רגילה הוא דורש סיסמת root שאין לנו, ולכן מריצים את פקודת ההחלפה עם sudo, כי sudo הוא זכות להריץ פקודות בשם ה-root בלי סיסמה, ואחרי ההחלפה הסולמית מחליפה את הדולר בשורת הפקודה ואנחנו תחת root, ואז ה-sudo הופך מיותר בפקודות שאחר כך.
7. התקנת גיט ו-Node.js: מתקינים בפקודה אחת בלי שאלות את גיט ואת Node.js בגרסה היציבה האחרונה, ושווה לדעת שכל הגרסאות היציבות שנתמכות שנים ארוכות הן במספרים זוגיים, והגרסאות האי זוגיות נתמכות רק כחצי שנה, ולכן בוחרים תמיד את הגרסה הזוגית האחרונה, ואחרי שההתקנה עברה בהצלחה מעתיקים את הפקודה לתוך הסקריפט.
8. עדכון NPM לגרסה האחרונה: ה-Node.js שהותקן כולל גם את NPM אבל לא בטוח שהוא האחרון, וכדי לוודא מריצים התקנה גלובלית של NPM בגרסה האחרונה, והמינוס g אומר שההתקנה תהיה גלובלית בכל מערכת ההפעלה עבור כל המשתמשים, וזו גם סיבה נוספת לעדכון המאגר בתחילת הסקריפט.
9. סידור הסקריפט עם הערות: מוסיפים לסקריפט הערות עם סולמית, כמו אזור ההתקנות ואזור הגדרת האתר, כדי שיהיה קל יותר להבין את הסקריפט בעוד חצי שנה, ומפרידים ברווח בין אזור הנתונים היבשים לפקודות הטכניות.
10. משתנה סביבה לנתיב האתר: מגדירים משתנה סביבה שיכיל את הנתיב של האתר, כדי שבפקודות הבאות לא נצטרך לרשום את הנתיב בכל פעם מחדש, ואם יום אחד נרצה להחליף את המיקום לא נצטרך לחפש בקוד את כל המקומות וגם נחסוך טעויות כתיב, והמשתנה יושב בזיכרון עד סגירת החיבור ונעלם אחרי אתחול, ואפשר להדפיס את ערכו ולראות אותו.
11. שכפול הפרויקט מהאינטרנט: מריצים git clone שיוריד מהאינטרנט את ה-repository של הפרויקט וישים אותו בתיקייה מהמשתנה, ואפשר גם את כתובת ה-repository לשים כמשתנה משלו, וכך מפרידים בין נתונים יבשים לבין פקודות לביצוע ומאוד קל לתחזק, והבדיקה בשרת מראה שנוצרה תיקיית הפרויקט עם כל הקבצים שהורדו.
12. כניסה לתיקיית הפרויקט: הפקודה הבאה נכנסת לתיקיית הפרויקט, ושוב חושבים איך בלי המשתנה היינו צריכים לכתוב את שם התיקייה בכל מקום ואחר כך לחפש את כל המקומות להחלפה, וכך הנתונים נמצאים באזור מבודד של נתונים יבשים ואפשר לעדכן אותם בקלות.
13. התקנת המודולים עם NPM: בתוך תיקיית הפרויקט יש קובץ הגדרות שמכיל רשימה של כל הספריות שהשרת צריך ומאיזו גרסה, הקוד של האתר דורש אותן בתחילתו, למשל ספריית החיבור ל-MySQL שכוללת את האופן להתחבר ולדבר עם הדאטאבייס, והספריות האלה קיימות באינטרנט ולא מצורפות לפרויקט, ומי שמוריד ומתקין אותן הוא כלי ה-NPM עם הפקודה להתקנה, והבדיקה מראה שהוא התקין מאה ושש חבילות ונוצרה תיקיית המודולים.
14. ניסיון הפעלה ראשון והשגיאה הצפויה: מריצים את פקודת ההפעלה של האתר ומקבלים הודעת שגיאה שהוא לא מצליח להתחבר לפורט שלוש שלוש אפס שש של ה-MySQL בכתובת הפנימית, וזה מובן כי ה-MySQL לא נמצא על המחשב הזה בכלל, ומהודעת השגיאה אפשר לראות בדיוק את שורת הקוד בקובץ השרת שמעיפה את השגיאה, ובסרטון הבא מחברים את האתר ל-MySQL.
סיכום:
בשיעור זה נכנסנו למכונה הריקה בענן ב-SSH והתחלנו לבנות את הסקריפט שיתקין את האתר אוטומטית במעמד הקמת המכונה, למדנו את מבנה ה-user data עם הסימן המיוחד ובחירת ה-shell, עדכנו את מאגר התוכנות והתקנו גיט ו-Node.js בגרסה יציבה זוגית ו-גם NPM בגרסה האחרונה, סידרנו את הסקריפט עם הערות ומשתני סביבה שמפרידים נתונים מפקודות, שכפלנו את הפרויקט מהאינטרנט והתקנו את כל המודולים שהוא דורש, וראינו את שגיאת ההתחברות ל-MySQL שתיפתר בשיעור הבא.
SR13885HE