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

Háganos saber su opinión.