كيفية إنشاء تطبيق Golang قابل للتوصيل والاستفادة من طبقات AWS Lambda.

جولانج - لماذا يستحق اهتمامك؟

Golang هي لغة برمجة مفتوحة المصدر تم تصميمها وتنفيذها بواسطة Google. يستخدم على نطاق واسع في التطبيقات الحديثة وخاصة في السحابة. إنها أكثر السمات المميزة:

  • يتم كتابة Golang بشكل ثابت - يوفر مرونة أقل ، لكنه يحميك من ارتكاب الأخطاء ،
  • انها ليست وجوه المنحى. ومع ذلك ، يمكنك إنشاء هياكل وواجهات والتي تمنحك 3 من 4 مبادئ OOP: استخراج البيانات ، التغليف ، وتعدد الأشكال. الميراث هو الشخص الوحيد المفقود ،
  • Goroutines! - أكبر تطبيق للخيوط الخفيفة التي كنت أستخدمها على الإطلاق. يسمح لك بإنشاء سلسلة رسائل جديدة بطريقة سهلة للغاية باستخدام مشغل go والتواصل بين مختلف المواقع باستخدام القنوات ،
  • إنه يجمع ثنائي واحد مع كل التبعيات - لا مزيد من الصراعات الحزم!

أنا شخصياً أعتبر غولانغ هي أعظم لغة أستخدمها يوميًا. ومع ذلك ، فإن هذه المقالة لن تكون حول إنشاء وظيفتك الأولى أو طباعة "Hello World". سوف تظهر لك أشياء أكثر تقدماً قليلاً. إذا كنت مبتدئًا وتريد معرفة المزيد عن Golang ، فيرجى زيارة صفحتها الرئيسية.

AWS لامدا وجولانج

AWS Lambda هي واحدة من أكثر خدمات الحوسبة التي لا تتضمن خوادم في السحابة العامة ، والتي تم إصدارها في نوفمبر 2014 بواسطة Amazon Web Services. يتيح لك تشغيل التعليمات البرمجية استجابة للأحداث مثل مشغلات DynamoDB أو SNS أو HTTP دون توفير أو إدارة الخوادم! هل تعرف ما هو عظيم حقا؟ منذ يناير 2018 وهو يدعم وقت التشغيل Golang. العمل مع AWS Lambda بسيط جدًا - ما عليك سوى تحميل حزمة مضغوطة بكودك وكل التبعيات (ثنائية ثنائية عند استخدام Golang).

بسرعة للأمام ، بعد 4 سنوات في 2018 re: Invent AWS تُصدر Lambda Layers التي تتيح لك تخزين وإدارة البيانات التي يتم مشاركتها عبر وظائف مختلفة في حسابات AWS الفردية أو حتى المتعددة! على سبيل المثال ، أثناء استخدام Python ، يمكنك وضع جميع التبعيات في طبقة إضافية يمكن استخدامها لاحقًا بواسطة Lambdas الأخرى. ليست هناك حاجة لوضع تبعيات مختلفة في كل حزم مضغوط بعد الآن! يختلف الوضع العالمي في Golang نظرًا لأن AWS Lambda يتطلب منك تحميل ثنائي مترجم. كيف يمكننا الاستفادة من طبقات AWS Lambda؟ الجواب بسيط - بناء تطبيق وحدات باستخدام Golang الإضافات!

Golang Plugins - وسيلة لبناء تطبيق معياري

