Δημιουργία Scalable API σε AWS Spot Instances

Γεια σε όλους! Το όνομά μου είναι Kirill, είμαι CTO στο Adapty. Το μεγαλύτερο μέρος της αρχιτεκτονικής μας είναι σε AWS και σήμερα θα μιλήσω για το πώς μειώσαμε το κόστος του διακομιστή κατά 3 φορές χρησιμοποιώντας spot στιγμιότυπα σε περιβάλλον παραγωγής, καθώς και για το πώς να ρυθμίσουμε την αυτόματη κλιμάκωση τους. Πρώτα θα υπάρχει μια επισκόπηση του τρόπου λειτουργίας του και, στη συνέχεια, λεπτομερείς οδηγίες για να ξεκινήσετε.

Τι είναι οι Spot Instances;

Σημείο Οι παρουσίες είναι διακομιστές άλλων χρηστών AWS που είναι επί του παρόντος σε αδράνεια και τους πωλούν με μεγάλη έκπτωση (το Amazon γράφει έως και 90%, σύμφωνα με την εμπειρία μας ~3x, ποικίλλει ανάλογα με την περιοχή, την περιοχή AZ και τον τύπο παρουσίας). Η κύρια διαφορά τους από τα κανονικά είναι ότι μπορούν να απενεργοποιηθούν ανά πάσα στιγμή. Επομένως, για πολύ καιρό πιστεύαμε ότι ήταν φυσιολογικό να τα χρησιμοποιούμε για παρθένα περιβάλλοντα ή για εργασίες υπολογισμού κάτι, με ενδιάμεσα αποτελέσματα αποθηκευμένα στο S3 ή στη βάση δεδομένων, αλλά όχι για πωλήσεις. Υπάρχουν λύσεις τρίτων που σας επιτρέπουν να χρησιμοποιείτε σποτ στην παραγωγή, αλλά υπάρχουν πολλά δεκανίκια για την περίπτωσή μας, επομένως δεν τα εφαρμόσαμε. Η προσέγγιση που περιγράφεται στο άρθρο λειτουργεί εξ ολοκλήρου εντός της τυπικής λειτουργικότητας AWS, χωρίς πρόσθετα σενάρια, κορώνες κ.λπ.

Παρακάτω είναι μερικά στιγμιότυπα οθόνης που δείχνουν το ιστορικό τιμών για σποτ.

m5.μεγάλο στην περιοχή eu-west-1 (Ιρλανδία). Η τιμή είναι ως επί το πλείστον σταθερή για 3 μήνες, προς το παρόν εξοικονομεί 2.9x.

Δημιουργία Scalable API σε AWS Spot Instances

m5.μεγάλο στην περιοχή ΗΠΑ-ανατολικά-1 (Β. Βιρτζίνια). Η τιμή αλλάζει συνεχώς μέσα σε 3 μήνες, προς το παρόν εξοικονομεί από 2.3x σε 2.8x ανάλογα με τη ζώνη διαθεσιμότητας.

Δημιουργία Scalable API σε AWS Spot Instances

t3.μικρό στην περιοχή ΗΠΑ-ανατολική-1 (Β. Βιρτζίνια). Η τιμή είναι σταθερή εδώ και 3 μήνες, προς το παρόν εξοικονομεί 3.4 φορές.

Δημιουργία Scalable API σε AWS Spot Instances

Αρχιτεκτονική υπηρεσίας

Η βασική αρχιτεκτονική της υπηρεσίας για την οποία θα μιλήσουμε σε αυτό το άρθρο φαίνεται στο παρακάτω διάγραμμα.

Δημιουργία Scalable API σε AWS Spot Instances

Εφαρμογή Load Balancer → EC2 Target Group → Elastic Container Service

Το Application Load Balancer (ALB) χρησιμοποιείται ως εξισορροπητής, ο οποίος στέλνει αιτήματα στην ομάδα στόχου EC2 (TG). Η TG είναι υπεύθυνη για το άνοιγμα θυρών σε στιγμιότυπα για ALB και τη σύνδεσή τους σε θύρες εμπορευματοκιβωτίων Elastic Container Service (ECS). Το ECS είναι ένα ανάλογο του Kubernetes στο AWS, το οποίο διαχειρίζεται τα κοντέινερ Docker.

Μια παρουσία μπορεί να έχει πολλά κοντέινερ που τρέχουν με τις ίδιες θύρες, επομένως δεν μπορούμε να τα ρυθμίσουμε σταθερά. Η ECS λέει στην TG ότι εκκινεί μια νέα εργασία (στην ορολογία του Kubernetes αυτό ονομάζεται pod), ελέγχει για δωρεάν θύρες στο στιγμιότυπο και αναθέτει μία από αυτές στην εκκινημένη εργασία. Το TG ελέγχει επίσης τακτικά εάν το στιγμιότυπο και το API εργάζονται σε αυτό χρησιμοποιώντας έλεγχο υγείας και εάν δει προβλήματα, σταματά να στέλνει αιτήματα εκεί.

EC2 Auto Scaling Groups + ECS Capacity Providers

Το παραπάνω διάγραμμα δεν δείχνει την υπηρεσία EC2 Auto Scaling Groups (ASG). Από το όνομα μπορείτε να καταλάβετε ότι είναι υπεύθυνο για την κλιμάκωση των περιπτώσεων. Ωστόσο, μέχρι πρόσφατα, το AWS δεν είχε ενσωματωμένη δυνατότητα διαχείρισης του αριθμού των μηχανημάτων που λειτουργούσαν από το ECS. Το ECS κατέστησε δυνατή την κλιμάκωση του αριθμού των εργασιών, για παράδειγμα, με βάση τη χρήση της CPU, τη μνήμη RAM ή τον αριθμό των αιτημάτων. Αλλά αν οι εργασίες καταλάμβαναν όλες τις ελεύθερες περιπτώσεις, τότε δεν δημιουργήθηκαν αυτόματα νέα μηχανήματα.

