[DOCKER] [Challenge CircleCI from 0] Comprendre AWS ECR / ECS

Contexte

Je vise à obtenir un emploi dans une entreprise développée en interne par des personnes inexpérimentées. J'ai décidé d'étudier CircleCI pour créer un bon portfolio.

Le niveau actuel de connaissances est le développement d'applications simples à l'aide de Ruby on rails, la gestion des versions à l'aide de git et le déploiement à l'aide d'heroku. J'espère que ce sera d'une certaine aide pour ceux qui envisagent d'essayer CircleCI à l'avenir au même niveau que leur propre mémorandum.

buts finaux

Comprenez AWS ECR / ECS. Essayez de déployer l'application manuellement à l'aide d'ECR et d'ECS.

【Article associé】 [Challenge CircleCI from 0] Apprenez les bases de CircleCI [Challenge CircleCI from 0] Construire un test automatisé (Rails6.0 / mysql8.0 / Rspec) [Challenge CircleCI from 0] Comprendre AWS ECR / ECS [Challenge CircleCI from 0] Déploiement automatique avec CircleCI / AWS (ECR / ECS)

environnement

ruby 2.6.6 rails 6.0 db: mysql 8.0 test: rspec

table des matières

  1. Qu'est-ce que l'ECR
  2. Qu'est-ce que l'ECS
  3. Déployez réellement ECR / ECS sur AWS

1. Qu'est-ce que l'ECR

À propos d'ECR

ECR est une abréviation de «Elastic Container Registry» et est un système de gestion d'image de conteneur sur AWS. Si vous avez déjà utilisé Docker, vous connaissez probablement Docker Hub, un service de registre cloud, mais en un mot, ECR est la version AWS de Dokcer Hub.

ECR est un service très utile lors du déploiement avec des conteneurs sur AWS. Bien sûr, vous pouvez l'exploiter à l'aide de Docker Hub, mais lorsque vous utilisez AWS dans un environnement de production, il est plus facile à gérer à l'aide d'ECR. ECR est un service géré par Amazon, sa sécurité est donc garantie.

Il n'y a pas de nouveaux concepts ou termes pour ECR, et si vous avez utilisé Docker Hub, vous le comprendrez tout de suite.

2. Qu'est-ce que ECS?

À propos d'ECS

ECS est une abréviation de «Elastic Container Service» et est un système d'exécution / de gestion de conteneurs sur AWS. En fait, l'ECR mentionné ci-dessus est également une sorte de service ECS. ECS est un système qui vous permet de démarrer, d'arrêter et de gérer facilement des conteneurs sur AWS.

Si vous souhaitez utiliser des conteneurs pour déployer votre application sur AWS production, ECS est un service indispensable. Cependant, il existe certains concepts et termes uniques avec lesquels il est difficile de démarrer. Alors tout d'abord, comprenons les termes et concepts propres à ECS.

À propos des concepts et des termes ECS

grappe

Un cluster Amazon ECS est un groupe logique de tâches ou de services. Si vous utilisez EC2 pour effectuer des tâches ou des services, le cluster est également un regroupement d'instances de conteneur. Si vous utilisez un fournisseur de capacité, le cluster est également un groupe logique de fournisseurs de capacité.

Officiel AWS dit comme ci-dessus. ECS utilise un serveur EC2 pour exécuter le conteneur, qui peut être un seul projet ou plusieurs serveurs EC2 pour un projet. Un cluster est un ensemble d'EC2 pour ce projet.

un service

Le service Amazon ECS vous permet d'exécuter et de gérer simultanément un nombre spécifié d'instances d'une définition de tâche dans un cluster Amazon ECS. Si une tâche échoue ou s'arrête pour une raison quelconque, Amazon ECS Service Scheduler lance une autre instance de la définition de tâche pour la remplacer et conserver le service autant de tâches que nécessaire. En plus de conserver le nombre requis de tâches dans le service, vous pouvez éventuellement exécuter le service derrière un équilibreur de charge. L'équilibreur de charge répartit le trafic entre les tâches associées au service.

Dans AWS Official, il est écrit comme ci-dessus. Le concept de service est très déroutant, mais la réponse simple est de connecter le conteneur à l'équilibreur de charge et de gérer les définitions de tâches appliquées au conteneur. En ce qui concerne les services, je pense que ce sera plus facile à comprendre si vous procédez aux réglages tout en déplaçant réellement vos mains.

tâche

