Κατά τη δημιουργία εφαρμογών ιστού, υπάρχουν πολλές επιλογές που μπορούν είτε να βοηθήσουν είτε να εμποδίσουν την εφαρμογή σας στο μέλλον μόλις δεσμευτείτε σε αυτές. Οι επιλογές όπως η γλώσσα, το πλαίσιο, η φιλοξενία και η βάση δεδομένων είναι ζωτικής σημασίας.
Μία τέτοια επιλογή είναι αν θα δημιουργήσετε μια εφαρμογή που βασίζεται σε υπηρεσίες χρησιμοποιώντας το Service Oriented Architecture (SOA) ή μια παραδοσιακή, μονολιθική εφαρμογή. Αυτή είναι μια κοινή αρχιτεκτονική απόφαση που επηρεάζει τις νεοσύστατες επιχειρήσεις, τις κλίμακες και τις εταιρικές εταιρείες.
Το Service Oriented Architecture χρησιμοποιείται από μεγάλο αριθμό γνωστών μονόκερων και κορυφαίων τεχνολογιών όπως το Google, το Facebook, το Twitter, το Instagram και το Uber. Φαίνεται ότι αυτό το σχέδιο αρχιτεκτονικής λειτουργεί για μεγάλες εταιρείες, αλλά μπορεί να λειτουργήσει για εσάς;
Σε αυτό το άρθρο θα παρουσιάσουμε το θέμα της αρχιτεκτονικής προσανατολισμένης στην υπηρεσία και πώς το AWS Lambda σε συνδυασμό με την Python μπορεί να αξιοποιηθεί για την εύκολη κατασκευή κλιμακούμενων, οικονομικά αποδοτικών υπηρεσιών. Για να δείξουμε αυτές τις ιδέες, θα δημιουργήσουμε μια απλή υπηρεσία μεταφόρτωσης και αλλαγής μεγέθους εικόνας χρησιμοποιώντας Python, AWS Lambda, Amazon S3 και μερικά άλλα σχετικά εργαλεία και υπηρεσίες.
Το Service Oriented Architecture (SOA) δεν είναι καινούργιο, έχοντας ρίζες από αρκετές δεκαετίες πριν. Τα τελευταία χρόνια η δημοτικότητά του ως μοτίβου αυξάνεται λόγω του ότι προσφέρει πολλά οφέλη για εφαρμογές που βλέπουν στον Ιστό.
Το SOA είναι, στην ουσία, η αφαίρεση μιας μεγάλης εφαρμογής σε πολλές μικρότερες εφαρμογές που επικοινωνούν. Αυτό ακολουθεί πολλές βέλτιστες πρακτικές της μηχανικής λογισμικού, όπως η αποσύνδεση, ο διαχωρισμός των ανησυχιών και η αρχιτεκτονική μιας ευθύνης.
Οι υλοποιήσεις του SOA ποικίλλουν ως προς την ευκρίνεια: από πολύ λίγες υπηρεσίες που καλύπτουν μεγάλους τομείς λειτουργικότητας έως πολλές δεκάδες ή εκατοντάδες μικρές εφαρμογές σε αυτό που ονομάζεται « μικροϋπηρεσία Αρχιτεκτονική. Ανεξάρτητα από το επίπεδο ευαισθησίας, αυτό που γενικά συμφωνείται μεταξύ των επαγγελματιών του SOA είναι ότι σε καμία περίπτωση δεν είναι δωρεάν γεύμα. Όπως πολλές καλές πρακτικές στη μηχανική λογισμικού, είναι μια επένδυση που θα απαιτήσει επιπλέον σχεδιασμό, ανάπτυξη και δοκιμή.
Το AWS Lambda είναι μια υπηρεσία που προσφέρεται από το Υπηρεσίες Web Amazon πλατφόρμα. Το AWS Lambda σάς επιτρέπει να ανεβάζετε κώδικα που θα εκτελείται σε κοντέινερ κατά παραγγελία που διαχειρίζεται η Amazon. Το AWS Lambda θα διαχειρίζεται την παροχή και τη διαχείριση διακομιστών για την εκτέλεση του κώδικα, οπότε το μόνο που χρειάζεται από τον χρήστη είναι ένα πακέτο σετ κώδικα για εκτέλεση και μερικές επιλογές διαμόρφωσης για τον καθορισμό του πλαισίου στο οποίο εκτελείται ο διακομιστής. Αυτές οι διαχειριζόμενες εφαρμογές αναφέρονται ως λειτουργίες Lambda.
Το AWS Lambda έχει δύο βασικούς τρόπους λειτουργίας:
Ασύγχρονο / βάσει συμβάντων:
Οι λειτουργίες Lambda μπορούν να εκτελεστούν ως απόκριση σε ένα συμβάν σε ασύγχρονη λειτουργία. Οποιαδήποτε πηγή συμβάντων, όπως S3, SNS κ.λπ. δεν θα μπλοκάρει και οι λειτουργίες Lambda μπορούν να το εκμεταλλευτούν με πολλούς τρόπους, όπως η δημιουργία ενός αγωγού επεξεργασίας για κάποια αλυσίδα συμβάντων. Υπάρχουν πολλές πηγές πληροφοριών, και ανάλογα με την πηγή τα συμβάντα θα προωθηθούν σε μια λειτουργία Lambda από την πηγή του συμβάντος, ή θα ερωτηθούν για εκδηλώσεις από το AWS Lambda.
Σύγχρονη / Αίτημα-> Απάντηση:
Για εφαρμογές που απαιτούν μια απόκριση που πρέπει να επιστραφεί ταυτόχρονα, το Lambda μπορεί να εκτελεστεί σε συγχρονισμένη λειτουργία. Συνήθως, αυτό χρησιμοποιείται σε συνδυασμό με μια υπηρεσία που ονομάζεται API Gateway για την επιστροφή HTTP αποκρίσεων από το AWS Lambda σε έναν τελικό χρήστη, ωστόσο οι λειτουργίες Lambda μπορούν επίσης να κληθούν συγχρονισμένα μέσω μιας απευθείας κλήσης στο AWS Lambda.
Οι συναρτήσεις AWS Lambda μεταφορτώνονται ως αρχείο zip που περιέχει κώδικα χειριστή εκτός από τυχόν εξαρτήσεις που απαιτούνται για τη λειτουργία του χειριστή. Μετά τη μεταφόρτωση, το AWS Lambda θα εκτελέσει αυτόν τον κωδικό όταν χρειάζεται και θα κλιμακώσει τον αριθμό των διακομιστών από μηδέν σε χιλιάδες όταν απαιτείται, χωρίς επιπλέον επέμβαση που απαιτείται από τον καταναλωτή.
Το βασικό SOA είναι ένας τρόπος δομής της βάσης κώδικα σε μικρές εφαρμογές, προκειμένου να ωφεληθεί μια εφαρμογή με τους τρόπους που περιγράφονται παραπάνω σε αυτό το άρθρο. Από αυτό προκύπτει η μέθοδος επικοινωνίας μεταξύ αυτών των εφαρμογών. Το SOA που βασίζεται σε εκδηλώσεις (γνωστό και ως SOA 2.0) επιτρέπει όχι μόνο την παραδοσιακή άμεση επικοινωνία από υπηρεσία προς υπηρεσία του SOA 1.0, αλλά και για εκδηλώσεις που πρέπει να διαδίδονται σε όλη την αρχιτεκτονική προκειμένου να επικοινωνούν οι αλλαγές.
Η αρχιτεκτονική βάσει εκδηλώσεων είναι ένα μοτίβο που προωθεί φυσικά τη χαλαρή σύζευξη και τη συνθεσιμότητα. Δημιουργώντας και αντιδρώντας σε εκδηλώσεις, οι υπηρεσίες μπορούν να προστεθούν ad-hoc για να προσθέσουν νέα λειτουργικότητα σε ένα υπάρχον συμβάν και πολλά συμβάντα μπορούν να συντεθούν για να παρέχουν πιο πλούσια λειτουργικότητα.
Το AWS Lambda μπορεί να χρησιμοποιηθεί ως πλατφόρμα για την εύκολη κατασκευή εφαρμογών SOA 2.0. Υπάρχουν πολλοί τρόποι για να ενεργοποιήσετε μια λειτουργία Lambda. από την παραδοσιακή προσέγγιση μηνυμάτων-ουρών με το Amazon SNS, έως τις εκδηλώσεις που δημιουργούνται από ένα αρχείο που μεταφορτώνεται στο Amazon S3 ή από ένα μήνυμα ηλεκτρονικού ταχυδρομείου που αποστέλλεται με το Amazon SES.
Θα οικοδομήσουμε μια απλή εφαρμογή για τη μεταφόρτωση και ανάκτηση εικόνων χρησιμοποιώντας τη στοίβα AWS. Αυτό το παράδειγμα έργου θα περιλαμβάνει δύο λειτουργίες λάμδα: μία που εκτελείται σε λειτουργία απόκρισης request-> που θα χρησιμοποιηθεί για την εξυπηρέτηση του απλού frontend μας στο διαδίκτυο και μια άλλη που θα ανιχνεύει τις μεταφορτωμένες εικόνες και θα τις αλλάζει.
Η πρώτη λειτουργία λάμδα θα εκτελείται ασύγχρονα σε απάντηση σε ένα συμβάν μεταφόρτωσης αρχείων που ενεργοποιείται στον κάδο S3 που θα φιλοξενεί τις μεταφορτωμένες εικόνες. Θα λάβει την παρεχόμενη εικόνα και θα αλλάξει το μέγεθός της ώστε να χωράει σε μια εικόνα 400x400.
Η άλλη λειτουργία lambda θα εξυπηρετεί τη σελίδα HTML, παρέχοντας τόσο τη λειτουργικότητα για έναν χρήστη να βλέπει τις εικόνες που αλλάζουν το μέγεθος από την άλλη λειτουργία Lambda όσο και μια διεπαφή για τη μεταφόρτωση μιας εικόνας.
Πριν ξεκινήσουμε, θα χρειαστεί να διαμορφώσουμε ορισμένες απαραίτητες υπηρεσίες AWS όπως το IAM και το S3. Αυτά θα διαμορφωθούν χρησιμοποιώντας την κονσόλα AWS που βασίζεται στον Ιστό. Ωστόσο, το μεγαλύτερο μέρος της διαμόρφωσης μπορεί επίσης να επιτευχθεί χρησιμοποιώντας το βοηθητικό πρόγραμμα γραμμής εντολών AWS, το οποίο θα χρησιμοποιήσουμε αργότερα.
Το S3 (ή Simple Storage Service) είναι μια υπηρεσία αντικειμένων Amazon που προσφέρει αξιόπιστη και οικονομικά αποδοτική αποθήκευση οποιωνδήποτε δεδομένων. Θα χρησιμοποιούμε το S3 για την αποθήκευση των εικόνων που θα μεταφορτωθούν, καθώς και των αλλαγών μεγέθους των εικόνων που έχουμε επεξεργαστεί.
Η υπηρεσία S3 βρίσκεται στο αναπτυσσόμενο μενού 'Υπηρεσίες' στην κονσόλα AWS στην υποενότητα 'Αποθήκευση και παράδοση περιεχομένου'. Κατά τη δημιουργία ενός κάδου θα σας ζητηθεί να εισαγάγετε τόσο το όνομα του κάδου όσο και να επιλέξετε μια περιοχή. Η επιλογή μιας περιοχής κοντά στους χρήστες σας θα επιτρέψει στο S3 να βελτιστοποιηθεί για καθυστέρηση και κόστος, καθώς και ορισμένους ρυθμιστικούς παράγοντες. Για αυτό το παράδειγμα θα επιλέξουμε την περιοχή 'Standard US'. Αυτή η ίδια περιοχή θα χρησιμοποιηθεί αργότερα για τη φιλοξενία των λειτουργιών AWS Lambda.
Αξίζει να σημειωθεί ότι τα ονόματα κάδου S3 πρέπει να είναι μοναδικά, οπότε αν το όνομα που επιλέξατε θα πρέπει να επιλέξετε ένα νέο, μοναδικό όνομα.
Για αυτό το παράδειγμα έργου, θα δημιουργήσουμε δύο κάδους αποθήκευσης με την ονομασία 'test-upload' και 'test-sizeized'. Ο κάδος 'δοκιμαστική μεταφόρτωση' θα χρησιμοποιηθεί για τη μεταφόρτωση εικόνων και την αποθήκευση της μεταφορτωμένης εικόνας πριν από την επεξεργασία και το μέγεθός του. Μόλις αλλάξει το μέγεθός της, η εικόνα θα αποθηκευτεί στον κάδο 'αλλαγή μεγέθους δοκιμής' και θα αφαιρεθεί η ακατέργαστη μεταφορτωμένη εικόνα.
Από προεπιλογή, τα δικαιώματα S3 είναι περιοριστικά και δεν θα επιτρέπουν σε εξωτερικούς χρήστες ή ακόμα και σε μη διοικητικούς χρήστες να διαβάζουν, να γράφουν, να ενημερώνουν ή να διαγράφουν τυχόν δικαιώματα ή αντικείμενα στον κάδο. Για να το αλλάξουμε αυτό, θα πρέπει να συνδεθούμε ως χρήστης με τα δικαιώματα διαχείρισης των αδειών κάδου AWS.
Υποθέτοντας ότι βρισκόμαστε στην κονσόλα AWS, μπορούμε να δούμε τα δικαιώματα για τον κάδο μεταφόρτωσης επιλέγοντας τον κάδο με όνομα, κάνοντας κλικ στο κουμπί 'Ιδιότητες' στην επάνω δεξιά γωνία της οθόνης και ανοίγοντας την ενότητα 'Δικαιώματα' που έχει συμπτυχθεί.
Για να επιτρέψουμε στους ανώνυμους χρήστες να ανεβάζουν σε αυτόν τον κάδο, θα πρέπει να επεξεργαστούμε την πολιτική κάδου για να επιτρέψουμε τη συγκεκριμένη άδεια που επιτρέπει την αποστολή. Αυτό επιτυγχάνεται μέσω μιας πολιτικής διαμόρφωσης που βασίζεται σε JSON. Αυτού του είδους οι πολιτικές JSON χρησιμοποιούνται ευρέως σε όλο το AWS σε συνδυασμό με την υπηρεσία IAM. Κάνοντας κλικ στο κουμπί 'Επεξεργασία πολιτικής κάδου', απλώς επικολλήστε το ακόλουθο κείμενο και κάντε κλικ στην επιλογή 'Αποθήκευση' για να επιτρέψετε τις δημόσιες μεταφορτώσεις εικόνων:
{ 'Version': '2008-10-17', 'Id': 'Policy1346097257207', 'Statement': [ { 'Sid': 'Allow anonymous upload to /', 'Effect': 'Allow', 'Principal': { 'AWS': '*' }, 'Action': 's3:PutObject', 'Resource': 'arn:aws:s3:::test-upload/*' } ] }
Αφού το κάνουμε αυτό, μπορούμε να επαληθεύσουμε ότι η πολιτική κάδου είναι σωστή προσπαθώντας να ανεβάσετε μια εικόνα στον κάδο. Η ακόλουθη εντολή cURL θα κάνει το κόλπο:
curl https://test-upload.s3.amazonaws.com -F 'key=test.jpeg' -F ' [email protected] '
Εάν επιστραφεί μια απόκριση 200 σειρών, θα γνωρίζουμε ότι η διαμόρφωση για τον κάδο μεταφόρτωσης έχει εφαρμοστεί με επιτυχία. Οι κάδοι S3 πρέπει τώρα να είναι (κυρίως) διαμορφωμένοι. Θα επιστρέψουμε αργότερα σε αυτήν την υπηρεσία στην κονσόλα για να συνδέσουμε τα συμβάντα μεταφόρτωσης εικόνων με την επίκληση της λειτουργίας αλλαγής μεγέθους.
Όλοι οι ρόλοι Lambda εκτελούνται σε ένα πλαίσιο άδειας, στην περίπτωση αυτή ένας «ρόλος» που ορίζεται από την υπηρεσία IAM. Αυτός ο ρόλος καθορίζει οποιαδήποτε και όλα τα δικαιώματα που έχει η συνάρτηση Lambda κατά την επίκλησή της. Για τους σκοπούς αυτού του παραδείγματος έργου, θα δημιουργήσουμε έναν γενικό ρόλο που θα χρησιμοποιηθεί μεταξύ των δύο λειτουργιών Lambda. Ωστόσο, σε ένα σενάριο παραγωγής, συνιστάται λεπτομερής ανάλυση των ορισμών των αδειών για να διασφαλιστεί ότι τυχόν εκμεταλλεύσεις ασφαλείας είναι απομονωμένες μόνο στο πλαίσιο άδειας που ορίστηκε.
Η υπηρεσία IAM βρίσκεται στην υποενότητα 'Ασφάλεια και ταυτότητα' του αναπτυσσόμενου μενού 'Υπηρεσίες'. Η υπηρεσία IAM είναι ένα πολύ ισχυρό εργαλείο για τη διαχείριση της πρόσβασης σε υπηρεσίες AWS και η παρεχόμενη διεπαφή μπορεί να είναι λίγο υπερβολική στην αρχή, εάν δεν είστε εξοικειωμένοι με παρόμοια εργαλεία.
Μόλις μεταβείτε στη σελίδα του πίνακα ελέγχου IAM, μπορείτε να βρείτε την υποενότητα 'Ρόλοι' στην αριστερή πλευρά της σελίδας. Από εδώ μπορούμε να χρησιμοποιήσουμε το κουμπί 'Δημιουργία νέου ρόλου' για να δημιουργήσουμε έναν οδηγό πολλαπλών βημάτων για να καθορίσουμε τα δικαιώματα του ρόλου. Ας χρησιμοποιήσουμε το 'lambda_role' ως το όνομα της γενικής μας άδειας. Αφού συνεχίσετε από τη σελίδα ορισμού ονόματος, θα εμφανιστεί η επιλογή να επιλέξετε έναν τύπο ρόλου. Καθώς απαιτείται μόνο πρόσβαση S3, κάντε κλικ στο 'AWS Service Roles' και μέσα στο πλαίσιο επιλογής επιλέξτε 'AWS Lambda'. Θα εμφανιστεί μια σελίδα πολιτικών που μπορούν να επισυναφθούν σε αυτόν τον ρόλο. Επιλέξτε την πολιτική 'AmazonS3FullAccess' και συνεχίστε στο επόμενο βήμα για να επιβεβαιώσετε τον ρόλο που θα δημιουργηθεί.
οι αγοραστές είναι ιδιαίτερα ευαίσθητοι στις τιμές όταν
Είναι σημαντικό να σημειώσετε το όνομα και το ARN (Amazon Resource Name) του δημιουργημένου ρόλου. Αυτό θα χρησιμοποιηθεί κατά τη δημιουργία μιας νέας συνάρτησης Lambda για τον προσδιορισμό του ρόλου που πρόκειται να χρησιμοποιηθεί για την επίκληση της συνάρτησης.
Σημείωση: Το AWS Lambda θα καταγράφει αυτόματα όλη την έξοδο από προσκλήσεις σε λειτουργία στο AWS Cloudwatch, μια υπηρεσία καταγραφής. Εάν είναι επιθυμητή αυτή η λειτουργικότητα, η οποία συνιστάται για ένα περιβάλλον παραγωγής, πρέπει να προστεθεί άδεια εγγραφής σε μια ροή καταγραφής Cloudwatch στις πολιτικές για αυτόν τον ρόλο.
Τώρα είμαστε έτοιμοι να ξεκινήσουμε την κωδικοποίηση. Θα υποθέσουμε ότι σε αυτό το σημείο έχετε ρυθμίσει την εντολή 'awscli'. Εάν δεν το έχετε, μπορείτε να ακολουθήσετε τις οδηγίες στο https://aws.amazon.com/cli/ για να ρυθμίσετε το awscli στον υπολογιστή σας.
Σημείωση: ο κώδικας που χρησιμοποιείται σε αυτά τα παραδείγματα γίνεται μικρότερος για ευκολία στην προβολή της οθόνης. Για μια πιο ολοκληρωμένη έκδοση επισκεφθείτε το αποθετήριο στο https://github.com/gxx/aws-lambda-python/ .
Πρώτον, ας δημιουργήσουμε μια δομή σκελετού για το έργο μας.
aws-lambda-python/ - image_list/ - handler.py - list.html - Makefile - requirements.txt - image_resize/ - handler.py - resize.py - Makefile - requirements.txt - .pydistutils.cfg
Έχουμε δύο υποκαταλόγους στη δομή μας, έναν για καθεμία από τις λειτουργίες lambda. Σε καθένα από αυτά έχουμε τα κοινά αρχεία handler.py, Makefile και requirements.txt. Το αρχείο handler.py θα περιέχει τη μέθοδο κλήσης για επίκληση καθεμιάς από τις λειτουργίες lambda και μπορεί να θεωρηθεί το σημείο εισόδου για τις συναρτήσεις. Το αρχείο requirements.txt θα περιέχει μια λίστα με τις εξαρτήσεις μας, ώστε να μπορούμε εύκολα να καθορίσουμε και να ενημερώσουμε τις απαιτήσεις. Τέλος, η εντολή Makefile που θα χρησιμοποιήσουμε για να παρέχουμε έναν εύκολο μηχανισμό αλληλεπίδρασης με το awscli. Αυτό θα διευκολύνει τη διαδικασία δημιουργίας και ενημέρωσης της λειτουργίας lambda.
Θα παρατηρήσετε το αρχείο .pydistutils.cfg στη ρίζα του καταλόγου έργων μας. Αυτό το αρχείο απαιτείται εάν εργάζεστε με την Python στο Homebrew. Λόγω της μεθόδου ανάπτυξης μιας λειτουργίας Lambda (καλύπτεται στην ακόλουθη ενότητα) αυτό το αρχείο είναι απαραίτητο. Δείτε το αποθετήριο για περισσότερες λεπτομέρειες.
Ξεκινώντας με τη λειτουργία resize_image, θα παγώσουμε την εξάρτηση Wand, τη βιβλιοθήκη επεξεργασίας εικόνων, αποθηκεύοντας Wand==0.4.2
στις απαιτήσεις.txt. Αυτή θα είναι η μόνη εξάρτηση για τη λειτουργία image_resize lambda. Η συνάρτηση resize_image στο resize.py θα πρέπει να χειριστεί έναν πόρο εικόνας από τη βιβλιοθήκη Wand και να αλλάξει το μέγεθός του σύμφωνα με τις καθορισμένες παραμέτρους πλάτους και ύψους. Προκειμένου να διατηρηθεί η εικόνα που αλλάζει το μέγεθός της, θα χρησιμοποιήσουμε έναν αλγόριθμο αλλαγής μεγέθους 'βέλτιστης προσαρμογής' που θα διατηρήσει την αναλογία εικόνας της αρχικής εικόνας, μειώνοντας παράλληλα το μέγεθος της εικόνας ώστε να χωράει στο καθορισμένο πλάτος και ύψος.
def resize_image(image, resize_width, resize_height): ... original_ratio = image.width / float(image.height) resize_ratio = resize_width / float(resize_height) # We stick to the original ratio here, regardless of what the resize ratio is if original_ratio > resize_ratio: # If width is larger, we base the resize height as a function of the ratio of the width resize_height = int(round(resize_width / original_ratio)) else: # Otherwise, we base the width as a function of the ratio of the height resize_width = int(round(resize_height * original_ratio)) if ((image.width - resize_width) + (image.height - resize_height)) <0: filter_name = 'mitchell' else: filter_name = 'lanczos2' image.resize(width=resize_width, height=resize_height, filter=filter_name, blur=1) return image
Με αυτόν τον τρόπο, απαιτείται μια λειτουργία χειριστή για την αποδοχή του συμβάντος που δημιουργείται από μια εικόνα που ανέβηκε S3, παραδώστε την στο resize_image
λειτουργία, και να αποθηκεύσετε την εικόνα μεγέθους που προκύπτει.
from __future__ import print_function import boto3 from wand.image import Image from resize import resize_image def handle_resize(event, context): # Obtain the bucket name and key for the event bucket_name = event['Records'][0]['s3']['bucket']['name'] key_path = event['Records'][0]['s3']['object']['key'] response = boto3.resource('s3').Object(bucket_name, key_path).get() # Retrieve the S3 Object # Perform the resize operation with Image(blob=response['Body'].read()) as image: resized_data = resize_image(image, 400, 400).make_blob() # And finally, upload to the resize bucket the new image s3_connection.Object('test-resized', key_path).put(ACL='public-read', Body=resized_data) # Finally remove, as the bucket is public and we don't want just anyone dumping the list of our files! s3_object.delete()
Με τον κωδικό πλήρες, θα πρέπει να μεταφορτωθεί στο Amazon Lambda ως νέα λειτουργία Lambda. Αυτό είναι όπου το Makefile που έχει προστεθεί στη δομή καταλόγου μπαίνει στο παιχνίδι. Αυτό το Makefile θα χρησιμοποιηθεί για την ανάπτυξη των ορισμών της συνάρτησης Lambda που δημιουργούμε.
ROLE_ARN = arn:aws:iam::601885388019:role/lambda_role FUNCTION_NAME = ResizeImage REGION = us-west-1 TIMEOUT = 15 MEMORY_SIZE = 512 ZIPFILE_NAME = image_resize.zip HANDLER = handler.handle_resize clean_pyc : find . | grep .pyc$ | xargs rm install_deps : pip install -r requirements.txt -t . build : install_deps clean_pyc zip $(ZIPFILE_NAME) -r * create : build aws lambda create-function --region $(REGION) --function-name $(FUNCTION_NAME) --zip-file fileb://$(ZIPFILE_NAME) --role $(ROLE_ARN) --handler $(HANDLER) --runtime python2.7 --timeout $(TIMEOUT) --memory-size $(MEMORY_SIZE) update : build aws lambda update-function-code --region $(REGION) --function-name $(FUNCTION_NAME) --zip-file fileb://$(ZIPFILE_NAME) --publish
Οι κύριες λειτουργίες αυτού του Makefile είναι «δημιουργία» και «ενημέρωση». Αυτές οι λειτουργίες συσκευάζουν πρώτα τον τρέχοντα κατάλογο, ο οποίος αντιπροσωπεύει όλους τους απαραίτητους κωδικούς για την εκτέλεση της λειτουργίας Lambda. Στη συνέχεια, τυχόν εξαρτήσεις που καθορίζονται στο requirements.txt
Το αρχείο θα εγκατασταθεί στον τρέχοντα υποκατάλογο που θα συσκευαστεί. Το βήμα συσκευασίας κλείνει τα περιεχόμενα του καταλόγου για μεταφόρτωση αργότερα με την εντολή 'awscli'. Το Makefile μας μπορεί να προσαρμοστεί για χρήση στον άλλο ορισμό της λειτουργίας Lambda.
Στο βοηθητικό πρόγραμμα Makefile, ορίζουμε μερικές μεταβλητές που είναι απαραίτητες για τη δημιουργία / ενημέρωση της εικόνας μας. Διαμορφώστε τις όπως είναι απαραίτητο για να λειτουργούν σωστά οι εντολές Makefile για εσάς.
ROLE_ARN
: Αυτό είναι το όνομα πόρου του Αμαζονίου που προσδιορίζει τον ρόλο μας βάσει του οποίου θα εκτελέσουμε τη λειτουργία Lambda.FUNCTION_NAME
: Το όνομα της συνάρτησης Lambda που δημιουργούμε / ενημερώνουμε.REGION
: Η περιοχή στην οποία θα δημιουργηθεί / ενημερωθεί η συνάρτηση Lambda.TIMEOUT
: Χρονικό όριο σε δευτερόλεπτα πριν από την επίκληση μιας λάμδα.MEMORY_SIZE
: Μέγεθος μνήμης σε megabyte στα οποία θα έχει πρόσβαση η συνάρτηση Lambda όταν καλείται.ZIPFILE_NAME
: Το όνομα του πακέτου με φερμουάρ που περιέχει τον κωδικό λειτουργίας και τις εξαρτήσεις Lambda.HANDLER
: Η απόλυτη διαδρομή εισαγωγής, σε τελείες, της συνάρτησης χειριστή.Μόλις διαμορφωθεί, εκτελέστε το make create
Η εντολή θα δημιουργήσει κάτι παρόμοιο με την ακόλουθη έξοδο:
$ make create pip install -r requirements.txt -t . ... find . | grep .pyc| xargs rm zip image_resize.zip -r * ... aws lambda create-function --region ap-northeast-1 --function-name ResizeImage2 --zip-file fileb://image_resize.zip --role arn:aws:iam::11111111111:role/lambda_role --handler handler.handle_resize --runtime python2.7 --timeout 15 --memory-size 512 { 'CodeSha256': 'doB1hsujmZnxZHidnLKP3XG2ifHM3jteLEBvsK1G2nasKSo=', 'FunctionName': 'ResizeImage', 'CodeSize': 155578, 'MemorySize': 512, 'FunctionArn': 'arn:aws:lambda:us-west-1:11111111111:function:ResizeImage', 'Version': '$LATEST', 'Role': 'arn:aws:iam::11111111111:role/lambda_role', 'Timeout': 15, 'LastModified': '2016-01-10T11:11:11.000+0000', 'Handler': 'handler.handle_resize', 'Runtime': 'python2.7', 'Description': '' }
Μετά την εκτέλεση της εντολής δημιουργίας, η λειτουργία αλλαγής μεγέθους για τις εικόνες μας είναι διαθέσιμη για χρήση, ωστόσο δεν έχει συνδεθεί με τον κάδο S3 για τη λήψη συμβάντων. Μπορούμε ακόμα να δοκιμάσουμε τη λειτουργία μέσω της κονσόλας AWS για να επιβεβαιώσουμε ότι η λειτουργία χειρίζεται σωστά τα συμβάντα μεταφόρτωσης αρχείων S3. Στον πίνακα ελέγχου AWS Lambda, που βρίσκεται στην υποενότητα 'Compute' του αναπτυσσόμενου μενού 'Services', επιλέξτε το όνομα της συνάρτησης που έχουμε δημιουργήσει. Αυτή η σελίδα λεπτομερειών λειτουργίας Lambda παρέχει ένα αναπτυσσόμενο μενού με τίτλο 'Ενέργειες' που περιέχει μια επιλογή με την ένδειξη 'Διαμόρφωση συμβάντος δοκιμής'.
Κάνοντας κλικ σε αυτό θα ανοίξει ένας τρόπος που σας επιτρέπει να καθορίσετε ένα συμβάν δοκιμής και ορισμένα πρότυπα πρότυπα. Επιλέξτε το παράδειγμα 'S3 Put' και αντικαταστήστε τυχόν αναφορές ενός ονόματος κάδου με το όνομα του κάδου που έχει ρυθμιστεί. Μόλις διαμορφωθεί, η επόμενη χρήση του κουμπιού 'Δοκιμή' στη σελίδα της συνάρτησης Lambda θα επικαλεστεί τη συνάρτηση Lambda σαν να είχε συμβεί το συμβάν που είχε ήδη διαμορφωθεί.
Για να παρακολουθείτε τυχόν ίχνη στοίβας σφαλμάτων ή μηνύματα καταγραφής, μπορείτε να δείτε τη ροή καταγραφής στο Cloudwatch. Θα δημιουργηθεί μια νέα ομάδα καταγραφής ταυτόχρονα με τη λειτουργία Lambda. Αυτές οι ροές καταγραφής είναι χρήσιμες και μπορούν να διοχετευτούν σε άλλες υπηρεσίες.
Πίσω στον πίνακα ελέγχου S3, αναπτύξτε την ενότητα «Εκδηλώσεις» που έχει καταρρεύσει που βρίσκεται στο μενού «Ιδιότητες» για να εμφανιστεί η φόρμα «Ειδοποιήσεις συμβάντων». Τα υποχρεωτικά πεδία που πρέπει να συμπληρώσουμε είναι τα στοιχεία 'Εκδηλώσεις' και 'Αποστολή σε'. Από το 'Events', επιλέξτε το συμβάν 'Object Created (All)'. Αυτό θα επιτρέψει την παρακολούθηση όλων των συμβάντων που δημιουργούν ένα αντικείμενο στον κάδο μεταφόρτωσης. Για την είσοδο 'Αποστολή σε', επιλέξτε το κουμπί επιλογής 'Λειτουργία Lambda'. Θα εμφανιστεί μια νέα ενότητα με ένα αναπτυσσόμενο μενού που περιέχει τη λειτουργία λάμδα 'ResizeImage' που έχουμε διαμορφώσει ως επιλογή. Κάνοντας κλικ στο 'Αποθήκευση', τυχόν συμβάντα 'Δημιουργήθηκε αντικείμενο' θα δρομολογηθούν ως είσοδος στην επίκληση της συνάρτησης 'ResizeImage' Lambda.
Έχουμε τώρα τη βασική λειτουργικότητα της εφαρμογής. Ας εκτελέσουμε μια άλλη δοκιμή cURL για να διασφαλίσουμε ότι όλα λειτουργούν όπως αναμενόταν. Χρησιμοποιήστε το cURL για να ανεβάσετε μια εικόνα στον κάδο S3 και ελέγξτε με μη αυτόματο τρόπο ότι η εικόνα έχει μεταφορτωθεί στον κάδο αλλαγής μεγέθους.
curl https://test-upload.s3.amazonaws.com -F 'key=test.jpeg' -F ' [email protected] '
Κατά την εκτέλεση αυτής της εντολής, η αλλαγή μεγέθους εικόνας θα πρέπει να δημιουργηθεί στον κάδο 'test-resized' μετά από 50-1000ms ανάλογα με το αν η λειτουργία Lambda είχε ήδη 'προθερμανθεί'.
Η συνάρτηση ListImage Lambda θα ανακτήσει μια λίστα με εικόνες μεγέθους και θα τις εμφανίσει σε μια σελίδα HTML για τον χρήστη. Αυτή η σελίδα HTML παρέχει επίσης τη δυνατότητα στον χρήστη να ανεβάζει δικές του εικόνες. Το Jinja2 χρησιμοποιείται στη συνάρτηση για την απόδοση HTML από έναν ορισμό προτύπου. Όπως και πριν, αυτές οι απαιτήσεις καθορίζονται στο requirements.txt
αρχείο.
from __future__ import print_function import os import boto3 from jinja2 import Environment from jinja2 import FileSystemLoader def _render_template(image_urls): env = Environment(loader=FileSystemLoader(os.path.abspath(os.path.dirname(__file__)))) template = env.get_template('list.html') rendered_template = template.render(image_urls=image_urls) return rendered_template def handle_list_image(event, context): bucket = boto3.resource('s3').Bucket('test-resized') image_summaries = sorted((image_summary for image_summary in bucket.objects.all()), key=lambda o: o.last_modified) image_urls = [] for summary in image_summaries: image_urls.append( boto3.client('s3').generate_presigned_url( 'get_object', Params={ 'Bucket': summary.bucket_name, 'Key': summary.key } ) ) return {'htmlContent': _render_template(image_urls)}
List Images var uploadImage = (function () { var inProgress = false; return function () { if (inProgress) { return; } inProgress = true; var formData = new FormData(); var fileData = $('#image-file').prop('files')[0]; formData.append('key', parseInt(Math.random() * 1000000)); formData.append('acl', 'public-read'); formData.append('file', fileData); $.ajax({ url: 'https://test-upload.s3.amazonaws.com/', type: 'POST', data: formData, processData: false, contentType: false, success: function (data) { window.location.reload(); } }); } })(); .image__container { float: left; width: 30%; margin-left: 2.5%; margin-right: 2.5%; max-width: 400px; } {% for image_url in image_urls %} {% endfor %}
Για άλλη μια φορά, μπορούμε να αλλάξουμε το προηγούμενο Makefile και να χρησιμοποιήσουμε την εντολή create για να αναπτύξουμε τη λειτουργία lambda.
Η λειτουργία ImageList Lambda είναι πλήρης, ωστόσο δεν μπορεί να σερβιριστεί σε κανέναν χρήστη. Αυτό συμβαίνει επειδή οι λειτουργίες Lambda μπορούν να κληθούν μόνο είτε ως απόκριση σε ένα συμβάν από άλλη υπηρεσία, είτε μέσω προγραμματισμού. Εδώ βρίσκεται η υπηρεσία Amazon AWS API Gateway. Το API Gateway βρίσκεται στην υποενότητα «Υπηρεσίες εφαρμογών».
Το API Gateway είναι ένας τρόπος μοντελοποίησης τελικών σημείων ως σύνολο πόρων και μεθόδων, ουσιαστικά REST interface. Εκτός από την παροχή μιας δυνατότητας επικύρωσης και μετατροπής αιτημάτων, το API Gateway εκτελεί άλλες λειτουργίες, όπως η παροχή αιτημάτων περιορισμού / περιορισμού του ρυθμού.
Από τον πίνακα ελέγχου API Gateway, δημιουργήστε ένα νέο API για την προβολή της λειτουργίας ListImage. Το όνομα και η περιγραφή μπορούν να ρυθμιστούν στις προτιμήσεις σας. Μόλις δημιουργηθεί, κάντε κλικ στο όνομα του νέου API για πρόσβαση στις λεπτομέρειες του API. Δημιουργήστε έναν νέο πόρο για το ριζικό URL '/'. Αυτή η διεύθυνση URL θα χρησιμοποιηθεί για την προβολή της σελίδας HTML.
Κατά την προβολή λεπτομερειών για τη σελίδα των πόρων ρίζας, προσθέστε μια μέθοδο GET. Ορίστε το 'Τύπος ολοκλήρωσης' σε 'Λειτουργία Lambda', ορίστε το 'Περιοχή Lambda' σε 'us-west-1' ή την επιλεγμένη περιοχή σας και πληκτρολογήστε το όνομα της συνάρτησης ListImage Lambda.
Προτού μπορέσουμε να αρχίσουμε να χαρτογραφούμε την απόκρισή μας σε μια έξοδο HTML, πρέπει να ορίσουμε ένα «μοντέλο» που θα καθορίζει ένα σχήμα για την απόκριση από το διακομιστή εκτός από τη χαρτογράφηση αυτής της απόκρισης σε έναν τύπο περιεχομένου. Επιλέξτε την ενότητα 'Μοντέλα' για το API και κάντε κλικ στο 'Δημιουργία' για να δημιουργήσετε ένα νέο μοντέλο. Δώστε στο μοντέλο το όνομα 'HTML', με έναν τύπο περιεχομένου 'text / html' και ορίστε το σχήμα ως εξής:
{ '$schema': 'http://json-schema.org/draft-04/schema#', 'title' : 'HTML', 'type' : 'object' }
Πίσω στον πίνακα ελέγχου API, επιλέξτε τον πόρο που έχουμε δημιουργήσει και μεταβείτε στην ενότητα 'Απόκριση ολοκλήρωσης'. Αυτή η ενότητα ορίζει οποιονδήποτε μετασχηματισμό σε διαδικασία μετά τη λήψη μιας απόκρισης από τη λειτουργία Lambda πριν διοχετεύσει την απόκριση στο τελικό βήμα.
Ανοίξτε την ενότητα 'Πρότυπα χαρτογράφησης' και προσθέστε ένα νέο 'Τύπος περιεχομένου' του 'κειμένου / html'. Καταργήστε την παλιά 'Τύπος περιεχομένου' ταυτόχρονα. Στα δεξιά, αλλάξτε το αναπτυσσόμενο μενού από 'Διαδρομή εξόδου' σε 'Πρότυπο χαρτογράφησης'. Αυτό θα μας επιτρέψει να αλλάξουμε το μη επεξεργασμένο JSON που έγινε αποδεκτό από το API Gateway και να χρησιμοποιήσουμε το περιεχόμενο HTML μέσα στην ιδιότητα 'htmlContent' των επιστρεφόμενων δεδομένων. Για το πρότυπο αντιστοίχισης, ορίστε το '$ input.htmlContent' ως πρότυπο. Τέλος, αλλάξτε την ενότητα 'Μέθοδος απόκρισης' αφαιρώντας το 'application / json' από το 'Response Models for 200' και προσθέτοντας το 'text / html'.
Επιστρέφοντας στον πίνακα ελέγχου για το API, υπάρχει ένα κουμπί στην επάνω αριστερή γωνία της σελίδας με την ένδειξη 'Ανάπτυξη API'. Κάντε κλικ σε αυτό το κουμπί για να ενημερώσετε ή να δημιουργήσετε το API με τους καθορισμένους πόρους, μεθόδους, μοντέλα και αντιστοιχίσεις. Μόλις γίνει αυτό, θα εμφανιστεί μια διεύθυνση URL για το στάδιο ανάπτυξης που επιλέχθηκε (στάδια από προεπιλογή). Τέλος, το παράδειγμα είναι πλήρες! Μπορείτε να ανεβάσετε μερικά αρχεία για να δοκιμάσετε και να προβάλετε τις εικόνες με το μέγεθος.
Το AWS είναι μια μεγάλη υπηρεσία και δεν πρόκειται να αποσυρθεί σύντομα. Παρόλο που το κλείδωμα προμηθευτή είναι πάντα κάτι που πρέπει να προσέχετε, το AWS Lambda προσφέρει μια σχετικά λεπτή υπηρεσία με ένα πλούσιο σύνολο βοηθητικών ρυθμίσεων διαμόρφωσης. Η αξιοποίηση των υπηρεσιών που παρέχει η AWS για την εφαρμογή εύκολα επεκτάσιμων και διατηρήσιμων εφαρμογών θα προσφέρει το μεγαλύτερο όφελος από τη χρήση της πλατφόρμας AWS. Το AWS Lambda παρέχει μια κομψή, επεκτάσιμη και οικονομική λύση που υποστηρίζεται από μια πλατφόρμα εταιρικού επιπέδου που χρησιμοποιείται από έναν πολύ μεγάλο αριθμό καταναλωτών. Πιστεύω ότι οι εφαρμογές χωρίς διακομιστές είναι ο τρόπος του μέλλοντος. Πείτε μας τη γνώμη σας στα παρακάτω σχόλια.