Implantar uma aplicação Web de contêiner no Amazon Lightsail

GUIA DE CONCEITOS BÁSICOS

Módulo 4: Implantar uma nova versão de contêiner

Neste módulo, você aprenderá a atualizar um contêiner que já foi implantado

Introdução

Ao longo da vida útil de uma aplicação, ela será atualizada muitas vezes. Neste módulo, você aprenderá a atualizar sua implantação e a reverter uma implantação, caso a nova versão da aplicação apresente problemas.

O que você aprenderá

  • Atualizar o código do aplicativo e criar uma nova imagem de contêiner local
  • Envie por push a imagem de contêiner atualizada para o Amazon Lightsail
  • Implantar a nova versão da sua aplicação
  • Reverter uma implantação caso haja algum problema

 Tempo para a conclusão

10 minutos

 Pré-requisitos do módulo

  • Conta da AWS com acesso de administrador**
  • Navegador recomendado: versão mais recente do Chrome ou Firefox

[**]Talvez as contas criadas nas últimas 24 horas ainda não tenham acesso aos serviços necessários para este tutorial.

Implementação

Atualize o código da sua aplicação e crie uma nova imagem de contêiner

Vamos fingir que o nome da cidade na página inicial da aplicação está incorreto e precisa ser modificado.

Abra o arquivo code/templates/index.html. Procure por "Las Vegas" e substitua por "Paris".

Em seguida, crie e teste o contêiner conforme explicado no módulo 2. Abra um terminal e digite os seguintes 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

Agora que o contêiner está em execução, abra um navegador e aponte-o para http://localhost:8080. Você deverá ver a tela inicial da aplicação, com o novo nome da cidade.

gsg-build-lightsail-4

Envie por push a imagem de contêiner atualizada para o Amazon Lightsail

Agora que o contêiner foi criado, a próxima etapa é enviar essa nova imagem de contêiner para o Amazon Lightsail.

Abra um terminal e digite os seguintes 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. 

A última linha da saída exibe o nome interno do seu contêiner. Anote-o, pois precisaremos desse nome para implantar o contêiner no serviço de contêiner. Caso queira acessar o nome do contêiner posteriormente, você poderá digitar o seguinte 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 o status "state": "DEPLOYING" ("estado": "IMPLANTANDO"). Após um momento, o estado se tornará ACTIVE (ATIVO). A implantação demora alguns minutos para ser concluída. Você pode verificar o estado de sua implantação usando o seguinte 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" 

Teste sua implantação

Para testar sua implantação, primeiro recupere o URL que o Lightsail criou para você. Abra um terminal e digite o seguinte 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/"
]

Agora temos duas versões de nossa imagem de contêiner - :signup-application.latest.1 e :signup-application.latest.2.

Implante uma nova versão da sua aplicação

Agora que a imagem do contêiner está armazenada no Amazon Lightsail, podemos implantar essa imagem no serviço de contêiner usando comandos semelhantes aos descritos no módulo anterior: Implantar um contêiner.

Edite o arquivo lc.json e substitua o nome da imagem a ser usada - :signup-application.latest.1 - pela nova versão :signup-application.latest.2.

O novo arquivo lc.json deve ser semelhante a:

{
    "serviceName": "signup-application",
    "containers": {
        "signup-app-container": {
            "image": ":signup-application.latest.2",
            "ports": {
                "80": "HTTP"
            }
        }
    },
    "publicEndpoint": {
        "containerName": "signup-app-container",
        "containerPort": 80
    }
}

Em seguida, implante o contêiner digitando o seguinte comando:

aws lightsail create-container-service-deployment \
    --region eu-west-3                            \
    --cli-input-json file://lc.json

# the command outputs the following 

Teste sua implantação

Para testar a implantação, alterne para a janela do navegador e atualize a página no URL do serviço de contêiner fornecida no módulo anterior.

Você pode recuperar o URL digitando este comando em um 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/"
]

Reverter uma implantação

A última implantação não substituiu a primeira versão da aplicação, apenas criou uma nova versão.

Para verificar as versões disponíveis, abra um terminal e digite o seguinte 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"
        }
    ]
}

Ao ler a saída do comando anterior, você poderá observar que há duas implantações feitas. A versão 1 está em um estado INACTIVE (INATIVO), enquanto a versão 2 está ACTIVE (ATIVA).

O comando a seguir oferece uma visão geral menos detalhada de suas implantações:

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"
    }
]

Agora imagine que a última versão da aplicação que você acabou de implementar não está se comportando corretamente. Talvez um bug não tenha surgido durante os testes.

Para acessar o o log dos seus contêineres, abra um terminal e digite o seguinte 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 reverter rapidamente sua implantação e reimplantar a versão anterior da aplicação, altere o arquivo lc.json para fazê-lo usar a primeira versão da imagem do contêiner e reimplantar essa imagem.

Modifique o arquivo lc.json para o seguinte:

# 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
    }
}

Em seguida, execute o seguinte comando no 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/"
    }
}

Depois de um tempo, a implantação v3, usando a imagem de contêiner v1, torna-se ACTIVE (ATIVA). As implantações v2 e v1 permanecem INACTIVE (INATIVAS).

Você pode verificar se a primeira versão foi implantada abrindo seu navegador e apontando-o para o URL do serviço de contêiner.

gsg-build-lightsail-3

Conclusão

Este é o final deste guia. Antes de fazer uma merecida pausa, certifique-se de limpar o ambiente para não acumular cobranças em sua conta da AWS.

A seguir: Limpar recursos

Envie seus comentários.

Agradecemos por seus comentários
Ficamos satisfeitos por esta página ter ajudado você. Deseja compartilhar detalhes adicionais para nos ajudar a continuar melhorando?
Fechar
Agradecemos por seus comentários
Lamentamos que esta página não tenha ajudado você. Deseja compartilhar detalhes adicionais para nos ajudar a continuar melhorando?
Fechar