Implementación de una aplicación web de contenedor en Amazon Lightsail
GUÍA DE INTRODUCCIÓN
Módulo 4: implementación de una versión de contenedor nueva
En este módulo, aprenderá a actualizar un contenedor que ya ha sido implementado.
Introducción
Durante el ciclo de vida de una aplicación, esta se actualizará muchas veces. En este módulo, aprenderá a actualizar una implementación y a restaurarla en caso de que la versión nueva de la aplicación tenga problemas.
Lo que aprenderá
- Actualizar el código de la aplicación y crear una imagen de contenedor local nueva
- Enviar la imagen de contenedor actualizada a Amazon Lightsail
- Implementar la versión nueva de la aplicación
- Restaurar una implementación en caso de que algo salga mal
Tiempo de realización
10 minutos
Requisitos previos del módulo
- Una cuenta de AWS con acceso de nivel de administrador**
- Navegador recomendado: la última versión de Chrome o Firefox
[**] Es posible que las cuentas creadas en las últimas 24 horas aún no tengan acceso a los servicios necesarios para este tutorial.
Implementación
Actualizar el código de la aplicación y crear una imagen de contenedor nueva
Supongamos que el nombre de la ciudad en la página principal de la aplicación es incorrecto y necesita modificarlo.
Abra el archivo code/templates/index.html. Busque “Las Vegas” y reemplácelo con “París”.
Luego, cree y pruebe el contenedor como se explica en el módulo 2. Abra un terminal y escriba los siguientes comandos:
# 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
Ahora que el contenedor se está ejecutando, abra un navegador y apúntelo hacia http://localhost:8080. Debería ver la pantalla de inicio de la aplicación con el nombre nuevo de la ciudad.

Enviar la imagen de contenedor actualizada a Amazon Lightsail
Una vez creado el contenedor, el siguiente paso es enviar esta imagen de contenedor nueva a Amazon Lightsail.
Abra un terminal y escriba los siguientes comandos:
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 última línea de la salida muestra el nombre interno del contenedor. Anótelo, ya que lo necesitaremos para implementar el contenedor en el servicio de contenedor. En caso de que desee acceder al nombre del contenedor en una etapa posterior, puede escribir el siguiente comando:
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"
}
]
}
Observe el estado: estado DEPLOYING (IMPLEMENTACIÓN EN CURSO). Después de un tiempo, el estado pasará a ACTIVE (ACTIVO). La implementación tarda unos minutos en completarse. Para verificar el estado de la implementación, utilice el siguiente comando:
# 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"
Probar la implementación
Para probar la implementación, primero recupere la URL que Lightsail creó para usted. Abra un terminal y escriba el siguiente comando:
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/"
]
Ahora tenemos dos versiones de nuestra imagen de contenedor: :signup-application.latest.1 y :signup-application.latest.2.
Implementar una versión nueva de la aplicación
Ahora que la imagen de contenedor está almacenada en Amazon Lightsail, podemos implementarla en el servicio de contenedor con comandos similares a los descritos en el módulo anterior: Implementar un contenedor.
Edite el archivo lc.json y reemplace el nombre de la imagen :signup-application.latest.1 por la versión nueva : signup-application.latest.2.
El archivo nuevo lc.json debería verse así:
{
"serviceName": "signup-application",
"containers": {
"signup-app-container": {
"image": ":signup-application.latest.2",
"ports": {
"80": "HTTP"
}
}
},
"publicEndpoint": {
"containerName": "signup-app-container",
"containerPort": 80
}
}
Luego, para implementar el contenedor escriba el siguiente comando:
aws lightsail create-container-service-deployment \
--region eu-west-3 \
--cli-input-json file://lc.json
# the command outputs the following
Probar la implementación
Para probar la implementación, vaya a la ventana del navegador y actualice la página en la URL del servicio de contenedor proporcionada en el módulo anterior.
Para recuperar la URL, escriba este comando en 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/"
]
Restaurar una implementación
La última implementación no modificó la primera versión de la aplicación, simplemente creó una versión nueva.
Para verificar las versiones disponibles, abra un terminal y escriba el siguiente comando:
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"
}
]
}
Al leer el resultado del comando anterior, puede observar que se realizaron dos implementaciones. La versión 1 está en estado INACTIVE (INACTIVA), mientras que la versión 2 está ACTIVE (ACTIVA).
El siguiente comando ofrece información general menos detallada de las implementaciones:
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"
}
]
Ahora imagine que la última versión de la aplicación que acaba de implementar no se comporta correctamente. Quizás se trata de un error que no apareció durante la prueba.
Para acceder al registro de los contenedores, abra un terminal y escriba el siguiente comando:
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" "-"
Para restaurar rápidamente la implementación y volver a implementar la versión anterior de la aplicación, cambie el archivo lc.json para que utilice la primera versión de la imagen de contenedor y vuelva a implementar esta imagen.
Modifique el archivo lc.json a lo siguiente:
# 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
}
}
Luego ejecute el siguiente comando en el 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/"
}
}
Después de un tiempo, la implementación v3, que utiliza la imagen de contenedor v1, está ACTIVE (ACTIVA). Las implementaciones v2 y v1 están INACTIVE (INACTIVA).
Puede verificar que la primera versión está implementada y para ello, abra el navegador y diríjase a ella en la URL del servicio de contenedor.

Conclusión
Este es el final de la guía. Antes de tomar un merecido descanso, asegúrese de limpiar el entorno para no acumular cargos en su cuenta de AWS.
Siguiente: eliminar recursos