Πώς να φτιάξετε την εφαρμογή Golang και να επωφεληθείτε από τα Layers Lambda του AWS.

Golang - γιατί αξίζει την προσοχή σας;

Το Golang είναι μια γλώσσα προγραμματισμού ανοιχτού κώδικα που σχεδιάστηκε και υλοποιήθηκε από την Google. Χρησιμοποιείται ευρέως σε σύγχρονες εφαρμογές, ειδικά στο σύννεφο. Τα πιο χαρακτηριστικά χαρακτηριστικά είναι τα εξής:

  • Το Golang γράφεται στατικά - παρέχει λιγότερη ευελιξία, αλλά σας προστατεύει από λάθη,
  • Δεν είναι αντικειμενοστρεφής. Ωστόσο, μπορείτε να δημιουργήσετε δομές και διεπαφές και αυτό σας δίνει 3 από 4 αρχές OOP: αφαίρεση δεδομένων, εγκλωβισμό και πολυμορφισμό. Η κληρονομιά είναι η μόνη που λείπει,
  • Γκορουτίνες! - τη μεγαλύτερη εφαρμογή των ελαφρών νημάτων που έχω χρησιμοποιήσει ποτέ. Σας επιτρέπει να δημιουργήσετε ένα νέο νήμα με τον έξοχο εύκολο τρόπο χρησιμοποιώντας τον χειριστή go και να επικοινωνήσετε μεταξύ διαφορετικών γκουρτουρινών χρησιμοποιώντας κανάλια,
  • Καταρτίζεται στο ενιαίο δυαδικό αρχείο με όλες τις εξαρτήσεις - δεν υπάρχουν πλέον διενέξεις των πακέτων!

Προσωπικά, θεωρώ το Golang ως τη μεγαλύτερη γλώσσα που χρησιμοποιώ καθημερινά. Ωστόσο, αυτό το άρθρο δεν αφορά τη δημιουργία της πρώτης σας λειτουργίας ή την εκτύπωση "Hello World". Θα σας δείξω κάτι πιο προηγμένο. Εάν είστε αρχάριος και θέλετε να μάθετε περισσότερα για το Golang παρακαλώ επισκεφθείτε την κύρια σελίδα του.

AWS Lambda & Golang

Το AWS Lambda είναι μια από τις πιο δημοφιλείς υπηρεσίες επεξεργασίας υπολογιστών χωρίς διακομιστές στο δημόσιο σύννεφο, που κυκλοφόρησε το Νοέμβριο του 2014 από την Amazon Web Services. Σας επιτρέπει να εκτελέσετε τον κώδικα σας σε απόκριση σε γεγονότα όπως το DynamoDB, το SNS ή το HTTP ενεργοποιώντας χωρίς παροχή ή διαχείριση διακομιστών! Ξέρετε τι είναι πραγματικά υπέροχο; Από τον Ιανουάριο του 2018 υποστηρίζει το χρόνο εκτέλεσης Golang. Η συνεργασία με το AWS Lambda είναι πολύ απλή - απλά μεταφορτώστε ένα πακέτο zipped με τον κωδικό σας και όλες τις εξαρτήσεις (μονό δυαδικό όταν χρησιμοποιείτε το Golang).

Γρήγορα προς τα εμπρός, 4 χρόνια αργότερα το 2018 re: Invent AWS απελευθερώνει Lambda Layers που σας επιτρέπει να αποθηκεύετε και να διαχειρίζεστε δεδομένα που μοιράζονται σε διαφορετικές λειτουργίες στους απλούς ή και πολλούς λογαριασμούς AWS! Για παράδειγμα, κατά τη χρήση της Python μπορείτε να βάλετε όλες τις εξαρτήσεις σε ένα επιπλέον επίπεδο το οποίο μπορεί να χρησιμοποιηθεί αργότερα από άλλους Lambdas. Δεν υπάρχει λόγος να βάζετε πια διαφορετικές εξαρτήσεις σε κάθε πακέτο με φερμουάρ! Στην κατάσταση του κόσμου Golang είναι διαφορετική, καθώς η AWS Lambda απαιτεί να μεταφορτώσετε το δυαδικό compiled. Πώς μπορούμε να επωφεληθούμε από τα Layers Lambda του AWS; Η απάντηση είναι απλή - δημιουργήστε μια αρθρωτή εφαρμογή χρησιμοποιώντας Golang Plugins!

