כיצד ליצור אפליקציית Golang ניתנת לחיזוק ולהפיק תועלת משכבות למבדה של AWS.

גולנג - למה כדאי לשים לב?

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

  • Golang כתוב בצורה סטטית - הוא מציע פחות גמישות אבל מגן עליך מפני טעויות,
  • זה לא מונחה עצמים. עם זאת, אתה יכול ליצור מבנים וממשקים, וזה מניב 3 מתוך 4 עקרונות OOP: הפשטת נתונים, אנקפסולציה ופולימורפיזם. כל מה שחסר זה ירושה
  • גורוטינים! - היישום הטוב ביותר של חוטי האור שהשתמשתי בו מעולם. באמצעות מפעיל go תוכלו ליצור בקלות שרשור חדש ולתקשר דרך ערוצים בין גורוטינים שונים.
  • הוא נערך לקובץ בינארי יחיד עם כל התלות - אין עוד התנגשויות חבילה!

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

AWS למבדה וגולאנג

AWS למבה הוא אחד משירותי המחשוב ללא שרתים הפופולאריים בענן הציבורי, ששוחרר על ידי שירותי האינטרנט של אמזון בנובמבר 2014. אתה יכול להריץ את הקוד שלך בתגובה לאירועים כמו DynamoDB, SNS או HTTP מפעילים מבלי שתצטרך להגדיר או לנהל שרתים! אתה יודע מה באמת נהדר? היא תומכת בקדנציה של גולנג מאז ינואר 2018. העבודה עם AWS Lambda היא ממש קלה - פשוט העלה חבילה דחוסה עם הקוד שלך וכל התלות (בינארי יחיד אם אתה משתמש ב- Golang).

קדימה מהירה, 4 שנים מאוחר יותר, מחדש re: Invent AWS משחררת Lambda Layers המאפשרים לך לאחסן ולנהל נתונים המשותפים עבור פונקציות שונות בחשבון AWS אחד או אפילו! לדוגמה, אם אתה משתמש ב- Python, אתה יכול לשים את כל התלות בשכבה נוספת שתוכל להשתמש בה אחר על ידי lambdas אחרים. אין עוד צורך להוסיף תלות שונות לכל חבילה מכווצת! המצב שונה בעולם גולאנג מכיוון ש- AWS Lambda מחייב העלאת בינאריות מקובלות. כיצד נוכל להפיק תועלת משכבות למבדה של AWS? התשובה היא פשוטה - בנה אפליקציה מודולרית עם תוספי Golang!

תוספי Golang - דרך לבנות יישום מודולרי

תוספי Golang היא התכונה ששוחררה ב- Go1.8 המאפשרת לך לטעון באופן דינמי ספריות משותפות (.so קבצים). יש לך אפשרות לייצא חלק מהקוד שלך לספרייה הנפרדת או להשתמש בתוסף שנוצר ונאסף על ידי מישהו אחר. עם זאת, זה מעודד שיש כמה מגבלות:

  • התוסף שלך חייב להיות מודול ראשי יחיד,
  • ניתן לטעון רק פונקציות ומשתנים המיוצאים כסמלי ELF.
  • בשל ההקלדה הסטטית, עליך להמיר כל סמל טעון לסוג הנכון. במקרה הגרוע ביותר, עליך להגדיר את הממשק הנכון בקוד שלך,
  • זה עובד רק על לינוקס ו- MacOS. באופן אישי אני לא רואה בזה חיסרון :)

צור ובדוק את התוסף הראשון שלך

