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.

gsg-build-lightsail-4

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.

gsg-build-lightsail-3

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

Dites-nous si nous avons répondu à vos attentes.

Nous vous remercions pour votre commentaire
Nous sommes ravis que cette page vous ait été utile. Souhaitez-vous partager des détails supplémentaires pour nous aider à continuer à nous améliorer ?
Fermer
Nous vous remercions pour votre commentaire
Nous sommes désolés que cette page ne vous ait pas été utile. Souhaitez-vous partager des détails supplémentaires pour nous aider à continuer à nous améliorer ?
Fermer