Déploiement d'une appli web conteneurisée sur Amazon Lightsail
GUIDE DE DÉMARRAGE
Module 4 : Déploiement d'une nouvelle version de conteneur
Dans ce module, vous apprendrez à mettre à jour un conteneur qui a déjà été déployé
Introduction
Une application subira de nombreuses mises à jour durant sa vie. Dans ce module, vous apprendrez comment mettre à jour votre déploiement et comment restaurer un déploiement, dans l'éventualité où la nouvelle version de l'application présente des problèmes.
Ce que vous apprendrez
- Mise à jour du code d'application et création d'une nouvelle image de conteneur
- Envoi de l'image de conteneur mise à jour vers Amazon Lightsail
- Déploiement de la nouvelle version de votre application
- Restauration d'un déploiement, en cas de problème
Durée
10 minutes
Prérequis du module
- Compte AWS avec accès administrateur**
- Dernière version de Chrome ou de Firefox (recommandé)
[**]Les comptes créés au cours des dernières 24 heures n'ont sans doute pas encore accès aux services requis pour ce didacticiel.
Implémentation
Mise à jour de votre code d'application et création d'une nouvelle image de conteneur
Supposons que le nom de la ville repris sur la page d'accueil de l'application n'est pas correct et doit être modifié.
Ouvrez le fichier code/templates/index.html. Recherchez « Las Vegas » et remplacez-le par « Paris ».
Ensuite, créez et testez le conteneur comme expliqué au module 2. Ouvrez un terminal et entrez les commandes suivantes :
# build the container
docker build -t demo-flask-signup .
# run the container for local testing
docker run -p 8080:80 \
--rm \
-v ~/.aws:/root/.aws \
demo-flask-signup:latest
Maintenant que le conteneur est exécuté, ouvrez un navigateur et pointez-le vers http://localhost:8080. Vous devriez voir l'écran d'accueil de l'application reprenant le nouveau nom de ville.