Une tâche est un ensemble de conteneurs associés. C'est un peu difficile à comprendre, je vais donc l'expliquer avec un exemple concret. Il existe souvent deux configurations de conteneur pour les applications rails: serveur Web + serveur d'applications, mais si l'un des conteneurs est manquant, l'application ne démarre pas. Les conteneurs liés au démarrage de l'application de cette manière sont appelés tâches sur AWS. Dans AWS, il est nécessaire de définir une tâche pour démarrer un conteneur, ce que l'on appelle une définition de tâche.


## 3. Déployez réellement ECR / ECS sur AWS * On suppose qu'AWS VPC, ELB, RDS ont été définis et Dockerfile a été créé dans l'environnement de développement. Concernant AWS, [[Challenge AWS from 0] Deploy Rails apps to AWS using EC2 and VPC part1](https://qiita.com/shu1124/items/4a0337f3d9fa9227a705) Concernant Docker, [[Challenge Docker from 0] Construisez un environnement de développement pour nginx, puma, rails6.0, mysql en utilisant Docker](https://qiita.com/shu1124/items/ba370afcdfc99145e1dc) Si vous n'êtes pas sûr d'AWS ou de Docker, veuillez vous y référer.

organisation des fichiers

Cette fois, nous utiliserons une application existante. La structure des fichiers est la suivante. Desktop/ ├ webapp/     ├ containers       └ nginx         └ Dockerfile         └ nginx.conf     ├ enviroment       └ db.env     ├ Dockerfile     ├ docker-compose.yml     ├ Gemfile     ├ Gemfile.lock

Créer un référentiel avec ECR

Si vous recherchez ECR dans le menu AWS, vous trouverez ECR (* En fait, il y a un élément ECR dans ECS). Appuyez ensuite sur Créer un référentiel. Ensuite, l'écran suivant s'affichera, alors entrez le nom de votre choix pour le nom du référentiel. Étant donné que le référentiel est requis pour Dockerfile, nous allons créer deux types, un pour nginx et un pour l'application. Cela n'est pas nécessaire pour la base de données car elle utilise RDS. スクリーンショット 2020-10-26 14.20.46.png

Ensuite, le référentiel créé sera affiché dans le menu ECR. Sélectionnez-le et appuyez sur l'écran de commande push en haut à droite. Quatre commandes seront affichées comme indiqué ci-dessous: Copiez-les et exécutez-les dans le terminal. スクリーンショット 2020-10-26 14.22.47.png

Terminal