Golang Plugins - ένας τρόπος για να χτίσετε μια αρθρωτή εφαρμογή

Το Golang Plugins είναι το χαρακτηριστικό που κυκλοφόρησε στο Go1.8 που σας επιτρέπει να φορτώσετε δυναμικά κοινές βιβλιοθήκες (αρχεία .so). Σας δίνει την ευκαιρία να εξάγετε κάποιο από τον κώδικα σας στη ξεχωριστή βιβλιοθήκη ή να χρησιμοποιήσετε την πρόσθετη επιφάνεια που ετοιμάστηκε και συντάχθηκε από κάποιον άλλο. Είναι πολλά υποσχόμενη, ωστόσο, υπάρχουν μερικοί περιορισμοί:

  • Το πρόσθετο σας πρέπει να είναι μία κύρια κύρια μονάδα,
  • Μπορείτε να φορτώσετε μόνο λειτουργίες και μεταβλητές που εξάγονται ως ELF σύμβολα,
  • Λόγω της στατικής πληκτρολόγησης, πρέπει να ρίχνετε κάθε φορτωμένο σύμβολο στον σωστό τύπο. Στο χειρότερο σενάριο, πρέπει να ορίσετε τη σωστή διεπαφή στον κωδικό σας,
  • Λειτουργεί μόνο για Linux και MacOS. Προσωπικά, δεν το θεωρώ μειονέκτημα :)

Δημιουργία και δοκιμή του πρώτου σας plugin

Τώρα ας δημιουργήσουμε το πρώτο μας plugin. Για παράδειγμα, θα δημιουργήσουμε μια απλή ενότητα για την κρυπτογράφηση στοιχειοσειρών. Ας επιστρέψουμε στα βασικά και εφαρμόσουμε 2 απλούς αλγόριθμους κρυπτογράφησης - Ceasar και Verman.

  • Το cesar cipher είναι ο αλγόριθμος που χρησιμοποιήθηκε αρχικά από τον Julius Ceases. Αλλάζει κάθε γράμμα στο κείμενο με τον σταθερό αριθμό θέσεων. Για παράδειγμα, εάν θέλετε να κρυπτογραφήσετε τη λέξη golang με το πλήκτρο 4, θα πάρετε το ktpek. Η αποκρυπτογράφηση λειτουργεί με τον ίδιο τρόπο. Απλά πρέπει να μετακινήσετε τα γράμματα προς την αντίθετη κατεύθυνση.
  • Το Verman cipher είναι παρόμοιο με το Ceaser, με βάση την ίδια ιδέα αλλαγής, η διαφορά είναι ότι αλλάζετε κάθε γράμμα από τον διαφορετικό αριθμό θέσεων. Για να αποκρυπτογραφήσετε το κείμενο πρέπει να έχετε το κλειδί που περιέχει τις θέσεις που χρησιμοποιούνται για την κρυπτογράφηση του κειμένου. Για παράδειγμα, εάν θέλετε να κρυπτογραφήσετε τη λέξη golang με το πλήκτρο [-1, 4, 7, 20, 4, -2], θα έχετε μέλλον.

Η πλήρης εφαρμογή αυτού του παραδείγματος είναι διαθέσιμη εδώ.

Εφαρμογή προσθήκης

Το ακόλουθο απόσπασμα περιέχει την εφαρμογή των δύο αλγορίθμων που αναφέρονται παραπάνω. Για κάθε μία από αυτές υλοποιούμε 2 μεθόδους κρυπτογράφησης και αποκρυπτογράφησης του κειμένου μας:

