Environnements Docker gérés par ECS avec la console Elastic Beanstalk - AWS Elastic Beanstalk

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Environnements Docker gérés par ECS avec la console Elastic Beanstalk

Vous pouvez lancer un cluster d'instances multiconteneurs dans un environnement Elastic Beanstalk à instance unique ou évolutif, à l'aide de la console Elastic Beanstalk. Ce didacticiel détaille la configuration des conteneurs et la préparation du code source pour un environnement qui utilise deux conteneurs.

Les conteneurs, une application PHP et un proxy nginx, exécutés côte à côte sur chacune des instances Amazon Elastic Compute Cloud (Amazon EC2) dans un environnement Elastic Beanstalk. Après avoir créé l'environnement et vérifié que les applications sont en cours d'exécution, vous allez vous connecter à une instance de conteneur pour voir comment tout fonctionne ensemble.

Définir les conteneurs Docker gérés par ECS

La première étape de la création d'un environnement Docker consiste à créer un répertoire pour vos données d'application. Ce dossier peut être situé n'importe où sur votre ordinateur local et porter le nom de votre choix. En plus d'un fichier de configuration de conteneur, ce dossier inclut le contenu que vous téléchargez sur Elastic Beanstalk et que vous déployez dans votre environnement.

Note

Tout le code pour ce didacticiel est disponible dans le référentiel awslabs sur GitHub à l'emplacement suivant : https://github.com/awslabs/eb-docker-nginx-proxy.

Le fichier utilisé par Elastic Beanstalk pour configurer les conteneurs sur une instance Amazon EC2 est un fichier texte au format JSON nommé Dockerrun.aws.json. Créez un fichier texte portant ce nom à la racine de votre application et ajoutez le texte suivant :

{ "AWSEBDockerrunVersion": 2, "volumes": [ { "name": "php-app", "host": { "sourcePath": "/var/app/current/php-app" } }, { "name": "nginx-proxy-conf", "host": { "sourcePath": "/var/app/current/proxy/conf.d" } } ], "containerDefinitions": [ { "name": "php-app", "image": "php:fpm", "essential": true, "memory": 128, "mountPoints": [ { "sourceVolume": "php-app", "containerPath": "/var/www/html", "readOnly": true } ] }, { "name": "nginx-proxy", "image": "nginx", "essential": true, "memory": 128, "portMappings": [ { "hostPort": 80, "containerPort": 80 } ], "links": [ "php-app" ], "mountPoints": [ { "sourceVolume": "php-app", "containerPath": "/var/www/html", "readOnly": true }, { "sourceVolume": "nginx-proxy-conf", "containerPath": "/etc/nginx/conf.d", "readOnly": true }, { "sourceVolume": "awseb-logs-nginx-proxy", "containerPath": "/var/log/nginx" } ] } ] }

Cet exemple de configuration définit deux conteneurs, un site web PHP avec un proxy nginx devant. Ces deux conteneurs s'exécutent côte à côte dans des conteneurs Docker sur chaque instance dans votre environnement Elastic Beanstalk, accédant à du contenu partagé (le contenu du site web) à partir de volumes sur l'instance hôte, qui sont aussi définis dans ce fichier. Les conteneurs eux-mêmes sont créés à partir d'images hébergées dans des référentiels officiels sur Docker Hub. Vous obtenez alors un environnement similaire au suivant :

Les volumes définis dans la configuration correspondent au contenu que vous allez créer ensuite et télécharger dans le cadre du groupe source de votre application. Les conteneurs accèdent au contenu sur l'hôte en montant des volumes dans la section mountPoints des définitions de conteneur.

Pour de plus amples informations sur le format du fichier Dockerrun.aws.json et ses paramètres, veuillez consulter Format des définitions de conteneur.

Ajout de contenu

Ensuite, vous allez ajouter du contenu à votre site PHP pour l'afficher aux visiteurs, et un fichier de configuration pour le proxy nginx.

php-app/index.php

<h1>Hello World!!!</h1> <h3>PHP Version <pre><?= phpversion()?></pre></h3>

php-app/static.html

<h1>Hello World!</h1> <h3>This is a static HTML page.</h3>

proxy/conf.d/default.conf

server { listen 80; server_name localhost; root /var/www/html; index index.php; location ~ [^/]\.php(/|$) { fastcgi_split_path_info ^(.+?\.php)(/.*)$; if (!-f $document_root$fastcgi_script_name) { return 404; } include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_path_info; fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info; fastcgi_pass php-app:9000; fastcgi_index index.php; } }

Déploiement sur Elastic Beanstalk