Αυτό άλλαξε με την εμφάνιση των παρόχων χωρητικότητας ECS (ECS CP). Τώρα κάθε υπηρεσία στο ECS μπορεί να συσχετιστεί με ένα ASG και εάν οι εργασίες δεν ταιριάζουν στις εκτελούμενες περιπτώσεις, τότε θα αυξηθούν νέες (αλλά εντός των καθορισμένων ορίων ASG). Αυτό λειτουργεί επίσης προς την αντίθετη κατεύθυνση, εάν το ECS CP δει αδρανείς παρουσίες χωρίς εργασίες, τότε θα δώσει την εντολή ASG να τις τερματίσει. Το ECS CP έχει τη δυνατότητα να καθορίσει ένα στοχευόμενο ποσοστό φόρτωσης παρουσίας, έτσι ώστε ένας συγκεκριμένος αριθμός μηχανών να είναι πάντα ελεύθερος για εργασίες γρήγορης κλιμάκωσης· θα μιλήσω για αυτό λίγο αργότερα.

Πρότυπα εκκίνησης EC2

Η τελευταία υπηρεσία για την οποία θα μιλήσω πριν προχωρήσω σε λεπτομέρειες σχετικά με τη δημιουργία αυτής της υποδομής είναι τα EC2 Launch Templates. Σας επιτρέπει να δημιουργήσετε ένα πρότυπο σύμφωνα με το οποίο θα ξεκινήσουν όλα τα μηχανήματα, ώστε να μην το επαναλαμβάνετε από την αρχή κάθε φορά. Εδώ μπορείτε να επιλέξετε τον τύπο του μηχανήματος προς εκκίνηση, την ομάδα ασφαλείας, την εικόνα του δίσκου και πολλές άλλες παραμέτρους. Μπορείτε επίσης να καθορίσετε δεδομένα χρήστη που θα μεταφορτώνονται σε όλες τις εκκινήσεις. Μπορείτε να εκτελέσετε σενάρια σε δεδομένα χρήστη, για παράδειγμα, μπορείτε να επεξεργαστείτε τα περιεχόμενα ενός αρχείου Διαμορφώσεις πράκτορα ECS.

Μία από τις πιο σημαντικές παραμέτρους διαμόρφωσης για αυτό το άρθρο είναι ECS_ENABLE_SPOT_INSTANCE_DRAINING=αλήθεια. Εάν αυτή η παράμετρος είναι ενεργοποιημένη, τότε μόλις το ECS λάβει ένα σήμα ότι ένα στιγμιότυπο σποτ έχει αφαιρεθεί, μεταφέρει όλες τις εργασίες που λειτουργούν σε αυτό στην κατάσταση Αποστράγγιση. Δεν θα ανατεθούν νέες εργασίες σε αυτήν την παρουσία. Εάν υπάρχουν εργασίες που θέλουν να αναπτυχθούν σε αυτήν αυτήν τη στιγμή, θα ακυρωθούν. Τα αιτήματα από τον εξισορροπητή επίσης σταματούν να έρχονται. Η ειδοποίηση για τη διαγραφή του στιγμιότυπου έρχεται 2 λεπτά πριν από το πραγματικό συμβάν. Επομένως, εάν η υπηρεσία σας δεν εκτελεί εργασίες μεγαλύτερες από 2 λεπτά και δεν αποθηκεύει τίποτα στο δίσκο, τότε μπορείτε να χρησιμοποιήσετε σποτ χωρίς απώλεια δεδομένων.

Σχετικά με το δίσκο - AWS πρόσφατα γίνονται Είναι δυνατή η χρήση του Elastic File System (EFS) μαζί με το ECS· με αυτό το σχήμα, ακόμη και ο δίσκος δεν αποτελεί εμπόδιο, αλλά δεν το δοκιμάσαμε, αφού καταρχήν δεν χρειαζόμαστε τον δίσκο για την αποθήκευση της κατάστασης. Από προεπιλογή, μετά τη λήψη SIGINT (αποστέλλεται όταν μια εργασία μεταφέρεται στην κατάσταση αποστράγγισης), όλες οι εργασίες που εκτελούνται θα σταματήσουν μετά από 30 δευτερόλεπτα, ακόμα κι αν δεν έχουν ακόμη ολοκληρωθεί. μπορείτε να αλλάξετε αυτή τη φορά χρησιμοποιώντας την παράμετρο ECS_CONTAINER_STOP_TIMEOUT. Το κυριότερο είναι να μην το ρυθμίσετε για περισσότερο από 2 λεπτά για τα σποτ μηχανήματα.

Δημιουργία υπηρεσίας

Ας προχωρήσουμε στη δημιουργία της περιγραφόμενης υπηρεσίας. Στη διαδικασία, θα περιγράψω επιπλέον πολλά χρήσιμα σημεία που δεν αναφέρθηκαν παραπάνω. Σε γενικές γραμμές, αυτή είναι μια οδηγία βήμα προς βήμα, αλλά δεν θα εξετάσω ορισμένες πολύ βασικές ή, αντίθετα, πολύ συγκεκριμένες περιπτώσεις. Όλες οι ενέργειες εκτελούνται στην οπτική κονσόλα AWS, αλλά μπορούν να αναπαραχθούν μέσω προγραμματισμού χρησιμοποιώντας το CloudFormation ή το Terraform. Στο Adapty χρησιμοποιούμε Terraform.

Πρότυπο εκκίνησης EC2

Αυτή η υπηρεσία δημιουργεί μια διαμόρφωση των μηχανημάτων που θα χρησιμοποιηθούν. Η διαχείριση των προτύπων γίνεται στην ενότητα EC2 -> Instances -> Launch templates.