إضافات Golang هي الميزة التي تم إصدارها في Go1.8 والتي تتيح لك تحميل المكتبات المشتركة (ملفات .so) بشكل حيوي. يمنحك فرصة لتصدير بعض التعليمات البرمجية الخاصة بك إلى مكتبة منفصلة أو استخدام البرنامج المساعد أعدها وتجميعها من قبل شخص آخر. إنه واعد ، ومع ذلك ، هناك بعض القيود:

  • يجب أن يكون البرنامج المساعد الخاص بك وحدة رئيسية واحدة ،
  • يمكنك فقط تحميل الوظائف والمتغيرات التي يتم تصديرها كرموز ELF ،
  • بسبب الكتابة الساكنة ، يجب عليك إلقاء كل رمز محمل على النوع الصحيح. في أسوأ السيناريوهات ، تحتاج إلى تحديد الواجهة الصحيحة في الكود ،
  • إنه يعمل فقط لنظامي التشغيل Linux و MacOS. شخصيا ، أنا لا أعتبر هذا عيبًا :)

بناء واختبار البرنامج المساعد الأول الخاص بك

الآن لنقم بإنشاء المكون الإضافي الأول. كمثال ، سنقوم بإنشاء وحدة نمطية بسيطة لتشفير السلسلة. دعنا نعود إلى الأساسيات وتنفيذ خوارزميات تشفير بسيطة - Ceasar و Verman.

  • قيصر التشفير هو الخوارزمية المستخدمة لأول مرة من قبل يوليوس توقف. يغير كل حرف في النص بعدد ثابت من المواضع. على سبيل المثال ، إذا كنت ترغب في تشفير كلمة golang باستخدام المفتاح 4 ، فستحصل على ktpek. فك التشفير يعمل بنفس الطريقة. تحتاج فقط إلى تحويل الحروف في الاتجاه المعاكس.
  • يشبه تشفير Verman تشفير Ceaser ، استنادًا إلى نفس فكرة التحول ، والفرق هو أن تقوم بتغيير كل حرف بعدد مختلف من المواضع. لفك تشفير النص ، يجب أن يكون لديك مفتاح يحتوي على المواضع المستخدمة لتشفير النص. على سبيل المثال ، إذا كنت ترغب في تشفير كلمة golang باستخدام المفتاح [-1 ، 4 ، 7 ، 20 ، 4 ، -2] فستحصل على المستقبل.

التنفيذ الكامل لهذا المثال متاح هنا.

تنفيذ البرنامج المساعد

يحتوي المقتطف التالي على تنفيذ الخوارزميات المذكورة أعلاه. لكل واحد منا نطبق طريقتين لتشفير وفك تشفير نصنا:

كما ترون ، لقد أصدرنا هنا 3 رموز مختلفة (تصدر Golang فقط هذه المعرفات التي تبدأ بالحرف العلوي):

  • EncryptCeasar - سلسلة func (int ، string) التي تقوم بتشفير النص باستخدام خوارزمية Ceasar ،
  • DecryptCeaser - سلسلة func (int ، string) تقوم بفك تشفير النص باستخدام خوارزمية Caeser ،
  • VermanCipher - متغير من نوع vermanCipher تنفيذ طريقتين: تشفير: سلسلة (سلسلة) func وفك تشفير: func () (* سلسلة ، خطأ)

لتجميع هذا البرنامج المساعد ، يجب عليك تشغيل الأمر التالي:

go build -buildmode = plugin -o plugin / cipher.so plugin / cipher.go

في الوقت الحالي ، لا يوجد شيء خاص - تم إنشاء عدد قليل من الوظائف البسيطة وتم تجميع وحدة نمطية كمكون إضافي عن طريق إضافة الوسيطة -buildmode = plugin.

تحميل واختبار البرنامج المساعد

تبدأ المتعة عندما نريد استخدام البرنامج المساعد المترجم في تطبيقنا. لنقم بإنشاء مثال بسيط:

أولاً ، تحتاج إلى استيراد حزمة البرنامج المساعد golang. يحتوي على وظيفتين فقط - الأولى مخصصة لتحميل المكتبة المشتركة والثانية لإيجاد رمز تم تصديره. لتحميل مكتبتك ، يجب عليك استخدام الوظيفة المفتوحة التي تتطلب توفير المسار إلى البرنامج المساعد المشترك الخاص بك وإرجاع متغير نوع البرنامج المساعد. إذا كان تحميل المكتبة غير ممكن (على سبيل المثال ، مسار غير صحيح أو ملف تالف) ، فتُرجع هذه الوظيفة الخطأ الذي يجب معالجته.