עכשיו בואו ניצור את התוסף הראשון שלנו. כדוגמה ניצור מודול פשוט להצפנת מחרוזות. בואו נחזור ליסודות וניישם שני אלגוריתמי הצפנה פשוטים - Ceasar ו- Verman.

  • צופן קיסר הוא האלגוריתם בו שיוליוס מפסיק לראשונה. זה מעביר כל אות בטקסט את מספר המקומות שצוין. לדוגמה, אם ברצונך להצפין את המילה גולנג עם מפתח 4, תקבל ktpek. פענוח עובד באותה צורה. כל שעליך לעשות הוא להעביר את האותיות בכיוון ההפוך.
  • צופן ורמן דומה לצופן סיזר, המבוסס על אותו רעיון משתנה. ההבדל הוא שאתה מעביר לכל אות את מספר העמדות השונה. כדי לפענח את הטקסט, אתה צריך את המפתח עם המיקומים שבהם הטקסט הוצפן. לדוגמא, אם ברצונך להצפין את המילה גולנג עם המפתח [-1, 4, 7, 20, 4, -2], תקבל עתיד.

היישום המלא של דוגמה זו ניתן למצוא כאן.

יישום תוסף

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

כפי שאתה יכול לראות, ייצאנו לכאן 3 סמלים שונים (גולנג מייצאת רק את המזהים המתחילים באות למעלה):

  • EncryptCeasar - func (int, string) מחרוזת שמצפנת טקסט באמצעות אלגוריתם Ceasar.
  • DecryptCeaser - func (int, string) מחרוזת שמפענחת את הטקסט באמצעות אלגוריתם Caeser,
  • VermanCipher - משתנה מהסוג vermanCipher, המיישם 2 שיטות: הצפנה: מחרוזת func (מחרוזת) ופענוח: func () (* מחרוזת, שגיאה)

כדי להרכיב תוסף זה עליך להפעיל את הפקודה הבאה:

עבור לבנות - buildmode = תוסף - תוסף / cipher.so תוסף / cipher.go

אין שום דבר מיוחד כרגע - נוצרו רק כמה פונקציות פשוטות ומודול הורכב כתוסף על ידי הוספת הארגומנט -buildmode = plugin.

טען ובדק את התוסף

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

ראשית עליך לייבא את חבילת התוסף Golang. הוא מכיל רק שתי פונקציות - הראשונה היא לטעון ספרייה משותפת והשנייה היא למצוא סמל מיוצא. כדי לטעון את הספרייה שלך, עליך להשתמש בפונקציה הפתוחה, שעבורה יש לציין את הנתיב לפלאגין המשותף שלך ולמשתנה ההחזר של סוג הפלאגין. אם לא ניתן לטעון את הספרייה (למשל נתיב שגוי או קובץ פגום), פונקציה זו מחזירה את השגיאה שיש לטפל בה.

השלב הבא הוא לטעון כל סמל מיוצא בשיטת החיפוש. חסרון קטן הוא שעליך לטעון כל פונקציה מיוצאת בנפרד. עם זאת, באפשרותך לשלב מספר פונקציות באותו אופן כמו שעשית עבור סמל VermanCipher. לאחר טעינת כל הסמלים שבהם ברצונך להשתמש, עליך להמיר אותם לסוג הנכון. גולנג היא שפה שהוקלדה באופן סטטי, ולכן אין דרך אחרת להשתמש בסמלים אלה בלי ליהוק. זכרו, אם אתם מייצאים משתנה המיישם כמה שיטות עליכם ללהק אותו לסוג הממשק הנכון (הייתי צריך להגדיר את ממשק encryptionEngine כדי להתמודד עם זה). \ Newline \ newline

השתמש בפקודה הבאה כדי להרכיב ולהפעיל את האפליקציה:

לך לבנות app.go ./app

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

השתמש בתוסף ב- AWS Lambda

על מנת להשתמש בתוסף שלנו ב- AWS Lambda, עלינו לבצע כמה שינויים ביישום שלנו:

  • AWS Lambda מרכיב שכבות בספריה / opt במיכל Lambda, לכן עלינו לטעון את הפלאגין שלנו מספרייה זו.
  • עלינו ליצור פונקציית מטפל שתשמש את מנוע למבדה לעיבוד אירוע הבדיקה שלנו.

הקטע הבא מכיל את היישום שלנו שהותאם לשימוש על ידי למבדה:

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

פריסת AWS למבדה