Εικόνα μηχανής Amazon (AMI) — καθορίστε την εικόνα δίσκου με την οποία θα εκκινηθούν όλες οι παρουσίες. Για το ECS, στις περισσότερες περιπτώσεις αξίζει να χρησιμοποιήσετε τη βελτιστοποιημένη εικόνα από το Amazon. Ενημερώνεται τακτικά και περιέχει όλα τα απαραίτητα για τη λειτουργία του ECS. Για να μάθετε το τρέχον αναγνωριστικό εικόνας, μεταβείτε στη σελίδα AMI βελτιστοποιημένα για ECS της Amazon, επιλέξτε την περιοχή που χρησιμοποιείτε και αντιγράψτε το αναγνωριστικό AMI για αυτήν. Για παράδειγμα, για την περιοχή us-east-1, το τρέχον αναγνωριστικό τη στιγμή της σύνταξης είναι ami-00c7c1cf5bdc913ed. Αυτό το αναγνωριστικό πρέπει να εισαχθεί στο στοιχείο Καθορίστε μια προσαρμοσμένη τιμή.

Τύπος παρουσίας — υποδεικνύουν τον τύπο του στιγμιότυπου. Επιλέξτε αυτό που ταιριάζει καλύτερα στην εργασία σας.

Ζεύγος κλειδιών (είσοδος) — καθορίστε ένα πιστοποιητικό με το οποίο μπορείτε να συνδεθείτε στην παρουσία μέσω SSH, εάν είναι απαραίτητο.

Ρυθμίσεις δικτύου — καθορίστε τις παραμέτρους δικτύου. Πλατφόρμα δικτύωσης Στις περισσότερες περιπτώσεις θα πρέπει να υπάρχει ένα Virtual Private Cloud (VPC). Ομάδες ασφαλείας — ομάδες ασφαλείας για τις εμφανίσεις σας. Δεδομένου ότι θα χρησιμοποιήσουμε έναν εξισορροπητή μπροστά από τα στιγμιότυπα, προτείνω να καθορίσετε μια ομάδα εδώ που να επιτρέπει τις εισερχόμενες συνδέσεις μόνο από τον εξισορροπητή. Δηλαδή, θα έχετε 2 ομάδες ασφαλείας, μία για τον εξισορροπητή, που επιτρέπει εισερχόμενες συνδέσεις από οπουδήποτε στις θύρες 80 (http) και 443 (https) και τη δεύτερη για μηχανές, η οποία επιτρέπει εισερχόμενες συνδέσεις σε οποιεσδήποτε θύρες από την ομάδα εξισορρόπησης . Οι εξερχόμενες συνδέσεις και στις δύο ομάδες πρέπει να ανοίγουν χρησιμοποιώντας το πρωτόκολλο TCP σε όλες τις θύρες σε όλες τις διευθύνσεις. Μπορείτε να περιορίσετε τις θύρες και τις διευθύνσεις για εξερχόμενες συνδέσεις, αλλά στη συνέχεια πρέπει να παρακολουθείτε συνεχώς ότι δεν προσπαθείτε να αποκτήσετε πρόσβαση σε κάτι σε μια κλειστή θύρα.

Αποθήκευση (τόμοι) — καθορίστε τις παραμέτρους του δίσκου για τα μηχανήματα. Το μέγεθος του δίσκου δεν μπορεί να είναι μικρότερο από αυτό που καθορίζεται στο AMI· για το ECS Optimized είναι 30 GiB.

Προηγμένες λεπτομέρειες — καθορίστε πρόσθετες παραμέτρους.

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

Προφίλ στιγμιότυπου IAM — υποδεικνύουν τον ρόλο με τον οποίο θα εκκινήσουν οι παρουσίες. Για να εκτελούνται οι παρουσίες στο ECS, χρειάζονται δικαιώματα, τα οποία συνήθως βρίσκονται στον ρόλο ecsInstanceRole. Σε ορισμένες περιπτώσεις μπορεί να δημιουργηθεί, αν όχι, τότε εδώ εντολή για το πώς να το κάνετε αυτό. Μετά τη δημιουργία, το υποδεικνύουμε στο πρότυπο.
Στη συνέχεια, υπάρχουν πολλές παράμετροι, βασικά μπορείτε να αφήσετε τις προεπιλεγμένες τιμές παντού, αλλά καθεμία από αυτές έχει μια σαφή περιγραφή. Ενεργοποιώ πάντα τη βελτιστοποιημένη παρουσία EBS και τις επιλογές T2/T3 Unlimited, εάν χρησιμοποιούνται διαρρηγμένος περιπτώσεις.

Φορά που ο χρήστης — υποδεικνύουν τα δεδομένα χρήστη. Θα επεξεργαστούμε το αρχείο /etc/ecs/ecs.config, το οποίο περιέχει τη διαμόρφωση παράγοντα ECS.
Ένα παράδειγμα για το πώς μπορεί να φαίνονται τα δεδομένα χρήστη:

#!/bin/bash
echo ECS_CLUSTER=DemoApiClusterProd >> /etc/ecs/ecs.config
echo ECS_ENABLE_SPOT_INSTANCE_DRAINING=true >> /etc/ecs/ecs.config
echo ECS_CONTAINER_STOP_TIMEOUT=1m >> /etc/ecs/ecs.config
echo ECS_ENGINE_AUTH_TYPE=docker >> /etc/ecs/ecs.config
echo "ECS_ENGINE_AUTH_DATA={"registry.gitlab.com":{"username":"username","password":"password"}}" >> /etc/ecs/ecs.config

ECS_CLUSTER=DemoApiClusterProd — η παράμετρος υποδεικνύει ότι το στιγμιότυπο ανήκει σε ένα σύμπλεγμα με το συγκεκριμένο όνομα, δηλαδή, αυτό το σύμπλεγμα θα μπορεί να τοποθετήσει τις εργασίες του σε αυτόν τον διακομιστή. Δεν έχουμε δημιουργήσει ακόμα ένα σύμπλεγμα, αλλά θα χρησιμοποιήσουμε αυτό το όνομα κατά τη δημιουργία του.

ECS_ENABLE_SPOT_INSTANCE_DRAINING=true — η παράμετρος καθορίζει ότι όταν λαμβάνεται ένα σήμα για την απενεργοποίηση ενός στιγμιότυπου, όλες οι εργασίες σε αυτό θα πρέπει να μεταφέρονται στην κατάσταση αποστράγγισης.