الخطوة التالية هي تحميل كل رمز تم تصديره باستخدام طريقة البحث. هناك إزعاج بسيط يتمثل في أنك تحتاج إلى تحميل كل وظيفة يتم تصديرها بشكل منفصل. ومع ذلك ، يمكنك الجمع بين وظائف متعددة معًا بنفس الطريقة التي تم بها لرمز VermanCipher. بمجرد تحميل جميع الرموز التي تريد استخدامها ، يجب عليك إلقاءها على النوع الصحيح. Golang هي لغة مكتوبة بشكل ثابت لذلك لا توجد وسيلة أخرى لاستخدام هذه الرموز دون صب. تذكر ، عندما تقوم بتصدير متغير يطبق عدة طرق ، فأنت بحاجة إلى تحويله إلى نوع الواجهة الصحيح (كان علي تحديد واجهة encryptionEngine للتعامل مع هذا). \ newline \ newline

لتجميع التطبيق وتشغيله ، استخدم الأمر التالي:

اذهب بناء app.go
./app

في الإخراج ، يجب أن ترى النص المشفر والمشفّر كدليل على أن الخوارزمية تعمل بشكل صحيح.

استخدام البرنامج المساعد في AWS امدا

لاستخدام البرنامج المساعد لدينا في AWS Lambda ، نحتاج إلى إجراء بعض التعديلات في تطبيقنا:

  • يحمّل AWS Lambda الطبقات إلى الدليل / opt في حاوية lambda ، لذلك يتعين علينا تحميل المكون الإضافي الخاص بنا من هذا الدليل.
  • نحتاج إلى إنشاء وظيفة معالج سيتم استخدامها بواسطة محرك Lambda للتعامل مع حدث الاختبار الخاص بنا.

يحتوي المقتطف التالي على تطبيقنا الذي تم ضبطه ليتم استخدامه بواسطة Lambda:

كما ترون التنفيذ مشابه جدا للتطبيق السابق. لقد قمنا فقط بتغيير الدليل الذي تم تحميل المكون الإضافي منه وقم بإضافة استجابة الوظيفة بدلاً من طباعة القيم. إذا كنت تريد معرفة المزيد حول كتابة Lambdas في golang ، يرجى مراجعة وثائق AWS.

نشر AWS لامدا

هناك طريقتان لنشر وظائف وطبقات AWS Lambda. يمكنك إنشاء وتحميل حزمة مضغوطة يدويًا أو استخدام إطار عمل أكثر تقدمًا ، مما يجعلها أسهل بكثير وأسرع. بالنسبة لمعظم مشاريعي ، أستخدم إطار عمل Serverless ، لذلك أعددت بالفعل ملف التكوين serverless.yml البسيط باستخدام هذه الأداة:

الخدمة: خدمات التشفير
frameworkVersion: "> = 1.28.0 <2.0.0"
مزود:
  الاسم: أوس
  وقت التشغيل: go1.x
طبقات:
  cipherLayer:
    المسار: بن / البرنامج المساعد
    compatibleRuntimes:
      - go1.x
