Σε αυτό το σεμινάριο, θα ήθελα να σας δείξω πώς να αναπτύξετε ένα δείγμα εφαρμογής Rails χρησιμοποιώντας το Amazon Elastic Container Service (ECS).
Ας το δημιουργήσουμε εκτελώντας την εντολή rails new sample-rails-app, και στη συνέχεια δημιουργώντας μια βασική δράση ελεγκτή ράγες g ελεγκτής ευπρόσδεκτος δείκτης και ορίζοντας διαδρομές στη διαδρομή root ως `root to: welcome#index".
Στόχος μας είναι να δούμε αυτή τη σελίδα καλωσορίσματος να αναπτύσσεται με τη χρήση του ECS.
Δημιουργήστε ένα αποθετήριο με το Amazon Elastic Container Registry (ECR)
Amazon ECR είναι ένα μητρώο εμπορευματοκιβωτίων. Θα το χρησιμοποιήσουμε για να αποθηκεύσουμε τις εικόνες της εφαρμογής μας και να τις αντλήσουμε από αυτό ώστε να τρέξουν στο ECS.
Πηγαίνετε στο AWS πάνελ, αναζητήστε Ελαστικό εμπορευματοκιβώτιο Μητρώο και κάντε κλικ στο Ξεκινήστε. Θα δείτε την παρακάτω οθόνη:
Θα δημιουργήσουμε ένα ιδιωτικό αποθετήριο και θα το ονομάσουμε sample-rails-app.
Το αποθετήριο υπάρχει, αλλά είναι άδειο. Θέλουμε να περιέχει την εικόνα της εφαρμογής μας. Αυτό είναι το επόμενο βήμα.
# ρίχνει σφάλματα αν το αρχείο Gemfile έχει τροποποιηθεί από το Gemfile.lock
RUN bundle config --global frozen 1
WORKDIR /app
COPY Gemfile Gemfile.lock ./
RUN bundle install
COPY .
CMD ["rails", "server", "-b", "0.0.0.0.0"]
Στη συνέχεια θα πρέπει να δημιουργήσουμε μια εικόνα και να την προωθήσουμε στο αποθετήριο ECR.
Πριν από αυτό, ας κάνουμε προμεταγλώττιση των στοιχείων ενεργητικού με το `rails assets:precompile`.
Τώρα, μεταβείτε στο αποθετήριο που δημιουργήθηκε. Στο πάνω μέρος της οθόνης, θα δείτε ένα Προβολή εντολών push με λεπτομέρειες για το πώς να το κάνετε αυτό.
Στην περίπτωσή μου (Linux), το τρέχω με αυτές τις οδηγίες του AWS:
Βεβαιωθείτε ότι ο χρήστης σας έχει την άδεια να εκτελεί αυτή τη λειτουργία. Πρόσθεσα την πολιτική AmazonElasticContainerRegistryPowerUser στον χρήστη μου, η οποία έχει την εξής μορφή:
Θέλω ο εξωτερικός κόσμος να μπορεί να συνδεθεί μόνο στον Εξισορροπιστή Φορτίου Εφαρμογών μου. Αυτός θα περνάει την κυκλοφορία στα εμπορευματοκιβώτια που εκτελούνται μέσα στο σύμπλεγμα ECS μας.
Πηγαίνετε στο Υπηρεσίες EC2 -> Εξισορρόπηση φορτίου -> Εξισορροπιστές φορτίου, κάντε κλικ Δημιουργία Load Balancer, επιλέξτε Εξισορροπιστής φορτίου εφαρμογών και κάντε κλικ στο Δημιουργία κουμπί.
Ορίστε το όνομά του σε sample-rails-app-alb, χρησιμοποιήστε το προεπιλεγμένο VPC σας και επιλέξτε όλα τα υποδίκτυα του.
Μας έμειναν Ομάδες ασφαλείας και Ακροατές και δρομολόγηση τμήματα.
Ομάδες ασφαλείας
Θα δημιουργήσουμε μια νέα ομάδα ασφαλείας για τον εξισορροπητή φορτίου μας. Θα ορίσουμε τους κανόνες για την εισερχόμενη και την εξερχόμενη κυκλοφορία. Θέλουμε να δεχόμαστε την εισερχόμενη κυκλοφορία http (θύρα TCP 80) και να επιτρέπουμε όλη την εξερχόμενη κυκλοφορία.
Για να το κάνετε αυτό, κάντε κλικ στο "Δημιουργία νέας ομάδας ασφαλείας" link.
Στην ενότητα "Βασικές λεπτομέρειες", ορίστε όνομα και περιγραφή, αφήστε την προεπιλεγμένη VPC.
Στην περίπτωσή μου - όνομα: "sample-rails-app-alb-sg", περιγραφή: "http από έξω, όλα από μέσα"
Προσθέστε τον εισερχόμενο κανόνα με Τύπο: HTTP και Πηγή: Οπουδήποτε-IPv4. Αφήστε τους κανόνες εξερχομένων ως έχουν.
Κάντε κλικ στο δημιουργία ομάδας ασφαλείας, και στη συνέχεια επιστρέψτε στην καρτέλα όπου δημιουργούσατε τον Application Load Balancer, ανανεώστε τις ομάδες ασφαλείας και προσθέστε αυτή που μόλις δημιουργήσαμε, αφαιρώντας την προεπιλεγμένη.
Ακροατές και δρομολόγηση
Σε αυτή την ενότητα, θα ορίσουμε πού θέλουμε να περνάει την κυκλοφορία ο εξισορροπητής φορτίου. Αφήστε το ΑκροατήςΠρωτόκολλο και Λιμάνι ως HTTP και 80, καθώς αυτό ακριβώς θέλουμε, και πατήστε "Δημιουργία ομάδας-στόχου" link.
Ορίστε το όνομα σε "sample-rails-app-alb-tg". Η μόνη αλλαγή είναι ο αριθμός θύρας. Θα το περάσουμε στη θύρα 3000, καθώς αυτή είναι η θύρα για την εφαρμογή μας Rails. Αγνοήστε το επόμενο βήμα (Εγγεγραμμένοι στόχοι) και δημιουργήστε την ομάδα-στόχο.
Τώρα επιστρέψτε στην καρτέλα όπου δημιουργούσαμε τον Application Load Balancer, ανανεώστε την ομάδα στόχων και επιλέξτε αυτήν που μόλις δημιουργήσαμε.
Έχουμε έτοιμο τον Application Load Balancer, τώρα ας παίξουμε με το ECS.
Δημιουργία μιας συστάδας ECS
Υπάρχουν πολλοί τρομακτικοί όροι που θα δείτε - συστάδα, εργασίες, ορισμός εργασιών, υπηρεσίες. Για να το κάνετε πιο απλό, σκεφτείτε τη συστάδα ως μια ομάδα διακομιστών (EC2 instances). Σε κάθε ένα από αυτά, εκτελούμε εργασίες, οι οποίες είναι απλώς μια ομάδα από κοντέινερ που εκτελούνται μαζί. Ο ορισμός των εργασιών περιγράφει ποια κοντέινερ βρίσκονται σε μια συγκεκριμένη ομάδα και ποιους πόρους θα θέλαμε να τους δώσουμε (μνήμη, cpu). Οι υπηρεσίες παρακολουθούν αυτές τις εργασίες για να διασφαλίζουν ότι υπάρχει πάντα σωστός αριθμός υγιών εργασιών που εκτελούνται στο σύμπλεγμα μας.
Έχοντας αυτό κατά νου, ας δημιουργήσουμε τη συστάδα μας.
Πηγαίνετε στη σελίδα ECS και κάντε κλικ στην επιλογή Συστάδες σύνδεση και Δημιουργία Cluster κουμπί. Επιλέξτε το "Δικτύωση EC2 + Linux" ένα και κάντε κλικ Επόμενο βήμα.
Ορίστε το όνομα της συστάδας σε "sample-rails-app-cluster". Επιλέξτε τον τύπο της παρουσίασης EC2, εγώ πήρα την t2-micro, καθώς είναι διαθέσιμη στο πρόγραμμα Free Tier. Αφήστε τον αριθμό των instances ως 1.
Στην ενότητα δικτύωσης, χρησιμοποιήστε το προεπιλεγμένο VPC σας και επιλέξτε όλα τα υποδίκτυα του. Κάντε κλικ στο create, περιμένετε λίγο και voila, έχουμε δημιουργήσει ένα νέο ECS Cluster.
Ορισμός εργασίας
Κάντε κλικ στο Ορισμοί εργασιών σύνδεσμο, τότε Δημιουργία νέου ορισμού εργασίας κουμπί. Επιλέξτε το EC2 και κάντε κλικ στο Επόμενο βήμα. Η εφαρμογή που θα τρέξουμε είναι πολύ απλή, οπότε χρειαζόμαστε μόνο μερικές επιλογές εδώ.
Ορίστε Ορισμός εργασίας όνομα σε "sample-rails-app", τότε πηγαίνετε κατευθείαν στο Ορισμοί εμπορευματοκιβωτίων και κάντε κλικ στο "Προσθέστε δοχείο". Ονομάστε το εμπορευματοκιβώτιο ως "sample-rails-app", και ορίστε τη θέση της εικόνας με τη μορφή "repository-url/image:tag". Στη νέα καρτέλα του προγράμματος περιήγησης, μεταβείτε στο ECR για να αντιγράψετε το URI της εικόνας. Στην περίπτωσή μου, ήταν: "212516879399.dkr.ecr.eu-central-1.amazonaws.com/sample-rails-app:latest".
Ρυθμίστε το όριο μνήμης στα συνιστώμενα 300-500MiB. Τώρα, το πιο δύσκολο πράγμα - χαρτογράφηση θυρών.
Η εφαρμογή μας εκτελείται μέσα σε ένα κοντέινερ στη θύρα 3000. Έτσι, βάλτε το 3000 ως θύρα του εμπορευματοκιβωτίου. Θα βάλουμε 0 ως θύρα υποδοχής, το οποίο ουσιαστικά σημαίνει ότι επιλέγει μια τυχαία θύρα. Ευτυχώς, ο Application Load Balancer μας θα γνωρίζει αυτή την αντιστοίχιση των θυρών και θα μπορεί να κατευθύνει σωστά την κυκλοφορία. Μπορούμε ακόμη και να εκτελέσουμε πολλαπλές εργασίες σε αυτή την ενιαία παρουσία.
Προσθέστε τη μεταβλητή περιβάλλοντος RAILS_ENV και ρυθμίστε το σε παραγωγή.
Τώρα κάντε κλικ στο Προσθέστε για να προσθέσετε τον ορισμό του δοχείου μας και κάντε κλικ στο Δημιουργία για να ολοκληρώσετε τη ρύθμιση Task Definition.
Υπηρεσία
Έχουμε τη συστάδα μας, τον εξισορροπιστή φορτίου και τον ορισμό εργασιών. Τώρα πρέπει με κάποιο τρόπο να εκτελέσουμε αυτές τις εργασίες μέσα στη συστάδα μας. Αυτή είναι η δουλειά των υπηρεσιών. Πηγαίνετε στη νεοσύστατη συστάδα, επιλέξτε το Υπηρεσίες και κάντε κλικ στην καρτέλα Δημιουργία κουμπί.
Ορίστε τον τύπο εκκίνησης σε EC2, προσθέστε το όνομα "sample-rails-app-service". Ορίστε τον αριθμό των εργασιών σε 1 και κάντε κλικ στο κουμπί Επόμενο βήμα. Σε αυτή τη σελίδα, επιλέξτε το κουμπί επιλογής Application Load Balancer και επιλέξτε τον υπάρχοντα ρόλο IAM για αυτόν. Στην ενότητα "Container to load balance", θα πρέπει να έχετε ήδη εισαγάγει ένα σωστό container "sample-rails-app:0:3000", και στη συνέχεια κάντε κλικ στο "Add to load balancer".
Για τη "θύρα ακροατή παραγωγής", επιλέξτε 80:HTTP.Ως όνομα ομάδας στόχου, χρησιμοποιήστε αυτό που δημιουργήσαμε προηγουμένως - "sample-rails-app-alb-tg" και κάντε κλικ στο Επόμενο βήμα. Αφήστε το Αυτόματη κλιμάκωση επιλογές ως έχουν, κάντε κλικ στο Επόμενο βήμα και Δημιουργία υπηρεσίας.
Ενημέρωση της ομάδας ασφαλείας του ECS
Μπορείτε να μεταβείτε στη σελίδα δημιουργημένης συστάδας και να ελέγξετε το Εργασίες καρτέλες, θα πρέπει να εκτελείται μία εργασία. Η Υπηρεσία την έχει ξεκινήσει. Τώρα μεταβείτε στη σελίδα της υπηρεσίας EC2, κάντε κλικ στο Load Balancers και δείτε τα στοιχεία του Application Load Balancer μας. Θα πρέπει να έχετε εκεί το όνομα DNS του. Αντιγράψτε το και ανοίξτε το στο πρόγραμμα περιήγησης. Θα πρέπει να σας κατευθύνει στην εφαρμογή μας. Δυστυχώς, εμφανίζεται το μήνυμα "504 χρονικό όριο πύλης" σφάλμα.
Το πρόβλημα εντοπίζεται στην ομάδα ασφαλείας της συστάδας μας. Οι εισερχόμενοι κανόνες της δεν επιτρέπουν την εισερχόμενη κυκλοφορία από τον εξισορροπιστή φορτίου. Για να το διορθώσετε, επιστρέψτε στον πίνακα EC2 και κάντε κλικ στο κουμπί Ομάδες ασφαλείας σύνδεσμος. Υπάρχει μια νέα ομάδα που δημιουργήθηκε κατά τη διαδικασία δημιουργίας της συστάδας. Θα πρέπει να έχει όνομα που αρχίζει με "EC2ContainerService-sample-rails-app-cluster". Κάντε κλικ σε αυτό και επεξεργαστείτε τους κανόνες εισερχομένων. Καθώς θέλουμε να επιτρέψουμε οποιαδήποτε κίνηση από το VPC μας, μεταβείτε στον πίνακα Amazon VPC και ελέγξτε ποιο είναι το IPv4 CIDR του VPC σας. Ορίστε τον τύπο κανόνα σε "Όλη η κυκλοφορία" και η πηγή σε IPv4 CIDR. Αποθηκεύστε αυτόν τον κανόνα και προσπαθήστε να φορτώσετε το όνομα DNS του εξισορροπητή.