ECS_CONTAINER_STOP_TIMEOUT=1m - η παράμετρος καθορίζει ότι μετά τη λήψη ενός σήματος SIGINT, όλες οι εργασίες έχουν 1 λεπτό πριν σκοτωθούν.

ECS_ENGINE_AUTH_TYPE=docker — η παράμετρος υποδεικνύει ότι το σχήμα Docker χρησιμοποιείται ως μηχανισμός εξουσιοδότησης

ECS_ENGINE_AUTH_DATA=... — παραμέτρους σύνδεσης στο ιδιωτικό μητρώο κοντέινερ, όπου αποθηκεύονται οι εικόνες Docker σας. Εάν είναι δημόσιο, τότε δεν χρειάζεται να προσδιορίσετε τίποτα.

Για τους σκοπούς αυτού του άρθρου, θα χρησιμοποιήσω μια δημόσια εικόνα από το Docker Hub, επομένως καθορίστε τις παραμέτρους ECS_ENGINE_AUTH_TYPE и ECS_ENGINE_AUTH_DATA δεν χρειάζεται.

Καλό να το ξέρω: Συνιστάται η τακτική ενημέρωση του AMI, επειδή οι νέες εκδόσεις ενημερώνουν τις εκδόσεις του Docker, Linux, ECS agent κ.λπ. Για να μην το ξεχάσετε αυτό, μπορείτε ρύθμιση ειδοποιήσεων σχετικά με την κυκλοφορία νέων εκδόσεων. Μπορείτε να λαμβάνετε ειδοποιήσεις μέσω email και να ενημερώνεστε με μη αυτόματο τρόπο ή μπορείτε να γράψετε μια συνάρτηση Lambda που θα δημιουργήσει αυτόματα μια νέα έκδοση του Προτύπου εκκίνησης με ενημερωμένο AMI.

EC2 Auto Scaling Group

Η Auto Scaling Group είναι υπεύθυνη για την εκκίνηση και την κλιμάκωση των παρουσιών. Η διαχείριση των ομάδων γίνεται στην ενότητα EC2 -> Auto Scaling -> Auto Scaling Groups.

Εκκίνηση προτύπου — επιλέξτε το πρότυπο που δημιουργήθηκε στο προηγούμενο βήμα. Αφήνουμε την προεπιλεγμένη έκδοση.

Επιλογές αγοράς και τύποι παρουσιών — καθορίστε τους τύπους παρουσιών για το σύμπλεγμα. Το πρότυπο εκκίνησης Συμμόρφωση στην εκκίνηση χρησιμοποιεί τον τύπο παρουσίας από το Πρότυπο εκκίνησης. Ο συνδυασμός επιλογών αγοράς και τύπων παρουσιών σάς επιτρέπει να διαμορφώνετε με ευελιξία τους τύπους παρουσιών. Θα το χρησιμοποιήσουμε.

Προαιρετική βάση κατ' απαίτηση — ο αριθμός των τακτικών, μη σημειακών περιπτώσεων που θα λειτουργούν πάντα.

Ποσοστό κατ' απαίτηση πάνω από τη βάση — ποσοστιαία αναλογία κανονικών και σποτ, 50-50 θα κατανεμηθούν ισόποσα, 20-80 για κάθε κανονικό στιγμιότυπο θα αυξηθούν 4 σποτ. Για τους σκοπούς αυτού του παραδείγματος, θα αναφέρω 50-50, αλλά στην πραγματικότητα κάνουμε τις περισσότερες φορές 20-80, σε ορισμένες περιπτώσεις 0-100.

Τύποι παρουσίας — εδώ μπορείτε να καθορίσετε πρόσθετους τύπους παρουσιών που θα χρησιμοποιηθούν στο σύμπλεγμα. Δεν το χρησιμοποιήσαμε ποτέ γιατί δεν καταλαβαίνω πραγματικά το νόημα της ιστορίας. Ίσως αυτό οφείλεται στα όρια σε συγκεκριμένους τύπους περιπτώσεων, αλλά μπορούν εύκολα να αυξηθούν μέσω της υποστήριξης. Εάν γνωρίζετε την εφαρμογή, θα χαρώ να τη διαβάσω στα σχόλια)

Δημιουργία Scalable API σε AWS Spot Instances

Δίκτυο — ρυθμίσεις δικτύου, επιλέξτε VPC και υποδίκτυα για μηχανήματα, στις περισσότερες περιπτώσεις θα πρέπει να επιλέξετε όλα τα διαθέσιμα υποδίκτυα.

Εξισορρόπηση φορτίου - ρυθμίσεις εξισορρόπησης, αλλά θα το κάνουμε αυτό ξεχωριστά, δεν θα αγγίξουμε τίποτα εδώ. Έλεγχοι υγείας θα ρυθμιστεί επίσης αργότερα.

Μέγεθος ομάδας — υποδεικνύουμε τα όρια στον αριθμό των μηχανών στο σύμπλεγμα και τον επιθυμητό αριθμό μηχανών στην αρχή. Ο αριθμός των μηχανών στο σύμπλεγμα δεν θα είναι ποτέ μικρότερος από το ελάχιστο καθορισμένο και μεγαλύτερο από το μέγιστο, ακόμα κι αν η κλιμάκωση πρέπει να γίνει σύμφωνα με τις μετρήσεις.

Πολιτικές κλιμάκωσης — παραμέτρους κλιμάκωσης, αλλά θα κλιμακώσουμε με βάση τις τρέχουσες εργασίες ECS, επομένως θα διαμορφώσουμε την κλίμακα αργότερα.

Προστασία για παράδειγμα κλίμακας — προστασία των περιπτώσεων από διαγραφή κατά τη μείωση της κλίμακας. Το ενεργοποιούμε έτσι ώστε το ASG να μην διαγράφει το μηχάνημα που έχει εκτελούμενες εργασίες. Το ECS Capacity Provider θα απενεργοποιήσει την προστασία για περιπτώσεις που δεν έχουν εργασίες.