Votre dossier d'application contient maintenant les fichiers suivants :

├── Dockerrun.aws.json ├── php-app │   ├── index.php │   └── static.html └── proxy └── conf.d └── default.conf

C'est tout ce dont vous avez besoin pour créer l'environnement Elastic Beanstalk. Créez une archive .zip des fichiers et dossiers ci-dessus (sans inclure le dossier de projet de niveau supérieur). Pour créer l'archive dans l'Explorateur Windows, sélectionnez le contenu du dossier de projet, effectuez un clic droit, sélectionnez Envoyer vers, puis cliquez sur Dossier compressé.

Note

Pour de plus amples informations sur la structure de fichiers requise et pour obtenir des instructions pour créer des archives dans d'autres environnements, veuillez consulter Création d'une offre groupée de source d'application

Ensuite, téléchargez le bundle de fichiers source sur Elastic Beanstalk et créez votre environnement. Pour Platform (Plateforme), sélectionnez Docker. Pour Platform branch (Branche de plateforme), sélectionnez ECS running on 64bit Amazon Linux 2 (ECS s'exécutant sur Amazon Linux 2 64 bits).

Pour lancer un environnement (console)
  1. Ouvrez la console Elastic Beanstalk avec ce lien préconfiguré : console.aws.amazon.com/elasticbeanstalk/home#/newApplication?applicationName=tutorials&environmentType=LoadBalanced

  2. Pour Plateforme, sélectionnez la plateforme et la branche de plateforme qui correspondent à la langue utilisée par votre application, ou la plateforme Docker pour les applications basées sur des conteneurs.

  3. Pour Application code (Code d'application), choisissez Upload your code (Charger votre code).

  4. Choisissez Local file (Fichier local), Choose file (Choisir un fichier), puis ouvrez le bundle source.

  5. Choisissez Vérifier et lancer.

  6. Vérifiez les paramètres disponibles et choisissez Créer une application.

La console Elastic Beanstalk vous redirige vers le tableau de bord de gestion pour votre nouvel environnement. Cet écran présente l'état de l'environnement et la sortie d'événements par le service Elastic Beanstalk. Quand le statut est vert, cliquez sur l'URL à côté du nom de l'environnement pour voir votre nouveau site web.

Connexion à une instance de conteneur

Ensuite, vous vous connectez à une instance EC2 dans votre environnement Amazon EC2 pour voir le fonctionnement de certains des éléments mobiles.

La manière la plus simple de se connecter à une instance dans votre environnement consiste à utiliser l'interface de ligne de commande (CLI) EB. Pour l'utiliser, installez l'interface de ligne de commande (CLI) EB, si vous ne l'avez pas déjà fait. Vous devez également configurer votre environnement avec une paire de clés SSH Amazon EC2. Utilisez soit la page de configuration de la sécurité de la console, soit la commande eb init de l'interface de ligne de commande (CLI) EB. Pour vous connecter à une instance de l'environnement, utilisez la commande eb ssh de l'interface de ligne de commande (CLI) EB.

Maintenant que vous êtes connecté à l'instance Amazon EC2 hébergeant vos conteneurs docker, vous avez accès à la configuration. Exécutez ls sur /var/app/current :

[ec2-user@ip-10-0-0-117 ~]$ ls /var/app/current Dockerrun.aws.json php-app proxy

Ce répertoire contient les fichiers du groupe source que vous avez téléchargés sur Elastic Beanstalk pendant la création de l'environnement.

[ec2-user@ip-10-0-0-117 ~]$ ls /var/log/containers nginx-proxy nginx-proxy-4ba868dbb7f3-stdouterr.log php-app php-app-dcc3b3c8522c-stdouterr.log rotated

C'est à cet emplacement que les journaux sont créés sur l'instance de conteneur et collectés par Elastic Beanstalk. Elastic Beanstalk crée un volume dans ce répertoire pour chaque conteneur, que vous montez sur l'emplacement du conteneur où les journaux sont écrits.

Vous pouvez également regarder Docker pour voir les conteneurs en cours d'exécution avec docker ps.

[ec2-user@ip-10-0-0-117 ~]$ sudo docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 4ba868dbb7f3 nginx "/docker-entrypoint.…" 4 minutes ago Up 4 minutes 0.0.0.0:80->80/tcp, :::80->80/tcp ecs-awseb-Tutorials-env-dc2aywfjwg-1-nginx-proxy-acca84ef87c4aca15400 dcc3b3c8522c php:fpm "docker-php-entrypoi…" 4 minutes ago Up 4 minutes 9000/tcp ecs-awseb-Tutorials-env-dc2aywfjwg-1-php-app-b8d38ae288b7b09e8101 d9367c0baad6 amazon/amazon-ecs-agent:latest "/agent" 5 minutes ago Up 5 minutes (healthy) ecs-agent

Vous pouvez y voir les deux conteneurs en cours d'exécution que vous avez déployés, ainsi que l'agent de conteneur Amazon ECS qui a coordonné le déploiement.

Mise à jour de l'agent du conteneur Amazon ECS

Les instances Amazon EC2 d'un environnement Docker géré par ECS sur Elastic Beanstalk exécutent un processus d'agent dans un conteneur Docker. Cet agent se connecte à Amazon ECS service afin de coordonner des déploiements de conteneurs. Ces déploiements sont exécutés comme des tâches dans Amazon ECS, qui sont configurées dans les fichiers de définition de tâche. Elastic Beanstalk crée ces fichiers de définition de tâche en se basant sur le fichier Dockerrun.aws.json que vous téléchargez dans un groupe de fichiers source.

Vérifiez le statut de l'agent de conteneur avec une demande get HTTP pour http://localhost:51678/v1/metadata:

[ec2-user@ip-10-0-0-117 ~]$ curl http://localhost:51678/v1/metadata { "Cluster":"awseb-Tutorials-env-dc2aywfjwg", "ContainerInstanceArn":"arn:aws:ecs:us-west-2:123456789012:container-instance/awseb-Tutorials-env-dc2aywfjwg/db7be5215cd74658aacfcb292a6b944f", "Version":"Amazon ECS Agent - v1.57.1 (089b7b64)" }

Cette structure affiche le nom du cluster Amazon ECS et l'ARN (Amazon Resource Name) de l'instance de cluster (l'instance Amazon EC2 à laquelle vous êtes connecté).

Pour plus d'informations, exécutez une requête get HTTP sur http://localhost:51678/v1/tasks :

[ec2-user@ip-10-0-0-117 ~]$ curl http://localhost:51678/v1/tasks { "Tasks":[ { "Arn":"arn:aws:ecs:us-west-2:123456789012:task/awseb-Tutorials-env-dc2aywfjwg/bbde7ebe1d4e4537ab1336340150a6d6", "DesiredStatus":"RUNNING", "KnownStatus":"RUNNING", "Family":"awseb-Tutorials-env-dc2aywfjwg", "Version":"1", "Containers":[ { "DockerId":"dcc3b3c8522cb9510b7359689163814c0f1453b36b237204a3fd7a0b445d2ea6", "DockerName":"ecs-awseb-Tutorials-env-dc2aywfjwg-1-php-app-b8d38ae288b7b09e8101", "Name":"php-app", "Volumes":[ { "Source":"/var/app/current/php-app", "Destination":"/var/www/html" } ] }, { "DockerId":"4ba868dbb7f3fb3328b8afeb2cb6cf03e3cb1cdd5b109e470f767d50b2c3e303", "DockerName":"ecs-awseb-Tutorials-env-dc2aywfjwg-1-nginx-proxy-acca84ef87c4aca15400", "Name":"nginx-proxy", "Ports":[ { "ContainerPort":80, "Protocol":"tcp", "HostPort":80 }, { "ContainerPort":80, "Protocol":"tcp", "HostPort":80 } ], "Volumes":[ { "Source":"/var/app/current/php-app", "Destination":"/var/www/html" }, { "Source":"/var/log/containers/nginx-proxy", "Destination":"/var/log/nginx" }, { "Source":"/var/app/current/proxy/conf.d", "Destination":"/etc/nginx/conf.d" } ] } ] } ] }

Cette structure décrit la tâche qui est exécutée pour déployer les deux conteneurs Docker à partir du projet exemple de ce didacticiel. Les informations suivantes sont affichées :

  • KnownStatus – Le statut RUNNING indique que les conteneurs sont toujours actifs.

  • Famille – Nom de la définition de tâche créée par Elastic Beanstalk à partir du fichier Dockerrun.aws.json.

  • Version – Version de la définition de tâche. Elle est augmentée chaque fois que le fichier de définition de tâche est mis à jour.

  • Containers – Informations sur les conteneurs exécutés sur l'instance.

Encore plus d'informations sont disponibles à partir d'Amazon ECS service lui-même, que vous pouvez appeler à l'aide de l AWS Command Line Interface. Pour obtenir des instructions sur l'utilisation de l'interface de ligne de commande (AWS CLI) avec Amazon ECS et des informations sur Amazon ECS en général, consultez le Guide de l'utilisateur d'Amazon ECS.