(Pour nginx)
docker build -t nginx -f ./container/nginx/Dockerfile .
(Pour l'application)
docker build -t app .

Terminal


$ curl "https://s3.amazonaws.com/aws-cli/awscli-bundle.zip" -o "awscli-bundle.zip"
$ unzip awscli-bundle.zip
$ sudo ./awscli-bundle/install -i /usr/local/aws -b /usr/local/bin/aws

Ceci termine les paramètres ECR. La commande d'affichage de commande push construit l'image et la pousse vers l'ECR. Cela signifie que l'image Docker locale est désormais stockée sur AWS.

Créer un cluster avec ECS

Création de cluster

Sélectionnez ensuite le cluster ECS dans le menu de gauche et cliquez sur Créer un cluster. Ensuite, l'écran suivant s'affiche. スクリーンショット 2020-10-26 14.36.02.png Sélectionnez «EC2 Linux + Networking» ici. Viennent ensuite les détails de configuration. (* "AWS Fargate" sera décrit plus tard) スクリーンショット 2020-10-26 14.38.24.png

Je n'expliquerai que la partie à falsifier dans les paramètres. --Définissez un nom de cluster descriptif. --Définissez le type d'instance EC2 sur "t2.micro". Veuillez noter que si vous sélectionnez autre chose, ce ne sera plus un niveau gratuit. --Réglez le nombre d'instances à 1. ――Choisissez la paire de clés que vous utilisez toujours lorsque vous êtes connecté à EC2. Si vous conservez la valeur par défaut, vous ne pourrez pas utiliser SSH dans EC2 créé à partir d'ECS.

Les autres pièces non mentionnées sont correctes par défaut. Ceci termine le cluster.

Création de tâches

Sélectionnez une définition de tâche dans le menu de gauche. L'écran de sélection de la compatibilité du type de démarrage sera affiché, donc sélectionnez EC2 (* Fargate sera décrit plus tard). Ensuite, l'écran de réglage suivant apparaîtra. スクリーンショット 2020-10-26 14.51.25.png Cela explique également uniquement le réglage des paramètres.

--Entrez un nom descriptif pour la définition de tâche. --Sélectionnez le pont comme mode réseau. Au fait, c'est le type de réseau utilisé par le conteneur docker

スクリーンショット 2020-10-26 15.11.51.png

Ajoutez maintenant deux conteneurs et cliquez sur Créer une définition de tâche. Ceci termine la tâche.

Ajouter un service

Sélectionnez le cluster ECS dans le menu de gauche et cliquez sur le cluster que vous venez de créer. L'écran de détails apparaîtra et le menu sera affiché en bas. Sélectionnez un service dans ce menu et appuyez sur le bouton Créer. スクリーンショット 2020-10-26 15.25.49.png

--Sélectionnez EC2 comme type de démarrage

Une fois la saisie ci-dessus terminée, appuyez sur l'étape suivante. Ensuite, l'écran suivant apparaîtra. スクリーンショット 2020-10-26 15.28.01.png

--Sélectionnez «Application Load Balancer» pour l'équilibrage de charge. Ensuite, un endroit pour sélectionner le nom de l'équilibreur de charge apparaîtra, alors sélectionnons l'équilibreur de charge créé

Après avoir terminé la saisie ci-dessus, appuyez sur l'étape suivante. Les paramètres continueront après cela, mais les valeurs par défaut sont correctes. Ceci termine le service.

Connectez ECS avec ssh ・ Accès avec navigateur

Vous êtes maintenant prêt à partir. Connectez-vous à ECS avec ssh et vérifiez s'il existe un conteneur. Sélectionnez le cluster que vous avez créé à partir du cluster dans le menu ECS et cliquez sur l'instance ECS dans le menu en bas. Puisqu'il existe un élément appelé instance EC2, vous pouvez vérifier l'EC2 créé via ECS à partir de là. Copiez l'adresse IP privée EC2 et saisissez ce qui suit dans le terminal.

Terminal


$ ssh -i [De la paire de clés] ec2-user@[IP publique]
(En cas de succès, il sera affiché comme ceci)
ast login: Sat Oct 24 10:28:34 2020 from 56.97.30.125.dy.iij4u.or.jp

   __|  __|  __|
   _|  (   \__ \   Amazon Linux 2 (ECS Optimized)
 ____|\___|____/

For documentation, visit http://aws.amazon.com/documentation/ecs

Après cela, vérifions le conteneur et l'image avec "docker ps" et [docker image]. Vous verrez probablement ce que vous avez créé jusqu'à présent. Enfin, allons à l'intérieur du conteneur, créons une base de données et migrons.

Terminal


$ docker exec -it [ID du conteneur] bash
$ rails db:create
$ rails db:migrate

Vous devriez maintenant pouvoir voir votre application dans votre navigateur. Pour vérifier avec un navigateur, sélectionnez Load Balancer dans le menu EC2 et entrez le nom DNS de l'équilibreur de charge spécifié lors de la création du service dans le navigateur.

c'est tout.



C'est un examen, mais le flux général est le suivant Enregistrer l'image docker dans ECR → Créer un cluster (la plus grande zone) → Définir la tâche (définir la relation de conteneur) → Créer un service (connecter le cluster et la tâche, l'équilibreur de charge et les paramètres du conteneur) → Terminé

Dans le prochain article, nous connecterons ECS et CircleCI pour créer un déploiement automatisé.

Résumé / impression

J'ai eu du mal parce qu'ECS était trop unique, mais quand je l'ai géré, je l'ai trouvé pratique. Étant donné que la connaissance d'AWS, de Docker et de CircleCI est indispensable, j'aimerais pouvoir mettre en place un déploiement automatique en me référant aux articles que j'ai écrits jusqu'à présent.

référence

[Livre] "Introduction à la pratique CircleCI ── La vitesse et la qualité de développement apportées par CI / CD Masato Urai (Auteur), Tomoya Otake (Auteur), Hirokuni Kim (Auteur)"

【qiita】 "Je viens de démarrer CircleCI, donc je l'ai résumé d'une manière facile à comprendre" "[Circle CI] Introduction à l'application Rails (à propos du fichier de configuration)" "Même les débutants peuvent le faire! Déploiement de conteneur de l'application Rails avec ECS x ECR x CircleCI

[Autres sites] "Déployer automatiquement sur ECR / ECS à l'aide de CircleCI Orbs"

Recommended Posts

[Challenge CircleCI from 0] Comprendre AWS ECR / ECS
[Challenge CircleCI from 0] Apprenez les bases de CircleCI
[Challenge CircleCI from 0] Construire un test automatisé (Rails6.0, mysql8.0, Rspec)