Προσθέστε ετικέτες — μπορείτε να καθορίσετε ετικέτες για παρουσίες (για αυτό, πρέπει να είναι επιλεγμένο το πλαίσιο ελέγχου Ετικέτα νέων περιπτώσεων). Συνιστώ να καθορίσετε την ετικέτα Όνομα, τότε όλες οι εμφανίσεις που εκκινούνται εντός της ομάδας θα έχουν το ίδιο όνομα και είναι βολικό να τις προβάλετε στην κονσόλα.

Δημιουργία Scalable API σε AWS Spot Instances

Αφού δημιουργήσετε την ομάδα, ανοίξτε την και μεταβείτε στην ενότητα Σύνθετες διαμορφώσεις.Γιατί δεν είναι ορατές όλες οι επιλογές στην κονσόλα στο στάδιο της δημιουργίας.

Πολιτικές τερματισμού — κανόνες που λαμβάνονται υπόψη κατά τη διαγραφή περιπτώσεων. Εφαρμόζονται με τη σειρά. Συνήθως χρησιμοποιούμε αυτά της παρακάτω εικόνας. Αρχικά, οι παρουσίες με το παλαιότερο Πρότυπο εκκίνησης διαγράφονται (για παράδειγμα, εάν ενημερώσαμε το AMI, δημιουργήσαμε μια νέα έκδοση, αλλά όλες οι παρουσίες κατάφεραν να μεταβούν σε αυτό). Στη συνέχεια, επιλέγονται οι περιπτώσεις που είναι πιο κοντά στην επόμενη ώρα χρέωσης. Και στη συνέχεια επιλέγονται τα παλαιότερα με βάση την ημερομηνία κυκλοφορίας.

Δημιουργία Scalable API σε AWS Spot Instances

Καλό να το ξέρω: για ενημέρωση όλων των μηχανημάτων σε ένα σύμπλεγμα, βολικό στη χρήση Ανανέωση παρουσίας. Εάν το συνδυάσετε με τη συνάρτηση Lambda από το προηγούμενο βήμα, θα έχετε ένα πλήρως αυτοματοποιημένο σύστημα ενημέρωσης παρουσιών. Πριν ενημερώσετε όλα τα μηχανήματα, πρέπει να απενεργοποιήσετε την προστασία κλιμάκωσης παρουσίας για όλες τις παρουσίες της ομάδας. Όχι ρύθμιση παραμέτρων στην ομάδα, αλλά προστασία από τα ίδια τα μηχανήματα, αυτό γίνεται στην καρτέλα Διαχείριση παρουσιών.

Application Load Balancer και EC2 Target Group

Ο εξισορροπητής δημιουργείται στην ενότητα EC2 → Load Balancing → Load Balancer. Θα χρησιμοποιήσουμε το Application Load Balancer. Μπορείτε να διαβάσετε μια σύγκριση διαφορετικών τύπων εξισορροπητών σελίδα υπηρεσίας.

Ακρόαση - είναι λογικό να δημιουργήσετε τις θύρες 80 και 443 και να ανακατευθύνετε από το 80 στο 443 χρησιμοποιώντας κανόνες εξισορρόπησης αργότερα.

Ζώνες διαθεσιμότητας — στις περισσότερες περιπτώσεις, επιλέγουμε ζώνες προσβασιμότητας για όλους.

Διαμόρφωση ρυθμίσεων ασφαλείας — εδώ υποδεικνύεται το πιστοποιητικό SSL για τον εξισορροπητή, η πιο βολική επιλογή είναι κάνει πιστοποιητικό σε ACM. Σχετικά με τις διαφορές Πολιτική ασφαλείας μπορεί να διαβαστεί σε τεκμηρίωση, μπορείτε να το αφήσετε επιλεγμένο από προεπιλογή ELBSecurityPolicy-2016-08. Αφού δημιουργήσετε τον εξισορροπητή, θα το δείτε Όνομα DNS, το οποίο χρειάζεστε για να διαμορφώσετε το CNAME για τον τομέα σας. Για παράδειγμα, έτσι φαίνεται στο Cloudflare.

Δημιουργία Scalable API σε AWS Spot Instances

Ομάδα ασφαλείας — δημιουργήστε ή επιλέξτε μια ομάδα ασφαλείας για τον εξισορροπητή, έγραψα περισσότερα για αυτό ακριβώς παραπάνω στην ενότητα Πρότυπο εκκίνησης EC2 → Ρυθμίσεις δικτύου.

Ομάδα-στόχος — δημιουργούμε μια ομάδα που είναι υπεύθυνη για τη δρομολόγηση αιτημάτων από τον εξισορροπητή σε μηχανήματα και τον έλεγχο της διαθεσιμότητάς τους προκειμένου να τα αντικαταστήσει σε περίπτωση προβλημάτων. Τύπος στόχου πρέπει να είναι παράδειγμα, Πρωτόκολλο и Λιμάνι οποιαδήποτε, εάν χρησιμοποιείτε HTTPS για επικοινωνία μεταξύ του εξισορροπητή και των παρουσιών, τότε πρέπει να ανεβάσετε ένα πιστοποιητικό σε αυτά. Για τους σκοπούς αυτού του παραδείγματος, δεν θα το κάνουμε αυτό, απλώς θα αφήσουμε τη θύρα 80.

Έλεγχοι υγείας — παραμέτρους για τον έλεγχο της λειτουργικότητας της υπηρεσίας. Σε μια πραγματική υπηρεσία, αυτό θα πρέπει να είναι ένα ξεχωριστό αίτημα που υλοποιεί σημαντικά μέρη της επιχειρηματικής λογικής· για τους σκοπούς αυτού του παραδείγματος, θα αφήσω τις προεπιλεγμένες ρυθμίσεις. Στη συνέχεια, μπορείτε να επιλέξετε το διάστημα αιτήματος, το χρονικό όριο, τους κωδικούς επιτυχίας κ.λπ. Στο παράδειγμά μας, θα υποδείξουμε τους κωδικούς επιτυχίας 200-399, επειδή η εικόνα Docker που θα χρησιμοποιηθεί επιστρέφει έναν κωδικό 304.

Δημιουργία Scalable API σε AWS Spot Instances

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

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

