Déploiement d'une application Rails avec Amazon ECS
Marcin Doliwa
Software Engineer
Dans ce tutoriel, j'aimerais vous montrer comment déployer un exemple d'application Rails en utilisant l'Amazon Elastic Container Service (ECS).
Créons-le en lançant rails new sample-rails-apppuis générer une action de base du contrôleur rails g controller Welcome index et en définissant des itinéraires vers le chemin racine en tant que `root to : welcome#index".
Notre objectif est de voir cette page d'accueil déployée à l'aide d'ECS.
Créer un référentiel avec Amazon Elastic Container Registry (ECR)
Amazon ECR est un registre de conteneurs. Nous l'utiliserons pour stocker les images de notre application et les extraire afin qu'elles s'exécutent sur ECS.
Accédez à votre Panel AWSRechercher Conteneur élastique Registre et cliquez sur Commencer. L'écran ci-dessous s'affiche :
Nous allons créer un dépôt privé et le nommer sample-rails-app.
Le dépôt est là, mais il est vide. Nous voulons qu'il contienne l'image de notre application. C'est l'étape suivante.
# lance des erreurs si le fichier Gemfile a été modifié depuis Gemfile.lock
RUN bundle config --global frozen 1
WORKDIR /app
COPY Gemfile Gemfile.lock ./
Exécuter bundle install
COPY .
CMD ["rails", "server", "-b", "0.0.0.0"]
Ensuite, nous devrions construire une image et l'envoyer dans le dépôt ECR.
Avant cela, nous allons précompiler les assets avec `rails assets:precompile`.
Maintenant, allez dans le référentiel créé. En haut de l'écran, vous verrez une icône Visualiser les commandes push avec des détails sur la manière de procéder.
Dans mon cas (Linux), je l'exécute avec les instructions suivantes d'AWS :
Assurez-vous que votre utilisateur est autorisé à effectuer cette opération. J'ai ajouté la politique AmazonElasticContainerRegistryPowerUser à mon utilisateur, qui ressemble à ceci :
Je veux que le monde extérieur ne puisse se connecter qu'à mon Application Load Balancer. Il transmettra le trafic aux conteneurs qui s'exécutent dans notre cluster ECS.
Aller à Services EC2 -> Équilibrage de la charge -> Équilibreurs de charge, cliquez Créer un équilibreur de charge, sélectionner Équilibreur de charge d'application et cliquez sur le bouton Créer bouton.
Fixer son nom à sample-rails-app-albUtilisez votre VPC par défaut et sélectionnez tous ses sous-réseaux.
Il nous reste Groupes de sécurité et Écoute et routage sections.
Groupes de sécurité
Nous allons créer un nouveau groupe de sécurité pour notre équilibreur de charge. Il fonctionne comme un pare-feu ; nous allons définir les règles pour le trafic entrant et sortant. Nous voulons accepter le trafic http entrant (port TCP 80) et autoriser tout le trafic sortant.
Pour ce faire, cliquez sur le bouton "Créer un nouveau groupe de sécurité" lien.
Dans la section "Détails de base"Définir le nom et la description, laisser le VPC par défaut.
Dans mon cas - nom : "échantillon-rails-app-alb-sg", description : "http de l'extérieur, tout de l'intérieur"
Ajouter la règle de réception avec Type : HTTP et Source : Partout-IPv4. Laisser les règles de sortie telles qu'elles sont.
Cliquez sur créer un groupe de sécuritéPuis revenez à l'onglet où vous avez créé l'Application Load Balancer, rafraîchissez les groupes de sécurité et ajoutez celui que nous venons de créer, supprimez celui par défaut.
Écoute et routage
Dans cette section, nous allons définir vers où nous voulons que l'équilibreur de charge transmette le trafic. Laisser AuditeurProtocole et Port comme HTTP et 80, puisque c'est exactement ce que nous voulons, et cliquez sur "Créer un groupe cible" lien.
Fixer le nom à "échantillon-rails-app-alb-tg". Le seul changement est le numéro de port. Nous allons le passer au port 3000 car c'est celui de notre application Rails. Ignorez l'étape suivante (Cibles enregistrées) et créez le groupe cible.
Retournez maintenant à l'onglet où nous avons créé l'Application Load Balancer, rafraîchissez le groupe cible et sélectionnez celui que nous venons de créer.
Notre Application Load Balancer est prêt, jouons maintenant avec ECS.
Création d'un cluster ECS
Il y a beaucoup de termes effrayants que vous allez voir - cluster, tâches, définition des tâches, services. Pour simplifier, considérons le cluster comme un groupe de serveurs (instances EC2). Sur chacun d'entre eux, nous exécutons des tâches, qui sont simplement un groupe de conteneurs fonctionnant ensemble. La définition des tâches décrit quels conteneurs se trouvent dans un groupe donné et quelles ressources nous aimerions leur donner (mémoire, cpu). Les services gardent un œil sur ces tâches pour s'assurer qu'il y a toujours un nombre correct de tâches saines en cours d'exécution dans notre cluster.
Dans cette optique, créons notre cluster.
Accédez à la page du SCE et cliquez sur le bouton Les grappes lien et Créer un cluster bouton. Choisissez l'option "EC2 + Linux en réseau"Un seul clic Prochaine étape.
Définir le nom du cluster à "échantillon-rails-app-cluster". Choisissez le type d'instance EC2, j'ai pris celle de t2-micro car elle est disponible dans le plan Free Tier. Laissez le nombre d'instances à 1.
Dans la section réseau, utilisez votre VPC par défaut et sélectionnez tous ses sous-réseaux. Cliquez sur create, attendez un peu et voilà, nous avons créé un nouveau cluster ECS.
Définition des tâches
Cliquez sur l'icône Définitions des tâches lien, puis Créer une nouvelle définition de tâche bouton. Sélectionnez le bouton EC2 et cliquez sur Prochaine étape. L'application que nous allons exécuter est très simple, nous n'avons donc besoin que de quelques options ici.
Set (jeu de mots) Définition des tâches en "sample-rails-app"puis aller directement à la page d'accueil de la Définitions des conteneurs et cliquez sur "Ajouter un conteneur". Nommez le conteneur "sample-rails-app"et définir l'emplacement de l'image au format "repository-url/image:tag". Dans le nouvel onglet du navigateur, allez à l'ECR pour copier l'URI de l'image. Dans mon cas, il s'agissait de "212516879399.dkr.ecr.eu-central-1.amazonaws.com/sample-rails-app:latest".
Fixez votre limite de mémoire à la valeur recommandée de 300-500MiB. Maintenant, la chose la plus délicate - le mappage des ports.
Notre application tourne à l'intérieur d'un conteneur sur le port 3000. Mettez donc 3000 comme port de conteneur. Nous allons entrer 0 comme port hôte, ce qui signifie essentiellement qu'il sélectionne un port aléatoire. Heureusement, notre Application Load Balancer connaîtra ce mappage de port et pourra diriger le trafic correctement. Nous pouvons même exécuter plusieurs tâches sur cette seule instance.
Ajouter la variable d'environnement RAILS_ENV et de le fixer à production.
Cliquez maintenant sur Ajouter pour ajouter notre définition de conteneur et cliquez sur Créer pour terminer la configuration de la définition des tâches.
Service
Nous avons notre cluster, notre équilibreur de charge et la définition des tâches. Nous devons maintenant exécuter ces tâches au sein de notre cluster. C'est le travail des services. Allez dans le cluster nouvellement créé, sélectionnez l'option Services et cliquez sur l'onglet Créer bouton.
Définir le type de lancement à EC2, ajouter le nom "échantillon-rails-app-service". Réglez le nombre de tâches sur 1 et cliquez sur Prochaine étape. Sur cette page, sélectionnez le bouton radio Application Load Balancer et choisissez le rôle IAM existant pour celui-ci. Dans la section "Container to load balancer", vous devriez déjà avoir saisi un conteneur correct "sample-rails-app:0:3000", puis cliquez sur "Add to load balancer".
Pour le "Port de l'auditeur de production", choisissez 80:HTTP ; pour le nom du groupe cible, utilisez celui que nous avons créé précédemment - "".échantillon-rails-app-alb-tg"et cliquez sur Prochaine étape. Laisser Mise à l'échelle automatique telles qu'elles sont, cliquez sur Prochaine étape et Créer un service.
Mise à jour du groupe de sécurité ECS
Vous pouvez aller sur la page du cluster créé et vérifier le Tâches Dans les onglets, il devrait y avoir une tâche en cours d'exécution. Le service l'a démarrée. Maintenant, allez sur la page du service EC2, cliquez sur Load Balancers et voyez les détails de notre Application Load Balancer. Vous devriez y trouver son nom DNS. Copiez-le et ouvrez-le dans le navigateur. Il devrait vous diriger vers notre application. Malheureusement, nous obtenons le message "504 délai d'attente de la passerelle"erreur.
Le problème se situe au niveau du groupe de sécurité de notre cluster. Ses règles d'entrée n'autorisent pas le trafic entrant depuis l'équilibreur de charge. Pour y remédier, retournez dans le panneau EC2 et cliquez sur le bouton Groupes de sécurité lien. Un nouveau groupe a été créé au cours du processus de création du cluster. Son nom doit commencer par "EC2ContainerService-sample-rails-app-cluster". Cliquez dessus et modifiez les règles d'entrée. Comme nous voulons autoriser tout trafic en provenance de notre VPC, allez dans le panneau Amazon VPC et vérifiez quel est le CIDR IPv4 de votre VPC. Définissez le type de règle à "Tout le trafic"et la source à IPv4 CIDR. Enregistrez cette règle et essayez de charger le nom DNS de l'équilibreur.
J'espère que vous verrez la même chose que moi 🙂 .