Όπως μπορείτε να δείτε, εξήγαμε εδώ 3 διαφορετικά σύμβολα (ο Golang εξάγει μόνο αυτά τα αναγνωριστικά που ξεκινούν με το ανώτερο γράμμα):

  • Γραμμή EncryptCeasar - func (int, string) που κρυπτογραφεί κείμενο χρησιμοποιώντας αλγόριθμο Ceasar,
  • DecryptCeaser - func (int, string) συμβολοσειρά που αποκρυπτογραφεί κείμενο χρησιμοποιώντας αλγόριθμο Caeser,
  • VermanCipher - μεταβλητή τύπου vermanCipher που εφαρμόζει 2 μεθόδους: Κρυπτογράφηση: string string και Decrypt: func () (* συμβολοσειρά, σφάλμα)

Για να μεταγλωττίσετε αυτό το plugin θα πρέπει να εκτελέσετε την ακόλουθη εντολή:

πηγαίνετε build -buildmode = plugin -o plugin / cipher.so plugin / cipher.go

Προς το παρόν, δεν υπάρχει τίποτα το ιδιαίτερο - δημιουργήθηκαν μερικές απλές λειτουργίες και ένα module δημιουργήθηκε ως plugin προσθέτοντας το -buildmode = plugin.

Φόρτωση και δοκιμή plugin

Η διασκέδαση ξεκινάει όταν θέλουμε να χρησιμοποιήσουμε το επεξεργασμένο plugin στην εφαρμογή μας. Ας δημιουργήσουμε ένα απλό παράδειγμα:

Πρώτον, θα πρέπει να εισαγάγετε το πακέτο plugin golang. Περιέχει μόνο δύο λειτουργίες - η πρώτη είναι για τη φόρτωση της κοινόχρηστης βιβλιοθήκης και η δεύτερη για την εύρεση ενός εξαγόμενου συμβόλου. Για να φορτώσετε τη βιβλιοθήκη σας, πρέπει να χρησιμοποιήσετε την ανοιχτή συνάρτηση που απαιτεί την παροχή της διαδρομής στο κοινόχρηστο plugin σας και την επιστροφή μεταβλητής τύπου plug-in. Εάν η φόρτωση της βιβλιοθήκης δεν είναι δυνατή (π.χ. λανθασμένη διαδρομή ή κατεστραμμένο αρχείο), αυτή η λειτουργία επιστρέφει το σφάλμα που πρέπει να αντιμετωπιστεί.

Το επόμενο βήμα είναι να φορτώσετε κάθε εξαγόμενο σύμβολο χρησιμοποιώντας τη μέθοδο Lookup. Μια μικρή δυσκολία είναι ότι πρέπει να φορτώσετε ξεχωριστά κάθε εξαγόμενη λειτουργία. Ωστόσο, μπορείτε να συνδυάσετε πολλές λειτουργίες μαζί με τον ίδιο τρόπο που έγινε για το σύμβολο VermanCipher. Μόλις τοποθετήσετε όλα τα σύμβολα που θέλετε να χρησιμοποιήσετε, πρέπει να τα πετάξετε στον σωστό τύπο. Το Golang είναι στατική γλώσσα, οπότε δεν υπάρχει άλλος τρόπος να χρησιμοποιηθούν αυτά τα σύμβολα χωρίς χύτευση. Θυμηθείτε, όταν εξάγετε μια μεταβλητή που εφαρμόζει μερικές μεθόδους, θα πρέπει να τη μεταφέρετε στον σωστό τύπο διεπαφής (έπρεπε να ορίσω διεπαφή encryptionEngine για να το χειριστώ). \ Newline \ newline

Για να μεταγλωττίσετε και να εκτελέσετε την εφαρμογή, χρησιμοποιήστε την ακόλουθη εντολή:

go build app.go
./app

Στην έξοδο, θα πρέπει να δείτε το κρυπτογραφημένο και αποκρυπτογραφημένο κείμενο ως απόδειξη ότι ο αλγόριθμος λειτουργεί σωστά.

Χρησιμοποιήστε το plugin στο AWS λάμδα