Ορισμός εργασιών ECS

Στα προηγούμενα βήματα, δημιουργήσαμε οτιδήποτε σχετίζεται με την υποδομή υπηρεσιών· τώρα προχωράμε στην περιγραφή των κοντέινερ που θα λανσάρουμε. Αυτό γίνεται στην ενότητα ECS → Task Definitions.

Συμβατότητα τύπου εκκίνησης - επιλέξτε EC2.

Εκτέλεση εργασιών Ρόλος IAM - επιλέξτε ecsTaskExecutionRole. Χρησιμοποιώντας το, γράφονται αρχεία καταγραφής, δίνεται πρόσβαση σε μυστικές μεταβλητές κ.λπ.

Στην ενότητα Ορισμοί κοντέινερ, κάντε κλικ στην επιλογή Προσθήκη κοντέινερ.

Εικόνα — σύνδεσμος προς την εικόνα με τον κώδικα του έργου· για αυτό το παράδειγμα θα χρησιμοποιήσω μια δημόσια εικόνα από το Docker Hub bitnami/node-παράδειγμα:0.0.1.

Όρια μνήμης — όρια μνήμης για το δοχείο. Σκληρό όριο — σκληρό όριο, εάν το κοντέινερ υπερβαίνει την καθορισμένη τιμή, η εντολή kill docker θα εκτελεστεί, το κοντέινερ θα πεθάνει αμέσως. Soft Limit — μαλακό όριο, το δοχείο μπορεί να υπερβαίνει την καθορισμένη τιμή, αλλά αυτή η παράμετρος θα λαμβάνεται υπόψη κατά την τοποθέτηση εργασιών σε μηχανήματα. Για παράδειγμα, εάν ένα μηχάνημα έχει 4 GiB μνήμης RAM και το soft όριο ενός κοντέινερ είναι 2048 MiB, τότε αυτό το μηχάνημα μπορεί να έχει έως και 2 εργασίες που εκτελούνται με αυτό το κοντέινερ. Στην πραγματικότητα, τα 4 GiB μνήμης RAM είναι ελαφρώς λιγότερα από 4096 MiB, αυτό μπορεί να προβληθεί στην καρτέλα ECS Instances στο σύμπλεγμα. Το μαλακό όριο δεν μπορεί να είναι μεγαλύτερο από το σκληρό όριο. Είναι σημαντικό να κατανοήσουμε ότι εάν υπάρχουν πολλά δοχεία σε μία εργασία, τότε τα όριά τους συνοψίζονται.

Χαρτογραφήσεις λιμένων - στις Θύρα υποδοχής Υποδεικνύουμε 0, αυτό σημαίνει ότι η θύρα θα εκχωρηθεί δυναμικά και θα παρακολουθείται από την Target Group. Λιμάνι εμπορευματοκιβωτίων — η θύρα στην οποία εκτελείται η εφαρμογή σας προσδιορίζεται συχνά στην εντολή εκτέλεσης ή εκχωρείται στον κώδικα της εφαρμογής σας, στο Dockerfile κ.λπ. Για το παράδειγμά μας θα χρησιμοποιήσουμε το 3000 επειδή αναφέρεται στο Dockerfile την εικόνα που χρησιμοποιείται.

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

Περιβάλλον - ρυθμίσεις περιβάλλοντος. Μονάδες CPU - παρόμοια με τα όρια μνήμης, μόνο για τον επεξεργαστή. Κάθε πυρήνας επεξεργαστή είναι 1024 μονάδες, επομένως εάν ο διακομιστής έχει επεξεργαστή διπλού πυρήνα και το κοντέινερ έχει οριστεί σε 512, τότε 4 εργασίες με αυτό το κοντέινερ μπορούν να εκκινηθούν σε έναν διακομιστή. Οι μονάδες CPU αντιστοιχούν πάντα στον αριθμό των πυρήνων· δεν μπορεί να είναι λίγο λιγότεροι, όπως συμβαίνει με τη μνήμη.

εντολή — μια εντολή για την έναρξη μιας υπηρεσίας μέσα σε ένα κοντέινερ, όλες οι παράμετροι καθορίζονται διαχωρισμένες με κόμμα. Αυτό θα μπορούσε να είναι gunicorn, npm, κ.λπ. Εάν δεν προσδιορίζεται, θα χρησιμοποιηθεί η τιμή της οδηγίας CMD από το Dockerfile. υποδεικνύουμε npm,start.

Μεταβλητές περιβάλλοντος — μεταβλητές περιβάλλοντος κοντέινερ. Αυτό μπορεί να είναι είτε απλά δεδομένα κειμένου είτε μυστικές μεταβλητές από Διαχειριστής μυστικών ή Κατάστημα παραμέτρων.

Αποθήκευση και Καταγραφή — εδώ θα ρυθμίσουμε τη σύνδεση στο CloudWatch Logs (υπηρεσία για αρχεία καταγραφής από το AWS). Για να το κάνετε αυτό, απλώς ενεργοποιήστε το πλαίσιο ελέγχου Auto-configure CloudWatch Logs. Μετά τη δημιουργία του ορισμού εργασιών, μια ομάδα αρχείων καταγραφής θα δημιουργηθεί αυτόματα στο CloudWatch. Από προεπιλογή, τα αρχεία καταγραφής αποθηκεύονται σε αυτό επ' αόριστον. Συνιστώ να αλλάξετε την περίοδο διατήρησης από Ποτέ δεν λήγει στην απαιτούμενη περίοδο. Αυτό γίνεται στις ομάδες καταγραφής CloudWatch, πρέπει να κάνετε κλικ στην τρέχουσα περίοδο και να επιλέξετε μια νέα.

Δημιουργία Scalable API σε AWS Spot Instances

ECS Cluster και ECS Capacity Provider

Μεταβείτε στην ενότητα ECS → Cluster για να δημιουργήσετε ένα σύμπλεγμα. Επιλέγουμε το EC2 Linux + Networking ως πρότυπο.