Envoi de l'image de conteneur mise à jour vers Amazon Lightsail
Maintenant que le conteneur est créé, l'étape suivante consiste à envoyer cette nouvelle image de conteneur vers Amazon Lightsail.
Ouvrez un terminal et entrez les commandes suivantes :
aws lightsail push-container-image \
--region eu-west-3 \
--service-name signup-application \
--label latest \
--image demo-flask-signup:latest
# the command outputs the following lines
df0f7d33bb59: Pushed
951ffe99d911: Pushed
cee40450fe90: Pushed
1327150a5178: Pushed
4bc5d67b6427: Layer already exists
ce8ffb5c560e: Layer already exists
4226d5d0360f: Layer already exists
9d1af766c818: Layer already exists
d97733c0a3b6: Layer already exists
c553c6ba5f13: Layer already exists
48b4a40de359: Layer already exists
ace9ed9bcfaf: Layer already exists
764055ebc9a7: Layer already exists
Digest: sha256:42d2e19ee7340bc7f028593318e9b7406e9e70fb4785618d3f6c78443e097a87
Image "demo-flask-signup:latest" registered.
Refer to this image as ":signup-application.latest.2" in deployments.
La dernière liste du résultat affiche le nom interne de votre conteneur. Notez-le car nous aurons besoin de ce nom pour déployer le conteneur sur le service de conteneur. Si vous souhaitez accéder ultérieurement au nom du conteneur, vous pouvez entrer la commande suivante :
aws lightsail get-container-images \
--region eu-west-3 \
--service-name signup-application
# the command outputs the following lines
{
"containerImages": [
{
"image": ":signup-application.latest.2",
"digest": "sha256:42d2e19ee7340bc7f028593318e9b7406e9e70fb4785618d3f6c78443e097a87",
"createdAt": "2021-07-17T18:34:00+02:00"
},
{
"image": ":signup-application.latest.1",
"digest": "sha256:128f84907d30a1fb47c1888720485fa8050cc99bc1034e0cfd1f46d3b6e57e19",
"createdAt": "2021-07-17T15:11:49+02:00"
}
]
}
Notez le statut "state": "DEPLOYING" (« état » : « DÉPLOIEMENT »). Après quelques instants, l'état devient ACTIVE (ACTIF). Le déploiement dure quelques minutes. Vous pouvez vérifier l'état de votre déploiement à l'aide de la commande suivante :
# while deploying
aws lightsail get-container-services \
--region eu-west-3 \
--query "containerServices[].nextDeployment.state"
# once deployed
aws lightsail get-container-services \
--region eu-west-3 \
--query "containerServices[].currentDeployment.state"
Test de votre déploiement
Pour tester votre déploiement, retrouvez d'abord l'URL que Lightsail vous a créée. Ouvrez un terminal et entrez la commande suivante :
aws lightsail get-container-services \
--region eu-west-3 \
--query "containerServices[].url"
# the command outputs something like the below
[
"https://signup-application.me04fvc6dbk4e.eu-west-3.cs.amazonlightsail.com/"
]
Nous avons désormais deux versions de notre image de conteneur – :signup-application.latest.1 et :signup-application.latest.2.
Déploiement d'une nouvelle version de votre application
Maintenant que l'image de conteneur est stockée sur Amazon Lightsail, nous pouvons déployer l'image vers le service de conteneur à l'aide des mêmes commandes que décrites dans le module précédent : Déploiement d'un conteneur.
Modifiez le fichier lc.json et remplacez le nom de l'image à utiliser – :signup-application.latest.1 – par la nouvelle version :signup-application.latest.2.
Le nouveau fichier lc.json devrait ressembler à ceci :
{
"serviceName": "signup-application",
"containers": {
"signup-app-container": {
"image": ":signup-application.latest.2",
"ports": {
"80": "HTTP"
}
}
},
"publicEndpoint": {
"containerName": "signup-app-container",
"containerPort": 80
}
}
Ensuite, déployez le conteneur en entrant la commande suivante :
aws lightsail create-container-service-deployment \
--region eu-west-3 \
--cli-input-json file://lc.json
# the command outputs the following
Test de votre déploiement
Pour tester le déploiement, basculez dans la fenêtre du navigateur et rafraîchissez la page de l'URL du service de conteneur fournie au module précédent.
Vous pouvez retrouver l'URL en entrant cette commande dans un terminal :
aws lightsail get-container-services \
--region eu-west-3 \
--query "containerServices[].url"
# the command outputs something like the below
[
"https://signup-application.me04fvc6dbk4e.eu-west-3.cs.amazonlightsail.com/"
]
Restauration d'un déploiement
Le dernier déploiement n'a pas écrasé la première version de l'application, il a simplement créé une nouvelle version.
Pour vérifier les versions disponibles, ouvrez un terminal et entrez la commande suivante :
aws lightsail get-container-service-deployments \
--region eu-west-3 \
--service-name signup-application
# the command outputs a JSON similar to this one
{
"deployments": [
{
"version": 2,
"state": "ACTIVE",
"containers": {
"signup-app-container": {
"image": ":signup-application.latest.2",
"command": [],
"environment": {},
"ports": {
"80": "HTTP"
}
}
},
"publicEndpoint": {
"containerName": "signup-app-container",
"containerPort": 80,
"healthCheck": {
"healthyThreshold": 2,
"unhealthyThreshold": 2,
"timeoutSeconds": 2,
"intervalSeconds": 5,
"path": "/",
"successCodes": "200-499"
}
},
"createdAt": "2021-07-17T18:40:58+02:00"
},
{
"version": 1,
"state": "INACTIVE",
"containers": {
"signup-app-container": {
"image": ":signup-application.latest.1",
"command": [],
"environment": {},
"ports": {
"80": "HTTP"
}
}
},
"publicEndpoint": {
"containerName": "signup-app-container",
"containerPort": 80,
"healthCheck": {
"healthyThreshold": 2,
"unhealthyThreshold": 2,
"timeoutSeconds": 2,
"intervalSeconds": 5,
"path": "/",
"successCodes": "200-499"
}
},
"createdAt": "2021-07-17T15:31:01+02:00"
}
]
}
En lisant le résultat de la commande précédente, vous pouvez voir que deux déploiements sont réalisés. La version 1 est à l'état INACTIVE (INACTIF), tandis que la version 2 est ACTIVE (ACTIF).
La commande suivante donne une présentation moins détaillée de vos déploiements :
aws lightsail get-container-service-deployments \
--region eu-west-3 \
--service-name signup-application \
--query 'deployments[].{version: version, state: state, image: containers."signup-app-container".image}'
# the command outputs something similar to
[
{
"version": 2,
"state": "ACTIVE",
"image": ":signup-application.latest.2"
},
{
"version": 1,
"state": "INACTIVE",
"image": ":signup-application.latest.1"
}
]
Imaginez maintenant que la dernière version de l'application que vous venez de déployer ne se comporte pas correctement. Il se peut qu'un bogue n'ait pas été détecté pendant le test.
Pour accéder au journal de vos conteneurs, ouvrez un terminal et entrez la commande suivante :
aws lightsail get-container-log \
--region eu-west-3 \
--service-name signup-application \
--container-name signup-app-container \
--output text
# the command outputs log lines similar to this
LOGEVENTS 2021-07-17T18:14:51+02:00 [pid: 26|app: 0|req: 5821/5821] 172.26.7.236 () {34 vars in 401 bytes} [Sat Jul 17 16:14:51 2021] GET / => generated 4579 bytes in 0 msecs (HTTP/1.1 200) 2 headers in 81 bytes (1 switches on core 0)
LOGEVENTS 2021-07-17T18:14:51+02:00 [pid: 23|app: 0|req: 5824/5824] 172.26.7.236 () {34 vars in 402 bytes} [Sat Jul 17 16:14:51 2021] GET / => generated 4579 bytes in 0 msecs (HTTP/1.1 200) 2 headers in 81 bytes (1 switches on core 0)
LOGEVENTS 2021-07-17T18:14:51+02:00 172.26.7.236 - - [17/Jul/2021:16:14:51 +0000] "GET / HTTP/1.1" 200 4579 "-" "ELB-HealthChecker/2.0" "-"
Pour restaurer rapidement votre déploiement et redéployer la version précédente de l'application, modifiez le fichier lc.json pour qu'il utilise la première version de l'image de conteneur et redéployer celle-ci.
Modifiez le fichier lc.json comme suit :
# update the lc.json file
{
"serviceName": "signup-application",
"containers": {
"signup-app-container": {
"image": ":signup-application.latest.1",
"ports": {
"80": "HTTP"
}
}
},
"publicEndpoint": {
"containerName": "signup-app-container",
"containerPort": 80
}
}
Exécutez ensuite la commande suivante dans le terminal :
aws lightsail create-container-service-deployment \
--region eu-west-3 \
--cli-input-json file://lc.json
# the command outputs the following
{
"containerService": {
"containerServiceName": "signup-application",
"arn": "arn:aws:lightsail:eu-west-3:486652066693:ContainerService/528a0bcf-fd14-42d4-a09a-943a241adc51",
"createdAt": "2021-07-17T13:38:40+02:00",
"location": {
"availabilityZone": "all",
"regionName": "eu-west-3"
},
"resourceType": "ContainerService",
"tags": [],
"power": "nano",
"powerId": "nano-1",
"state": "DEPLOYING",
"scale": 2,
"currentDeployment": {
"version": 2,
"state": "ACTIVE",
"containers": {
"signup-app-container": {
"image": ":signup-application.latest.2",
"command": [],
"environment": {},
"ports": {
"80": "HTTP"
}
}
},
"publicEndpoint": {
"containerName": "signup-app-container",
"containerPort": 80,
"healthCheck": {
"healthyThreshold": 2,
"unhealthyThreshold": 2,
"timeoutSeconds": 2,
"intervalSeconds": 5,
"path": "/",
"successCodes": "200-499"
}
},
"createdAt": "2021-07-17T18:40:58+02:00"
},
"nextDeployment": {
"version": 3,
"state": "ACTIVATING",
"containers": {
"signup-app-container": {
"image": ":signup-application.latest.1",
"command": [],
"environment": {},
"ports": {
"80": "HTTP"
}
}
},
"publicEndpoint": {
"containerName": "signup-app-container",
"containerPort": 80,
"healthCheck": {
"healthyThreshold": 2,
"unhealthyThreshold": 2,
"timeoutSeconds": 2,
"intervalSeconds": 5,
"path": "/",
"successCodes": "200-499"
}
},
"createdAt": "2021-07-17T19:40:42+02:00"
},
"isDisabled": false,
"principalArn": "arn:aws:iam::577312533299:role/amazon/lightsail/eu-west-3/containers/signup-application/1jetjd21p8qshe57seuh71tnrnn29ps77lnno20sbgl2ghbuc0r0",
"privateDomainName": "signup-application.service.local",
"url": "https://signup-application.me04fvc6dbk4e.eu-west-3.cs.amazonlightsail.com/"
}
}
Après quelques instants, le déploiement v3, utilisant l'image de conteneur v1, est ACTIVE (ACTIF). Les déploiements v2 et v1 sont INACTIVE (INACTIFS).
Vous pouvez vérifier que la première version est déployée en ouvrant votre navigateur et en le pointant vers l'URL du service de conteneur.

Conclusion
Nous voilà arrivés à la fin de ce guide. Avant de prendre une pause bien méritée, veillez à nettoyer l'environnement pour ne pas entraîner des frais sur votre compte AWS.
À suivre : nettoyage des ressources