ישנן שתי דרכים לפרוס פונקציות ושכבות של AWS למבדה. אתה יכול ליצור ולהעלות חבילה דחוסה באופן ידני או להשתמש במסגרת המתקדמת שתקל עליה ומהירה הרבה יותר. ברוב הפרויקטים שלי אני משתמש במסגרת נטולת השרת. לכן כבר הכנתי את קובץ התצורה הפשוט serverless.yml בעזרת הכלי הזה:

שירות: cipher מסגרת שירות גרסה: "> = 1.28.0 <2.0.0" ספק: שם: aws זמן ריצה: go1.x
שכבות: cipher שכבה: נתיב: זמן תואם לפח / תוסף: - go1.x
פונקציות: מנוע: מטפל: bin / cipher חבילה למנוע: לא לכלול: - ./** כולל: - ./bin/cipher שכבות מנוע: - {Ref: CipherLayerLambdaLayer}

באזור השכבה הגדרנו שכבה אחת עם הנתיב לתוסף שכבר נוצר - זה מסופק יחד עם פונקציית Lambda. ניתן להגדיר עד 5 רמות שונות שסדרן באמת חשוב. הם מותקנים באותה מדריך / opt, כך שכבות עם המספר הגבוה יותר יכולות להחליף קבצים מהשכבות שהותקנו בעבר. עבור כל רמה עליך לציין לפחות שני פרמטרים: נתיב לספריה עם מקור הרמה (במקרה שלך נתיב לקובץ הבינארי התוסף) ורשימת זמני ההפעלה התואמים.

סעיף הפונקציות הבא הוא מקום בו אתה מגדיר את רשימת הפונקציות המיושמות. עבור כל פונקציה עליך לפחות לציין את הנתיב ליישום המהולל. בנוסף, עלינו להגדיר את פרמטר השכבה בהתייחס לשכבה שהוגדרה לעיל. זה יוסיף באופן אוטומטי את השכבה לפונקציית Lambda שלנו במהלך הפריסה. הדבר המצחיק הוא שאם אתה רוצה להתייחס למשאב זה, עליך להמיר את שם שכבת ה- Lambda שלך ל- TitleCased ולהוסיף את הסיומת LambdaLayer. נראה כי הצוות ללא השרת יישם זאת בדרך לפתרון הסכסוך ביחס לסוגים שונים של משאבים.

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

.PHONY: Build BuildPlugin לפרוס בצורה נקייה
build: dep secure -v env GOOS = Linux go build -ldflags = "-s -w" -o bin / cipherEngine cipherEngine / main.go
buildPlugin: env GOOS = Linux go build -ldflags = "- s -w" -buildmode = Plugin -o bin / plugin / cipher.so ../plugin/cipher.go
נקי: rm -rf ./bin ./vendor Gopkg.lock
לפרוס: נקי buildPlugin לבנות sls לפרוס --verbose

באפשרותך לבנות ולפרוס את הפונקציה שלך על ידי הפעלת הפקודה הבאה:

לְסַפֵּק

נסה את AWS למבדה

כפי שצוין קודם לכן, קוד AWS Lambda פועל בתגובה לאירוע. עם זאת, לא הגדרנו שום גורם לאירוע ולכן לא ניתן להתקשר אליו ללא עזרתנו. עלינו לעשות זאת באופן ידני באמצעות Framework Serverless או בכלי awscli:

sls קורא -f פונקציה-שם aws lambda להפעיל - פונקצית-שם פונקציה-שם פלט קובץ

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

סיכום

היה כיף גדול להשתמש במודולים של Golang ולבדוק כיצד ניתן לשלב אותם עם שכבות ה- AWS Lambda Layers. ספריית התוספים היא ממש נהדרת, אך ניתן להשתמש בה רק בתרחישים מסוימים בשל מגבלותיה ומפרט Golang. אני חושב שעבור רוב היזמים העובדים על הפרויקטים הסטנדרטיים, תוספים אינם נדרשים ואף אינם אפשריים. אני יכול לחשוב רק על שתי סיבות:

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