Για να χρησιμοποιήσετε το plugin μας στο AWS Lambda πρέπει να κάνουμε μερικές τροποποιήσεις στην εφαρμογή μας:

  • Το AWS Lambda τοποθετεί στρώματα στον / opt κατάλογο στο δοχείο λάμδα, οπότε πρέπει να φορτώσουμε το plugin μας από αυτόν τον κατάλογο.
  • Πρέπει να δημιουργήσουμε μια λειτουργία χειριστή που θα χρησιμοποιηθεί από τον κινητήρα Lambda για να χειριστεί το δοκιμαστικό μας συμβάν.

Το ακόλουθο απόσπασμα περιέχει την εφαρμογή μας που έχει προσαρμοστεί για να χρησιμοποιηθεί από το Lambda:

Όπως μπορείτε να δείτε η εφαρμογή είναι πολύ παρόμοια με την προηγούμενη. Έχουμε αλλάξει μόνο τον κατάλογο από τον οποίο φορτώσαμε την προσθήκη μας και προσθέσαμε την απάντηση λειτουργίας αντί για την εκτύπωση των τιμών. Εάν θέλετε να μάθετε περισσότερα σχετικά με τη γραφή του Lambdas στο golang, παρακαλούμε να ελέγξετε την τεκμηρίωση του AWS.

AWS Lambda ανάπτυξη

Υπάρχουν δύο τρόποι ανάπτυξης των λειτουργιών και των στρώσεων του AWS Lambda. Μπορείτε να δημιουργήσετε και να μεταφορτώσετε το πακέτο ZIP με μη αυτόματο τρόπο ή να χρησιμοποιήσετε το πιο προηγμένο πλαίσιο, το οποίο καθιστά πολύ πιο εύκολη και ταχύτερη. Για τα περισσότερα από τα έργα μου, χρησιμοποιώ το πλαίσιο χωρίς διακομιστές, οπότε έχω ήδη προετοιμάσει το απλό αρχείο ρύθμισης serverless.yml χρησιμοποιώντας αυτό το εργαλείο:

υπηρεσία: cipherService
frameVersion: "> = 1.28.0 <2.0.0"
προμηθευτής:
  όνομα: aws
  runtime: go1.x
στρώματα:
  cipherLayer:
    διαδρομή: bin / plugin
    συμβατόRuntimes:
      - go1.x