Όνομα συμπλέγματος - πολύ σημαντικό, κάνουμε εδώ το ίδιο όνομα με αυτό που καθορίζεται στην παράμετρο Launch Template ECS_CLUSTER, στην περίπτωσή μας - DemoApiClusterProd. Επιλέξτε το πλαίσιο ελέγχου Δημιουργία κενού συμπλέγματος. Προαιρετικά, μπορείτε να ενεργοποιήσετε το Container Insights για προβολή μετρήσεων για υπηρεσίες στο CloudWatch. Εάν τα κάνατε όλα σωστά, τότε στην ενότητα ECS Instances θα δείτε μηχανήματα που δημιουργήθηκαν στην ομάδα Auto Scaling.

Δημιουργία Scalable API σε AWS Spot Instances

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

Ομάδα αυτόματης κλιμάκωσης — επιλέξτε την ομάδα που δημιουργήθηκε προηγουμένως.

Διαχειριζόμενη κλιμάκωση — ενεργοποιήστε το έτσι ώστε ο πάροχος να μπορεί να κλιμακώσει την υπηρεσία.

Χωρητικότητα στόχος % — ποιο ποσοστό μηχανημάτων φορτωμένων με εργασίες χρειαζόμαστε. Εάν καθορίσετε 100%, τότε όλα τα μηχανήματα θα είναι πάντα απασχολημένα με την εκτέλεση εργασιών. Εάν καθορίσετε το 50%, τότε τα μισά αυτοκίνητα θα είναι πάντα δωρεάν. Σε αυτήν την περίπτωση, εάν υπάρξει απότομη άλμα στο φορτίο, τα νέα ταξί θα φτάσουν αμέσως σε δωρεάν αυτοκίνητα, χωρίς να χρειάζεται να περιμένουν να αναπτυχθούν περιπτώσεις.

Διαχειριζόμενη προστασία τερματισμού — ενεργοποίηση, αυτή η παράμετρος επιτρέπει στον πάροχο να αφαιρέσει την προστασία των παρουσιών από τη διαγραφή. Αυτό συμβαίνει όταν δεν υπάρχουν ενεργές εργασίες στο μηχάνημα και επιτρέπει τη χωρητικότητα στόχου%.

Υπηρεσία ECS και ρύθμιση κλιμάκωσης

Τελευταίο βήμα :) Για να δημιουργήσετε μια υπηρεσία, πρέπει να μεταβείτε στο σύμπλεγμα που δημιουργήθηκε προηγουμένως στην καρτέλα Υπηρεσίες.

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

Δημιουργία Scalable API σε AWS Spot Instances

Ορισμός Εργασίας — επιλέξτε τον ορισμό εργασίας που δημιουργήθηκε προηγουμένως και την αναθεώρησή του.

Ονομα Υπηρεσίας — για αποφυγή σύγχυσης, υποδεικνύουμε πάντα το ίδιο με τον ορισμό εργασίας.

Υπηρεσία τύπου - πάντα Ρεπλίκα.

Αριθμός εργασιών — τον επιθυμητό αριθμό ενεργών εργασιών στην υπηρεσία. Αυτή η παράμετρος ελέγχεται με κλιμάκωση, αλλά πρέπει ακόμα να καθοριστεί.

Ελάχιστο υγιές ποσοστό и Μέγιστο ποσοστό — καθορίζει τη συμπεριφορά των εργασιών κατά την ανάπτυξη. Οι προεπιλεγμένες τιμές είναι 100 και 200, υποδεικνύοντας ότι κατά τη στιγμή της ανάπτυξης ο αριθμός των εργασιών θα αυξηθεί αρκετές φορές και στη συνέχεια θα επιστρέψει στην επιθυμητή τιμή. Εάν έχετε 1 εργασία που εκτελείται, min=0 και max=100, τότε κατά την ανάπτυξη θα σκοτωθεί και μετά θα ανέβει μια νέα, δηλαδή θα είναι εκτός λειτουργίας. Εάν εκτελείται 1 εργασία, min=50, max=150, τότε η ανάπτυξη δεν θα γίνει καθόλου, επειδή 1 εργασία δεν μπορεί να διαιρεθεί στο μισό ή να αυξηθεί κατά μιάμιση φορά.

Τύπος ανάπτυξης — έξοδος από την Κυλιόμενη ενημέρωση.

Πρότυπα τοποθέτησης — κανόνες για την τοποθέτηση εργασιών σε μηχανές. Η προεπιλογή είναι AZ Balanced Spread - αυτό σημαίνει ότι κάθε νέα εργασία θα τοποθετείται σε μια νέα παρουσία έως ότου αυξηθούν τα μηχανήματα σε όλες τις ζώνες διαθεσιμότητας. Συνήθως κάνουμε BinPack - CPU και Spread - AZ· με αυτήν την πολιτική, οι εργασίες τοποθετούνται όσο το δυνατόν πιο πυκνά σε ένα μηχάνημα ανά CPU. Εάν είναι απαραίτητο να δημιουργήσετε ένα νέο μηχάνημα, δημιουργείται σε μια νέα ζώνη διαθεσιμότητας.

Δημιουργία Scalable API σε AWS Spot Instances

Τύπος εξισορροπητή φορτίου — επιλέξτε Application Load Balancer.

Ρόλος IAM υπηρεσίας - επιλέξτε ecsServiceRole.

Όνομα εξισορροπητή φορτίου — επιλέξτε τον εξισορροπητή που δημιουργήθηκε προηγουμένως.

Περίοδος χάριτος για έλεγχο υγείας — παύση πριν από την εκτέλεση υγειονομικών ελέγχων μετά την κυκλοφορία μιας νέας εργασίας, συνήθως την ορίζουμε στα 60 δευτερόλεπτα.

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

Δημιουργία Scalable API σε AWS Spot Instances

Αυτόματη κλιμάκωση σέρβις — παράμετροι κλιμάκωσης υπηρεσίας. Επιλέξτε Configure Service Auto Scaling για να προσαρμόσετε τον επιθυμητό αριθμό της υπηρεσίας σας. Ορίζουμε τον ελάχιστο και μέγιστο αριθμό εργασιών κατά την κλιμάκωση.