المهام:
  محرك:
    معالج: بن / cipherEngine
    صفقة:
      استبعاد:
        - ./**
      تضمن:
        - ./bin/cipherEngine
    طبقات:
      - {المرجع: CipherLayerLambdaLayer}

في قسم الطبقات ، حددنا طبقة واحدة مع المسار إلى المكون الإضافي الذي تم إنشاؤه بالفعل - سيتم نشره مع وظيفة lambda. يمكنك تحديد ما يصل إلى 5 طبقات مختلفة وهو أمر مهم حقًا. يتم تثبيتها على نفس الدليل / opt ، بحيث يمكن للطبقات ذات العدد الأعلى تجاوز الملفات من الطبقات المثبتة مسبقًا. في كل طبقة ، تحتاج إلى توفير معلمتين على الأقل: المسار إلى الدليل الذي يحتوي على مصدر الطبقة (المسار إلى المكون الإضافي الثنائي في حالتك) وقائمة أوقات التشغيل المتوافقة.

قسم الوظائف التالية هو مكان تحدد فيه قائمة الوظائف المراد نشرها. لكل وظيفة ، تحتاج إلى توفير المسار إلى التطبيق المترجم على الأقل. بالإضافة إلى ذلك ، نحتاج إلى تحديد معلمة الطبقات مع الإشارة إلى الطبقة المحددة أعلاه. سيؤدي ذلك تلقائيًا إلى إرفاق الطبقة بوظيفة Lambda أثناء النشر. الشيء المضحك هو أنه يتعين عليك تحويل اسم طبقة lambda إلى TitleCased وإضافة لاحقة LambdaLayer إذا كنت تريد الإشارة إلى هذا المورد. يبدو أن فريق Serverless قام بتطبيقه بهذه الطريقة لحل التعارض مع الإشارة إلى أنواع الموارد المختلفة.

بمجرد أن يصبح ملف تهيئة serverless.yml جاهزًا ، فإن آخر ما يجب فعله هو تجميع تطبيقنا ، البرنامج المساعد ونشره. يمكننا استخدام Makefile بسيط لذلك:

.PHONY: بناء buildPlugin نظيفة نشر
بناء:
 dep ضمان الخامس
 env GOOS = linux go build -ldflags = "- s -w" -o bin / cipherEngine cipherEngine / main.go
buildPlugin:
 env GOOS = linux go build -ldflags = "- s -w" -buildmode = plugo -o bin / plugin / cipher.so ../plugin/cipher.go
نظيف:
 rm-rf ./bin ./vendor Gopkg.lock
نشر: بناء buildPlugin نظيفة
 sls نشر - verbose

يمكنك إنشاء ونشر وظيفتك عن طريق تشغيل الأمر التالي:

جعل نشر

اختبار AWS لامدا

كما ذكرت سابقًا ، تقوم AWS Lambda بتنفيذ التعليمات البرمجية في الرد على الحدث. ومع ذلك ، لم نقوم بتهيئة أي مشغلات للأحداث ، لذلك لن يتم الاحتجاج بها دون مساعدتنا. يتعين علينا القيام بذلك يدويًا باستخدام إطار عمل Serverless أو أداة awscli:

sls استدعاء -f function_name
أوس الاستدعاء لامدا - اسم وظيفة function_name output_file

في الاستجابة ، يجب أن تشاهد نفس الإخراج كما كان من قبل ، والذي يثبت أن وظيفة lambda لدينا تعمل بشكل صحيح وتحميل البرنامج المساعد من الطبقة الإضافية. يمكنك الآن إنشاء وظائف أخرى تستخدم نفس الطبقة أو حتى مشاركتها مع حسابات AWS الأخرى.

ملخص

لقد كان من الجيد استخدام وحدات Golang واختبار كيفية دمجها مع طبقات AWS Lambda التي تم إصدارها حديثًا. مكتبة المكونات الإضافية رائعة حقًا ، ولكن بسبب حدودها ومواصفات Golang ، يمكن استخدامها فقط في بعض السيناريوهات الخاصة. أعتقد أنه بالنسبة لمعظم المطورين الذين يعملون في المشروعات القياسية ، لن تكون هناك حاجة أو حتى استخدام المكونات الإضافية. يتبادر إلى ذهني سببين فقط:

  • تنفيذ الخوارزميات المعقدة التي يمكن استخدامها من قبل التطبيقات الأخرى السابقين. ترميز الفيديو أو خوارزميات التشفير.
  • مشاركة الخوارزمية مع الآخرين دون نشر الكود الخاص بها.