λειτουργίες:
  κινητήρας:
    χειριστής: bin / cipherEngine
    πακέτο:
      αποκλείω:
        - ./**
      περιλαμβάνω:
        - ./bin/cipherEngine
    στρώματα:
      - {Αναφ .: CipherLayerLambdaLayer}

Στην ενότητα των στρώσεων ορίσαμε ένα μόνο στρώμα με τη διαδρομή προς το ήδη δημιουργημένο plugin - θα αναπτυχθεί μαζί με τη λειτουργία λάμδα. Μπορείτε να ορίσετε έως και 5 διαφορετικά επίπεδα, τα οποία η σειρά είναι πολύ σημαντική. Είναι τοποθετημένα στον ίδιο / opt κατάλογο, έτσι ώστε τα επίπεδα με τον υψηλότερο αριθμό να μπορούν να παρακάμπτουν τα αρχεία από τα προηγουμένως συναρμολογημένα επίπεδα. Για κάθε στρώμα, πρέπει να δώσετε τουλάχιστον 2 παραμέτρους: τη διαδρομή προς τον κατάλογο που περιέχει την προέλευση στρώματος (διαδρομή προς το δυαδικό δυαδικό αρχείο στην περίπτωσή σας) και τη λίστα συμβατών χρόνων εκτέλεσης.

Το επόμενο τμήμα λειτουργιών είναι ένα μέρος όπου ορίζετε τη λίστα των λειτουργιών που πρόκειται να αναπτυχθούν. Για κάθε λειτουργία, πρέπει να παρέχετε τουλάχιστον τη διαδρομή προς τη σύνταξη της εφαρμογής. Επιπλέον, για αυτό, πρέπει να ορίσουμε την παράμετρο των επιπέδων με αναφορά στο επίπεδο που ορίζεται παραπάνω. Αυτό θα επισυνάψει αυτόματα το στρώμα στη λειτουργία Lambda κατά τη διάρκεια της ανάπτυξης. Το αστείο είναι ότι πρέπει να μετατρέψετε το όνομα του στρώματος lambda σε TitleCased και να προσθέσετε το επίθημα LambdaLayer εάν θέλετε να ανατρέξετε σε αυτόν τον πόρο. Φαίνεται ότι η ομάδα χωρίς διακομιστές την εφάρμοσε με αυτόν τον τρόπο για να λύσει τη σύγκρουση με αναφορά στα διαφορετικά είδη πόρων.

Μόλις το αρχείο ρύθμισης serverless.yml είναι έτοιμο, το τελευταίο πράγμα που πρέπει να κάνετε είναι να μεταγλωττίσετε την εφαρμογή, το plugin και να το αναπτύξετε. Μπορούμε να χρησιμοποιήσουμε απλό Makefile για αυτό:

.PHONE: οικοδομήσουμε buildPlugin καθαρή ανάπτυξη
χτίζω:
 αποφύγετε -v
 env GOOS = Linux πηγαίνει build -ldflags = "- s -w" -o bin / cipherΚίνηση 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
αναπτύξτε: clean buildPlugin build
 sls αναπτύξει - verbose

Μπορείτε να δημιουργήσετε και να αναπτύξετε τη λειτουργία σας εκτελώντας την ακόλουθη εντολή:

να αναπτύξουν

Δοκιμάστε το AWS Lambda

Όπως ανέφερα προηγουμένως, η AWS Lambda εκτελεί κώδικα στην απάντηση στο συμβάν. Ωστόσο, δεν ρυθμίσαμε τυχόν εκκινήσεις συμβάντων, επομένως δεν θα τους ζητηθεί χωρίς τη βοήθειά μας. Πρέπει να το κάνουμε χειροκίνητα χρησιμοποιώντας το πλαίσιο Serverless ή το εργαλείο awscli:

sls invoke -f όνομα_λειτουργίας
aws lambda invoke - συνάρτηση-όνομα όνομα_λειτουργίας output_file

Στην απάντηση, θα πρέπει να δείτε την ίδια έξοδο όπως προηγουμένως, πράγμα που αποδεικνύει ότι η λάμδα λειτουργία μας λειτουργεί σωστά και φορτώνει το plugin από το πρόσθετο στρώμα. Τώρα μπορείτε να δημιουργήσετε άλλες λειτουργίες που θα χρησιμοποιούν το ίδιο στρώμα ή ακόμα και να το μοιράζεστε με άλλους λογαριασμούς AWS.

Περίληψη

Ήταν πολύ διασκεδαστικό να χρησιμοποιήσετε τις μονάδες Golang και δοκιμάστε πώς να τις ενσωματώσετε με τα πρόσφατα κυκλοφορούντα Lambda Layers του AWS. Plugin βιβλιοθήκη είναι πραγματικά φοβερό, ωστόσο, λόγω των περιορισμών της και τις προδιαγραφές Golang μπορεί να χρησιμοποιηθεί μόνο σε ορισμένα ειδικά σενάρια. Νομίζω ότι για τους περισσότερους προγραμματιστές που εργάζονται στα τυποποιημένα έργα δεν θα χρειαστεί ή ακόμα και είναι δυνατόν να χρησιμοποιηθούν plugins. Μόνο δύο λόγοι έρχονται στο μυαλό μου:

  • Εφαρμογή περίπλοκων αλγορίθμων που μπορούν να χρησιμοποιηθούν από άλλες εφαρμογές π.χ. κωδικοποίηση βίντεο ή αλγόριθμοι κρυπτογράφησης.
  • Κοινή χρήση του αλγορίθμου σας με άλλους χωρίς να δημοσιεύσετε τον κώδικα του.