Ρόλος IAM για την αυτόματη κλιμάκωση σέρβις - επιλέξτε AWSServiceRoleForApplicationAutoScaling_ECSService.

Πολιτικές αυτόματης κλιμάκωσης εργασιών — κανόνες για την κλιμάκωση. Υπάρχουν 2 τύποι:

  1. Παρακολούθηση στόχου — παρακολούθηση μετρήσεων στόχου (χρήση CPU/RAM ή αριθμός αιτημάτων για κάθε εργασία). Για παράδειγμα, θέλουμε ο μέσος φόρτος επεξεργαστή να είναι 85%, όταν γίνει υψηλότερος, θα προστεθούν νέες εργασίες μέχρι να φτάσει την τιμή στόχο. Εάν το φορτίο είναι χαμηλότερο, τότε οι εργασίες θα αφαιρεθούν, αντίθετα, εκτός εάν είναι ενεργοποιημένη η προστασία από μείωση της κλιμάκωσης (Απενεργοποίηση κλιμάκωσης).
  2. Κλιμάκωση βημάτων - αντίδραση σε αυθαίρετο γεγονός. Εδώ μπορείτε να διαμορφώσετε μια αντίδραση σε οποιοδήποτε συμβάν (Συναγερμός CloudWatch), όταν συμβεί, μπορείτε να προσθέσετε ή να αφαιρέσετε τον καθορισμένο αριθμό εργασιών ή να καθορίσετε τον ακριβή αριθμό εργασιών.

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

Συμπέρασμα

Εάν ακολουθήσατε τις οδηγίες και χρησιμοποιήσατε την ίδια εικόνα Docker, η υπηρεσία σας θα πρέπει να επιστρέψει μια σελίδα όπως αυτή.

Δημιουργία Scalable API σε AWS Spot Instances

  1. Έχουμε δημιουργήσει ένα πρότυπο σύμφωνα με το οποίο εκκινούνται όλα τα μηχανήματα στην υπηρεσία. Μάθαμε επίσης πώς να ενημερώνουμε μηχανές όταν αλλάζει το πρότυπο.
  2. Έχουμε διαμορφώσει τις παραμέτρους της επεξεργασίας του σήματος διακοπής στιγμιαίου στιγμιότυπου, επομένως μέσα σε ένα λεπτό μετά τη λήψη του, όλες οι εκτελούμενες εργασίες αφαιρούνται από το μηχάνημα, ώστε να μην χάνεται ή να διακόπτεται τίποτα.
  3. Ανυψώσαμε τον εξισορροπητή για να κατανεμηθεί ομοιόμορφα το φορτίο στα μηχανήματα.
  4. Έχουμε δημιουργήσει μια υπηρεσία που εκτελείται επί τόπου, η οποία μειώνει το κόστος του μηχανήματος κατά περίπου 3 φορές.
  5. Έχουμε διαμορφώσει την αυτόματη κλιμάκωση και προς τις δύο κατευθύνσεις, ώστε να χειριζόμαστε αυξημένο φόρτο εργασίας χωρίς να επιβαρύνουμε το κόστος διακοπής λειτουργίας.
  6. Χρησιμοποιούμε το Capacity Provider ώστε η εφαρμογή να διαχειρίζεται την υποδομή (μηχανήματα) και όχι το αντίστροφο.
  7. Είμαστε υπέροχοι.

Εάν έχετε προβλέψιμες αιχμές στο φορτίο, για παράδειγμα, διαφημίζεστε σε μια μεγάλη καμπάνια ηλεκτρονικού ταχυδρομείου, μπορείτε να ρυθμίσετε την κλιμάκωση κατά ΧΡΟΝΟΔΙΑΓΡΑΜΜΑ.

Μπορείτε επίσης να κλιμακώσετε με βάση δεδομένα από διαφορετικά μέρη του συστήματός σας. Για παράδειγμα, έχουμε τη λειτουργικότητα αποστολή μεμονωμένων προωθητικών προσφορών χρήστες της εφαρμογής για κινητά. Μερικές φορές μια καμπάνια αποστέλλεται σε 1 εκατομμύριο+ άτομα. Μετά από μια τέτοια διανομή, υπάρχει πάντα μεγάλη αύξηση των αιτημάτων στο API, αφού πολλοί χρήστες συνδέονται ταυτόχρονα στην εφαρμογή. Έτσι, αν δούμε ότι υπάρχουν σημαντικά περισσότεροι τυπικοί δείκτες στην ουρά για την αποστολή προωθητικών ειδοποιήσεων push, μπορούμε να ξεκινήσουμε αμέσως πολλά πρόσθετα μηχανήματα και εργασίες για να είμαστε έτοιμοι για τη φόρτωση.

Θα χαρώ αν μου πείτε στα σχόλια ενδιαφέρουσες περιπτώσεις χρήσης σποτ και ECS ή κάτι για κλιμάκωση.

Σύντομα θα υπάρξουν άρθρα σχετικά με το πώς επεξεργαζόμαστε χιλιάδες αναλυτικά συμβάντα ανά δευτερόλεπτο σε μια στοίβα κατά κύριο λόγο χωρίς διακομιστή (με χρήματα) και πώς λειτουργεί η ανάπτυξη των υπηρεσιών χρησιμοποιώντας το GitLab CI και το Terraform Cloud.

Εγγραφείτε σε εμάς, θα είναι ενδιαφέρον!

Μόνο εγγεγραμμένοι χρήστες μπορούν να συμμετάσχουν στην έρευνα. Συνδεθείτε, Σας παρακαλούμε.

Χρησιμοποιείτε spot στιγμιότυπα στην παραγωγή;

  • 22,2%Ναι 6

  • 66,7%Νο18

  • 11,1%Έμαθα για αυτά από ένα άρθρο και σκοπεύω να τα χρησιμοποιήσω3

Ψήφισαν 27 χρήστες. 5 χρήστες απείχαν.

Πηγή: www.habr.com

Προσθέστε ένα σχόλιο