Implementazione di un'applicazione Web di container su Amazon Lightsail

GUIDA ALLE OPERAZIONI DI BASE

Modulo 4: Implementazione di una nuova versione del container

In questo modulo verrà descritto come aggiornare un container che è già stato implementato

Introduzione

Durante la sua vita, un'applicazione viene aggiornata molte volte. In questo modulo, verrà descritto come aggiornare la propria implementazione e come eseguire il ripristino dello stato precedente di una implementazione nel caso in cui una versione dell'applicazione abbia dei problemi.

Gli argomenti affrontati

  • Aggiornamento del codice dell'applicazione e creazione di una nuova immagine locale del container
  • Inserimento di un'immagine di container aggiornata in Amazon Lightsail
  • Implementazione della nuova versione dell'applicazione
  • Ripristino dello stato precedente in caso di problemi

 Tempo richiesto per il completamento

10 minuti

 Prerequisiti del modulo

  • Account AWS con accesso da amministratore**
  • Browser consigliato: l'ultima versione di Chrome o Firefox

[**]Gli account creati nelle ultime 24 ore potrebbero non avere ancora accesso a tutti servizi richiesti per questo tutorial.

Implementazione

Aggiornamento del codice dell'applicazione e creazione di una nuova immagine di container

Facciamo finta che il nome della città sulla prima pagina dell'applicazione non sia corretto e debba essere modificato.

Aprire il file code/templates/index.html. Cercare "Las Vegas" e sostituirlo con "Parigi".

Quindi, creare e testare il container come descritto nel Modulo 2. Aprire un terminale e digitare i seguenti comandi:

# 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

Una volta che il container è in esecuzione, aprire un browser e passare al sito http://localhost:8080. Dovrebbe essere visualizzata la schermata home dell'applicazione, con il nuovo nome della città.

gsg-build-lightsail-4

Inserimento di un'immagine di container aggiornata in Amazon Lightsail

Una volta creato il container, la fase successiva consiste nell'inserire la nuova immagine del container in Amazon Lightsail.

Aprire un terminale e digitare i seguenti comandi:

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. 

L'ultima riga dell'output visualizza il nome interno del container. Prendere nota di questo nome in quanto sarà necessario per implementare il container nel servizio container. Nel caso in cui si desideri accedere al nome container in un secondo momento, è possibile utilizzare il seguente 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"
        }
    ]
}

Notare lo stato "stato": "IMPLEMENTAZIONE IN CORSO" . Dopo un po' di tempo, lo stato diventa ATTIVO. Il completamento dell'implementazione richiede qualche minuto. È possibile controllare lo stato dell'implementazione utilizzando il seguente 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" 

Test dell'implementazione

Per testare l'implementazione, per prima cosa richiamare l'URL Lightsail creato. Aprire un terminale e digitare il seguente 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/"
]

A questo punto abbiamo due versioni dell'immagine di container: :signup-application.latest.1 e :signup-application.latest.2.

Implementazione di una nuova versione dell'applicazione

Ora che l'immagine del container è archiviata su Amazon Lightsail, è possibile implementarla nel servizio container utilizzando comandi simili a quelli descritti nel modulo Implementazione di un container.

Modificare il file lc.json e sostituire il nome dell'immagine da utilizzare - :signup-application.latest.1 - con la nuova versione :signup-application.latest.2.

Il nuovo file lc.json dovrebbe avere il seguente aspetto:

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

Quindi, implementare il container digitando il seguente comando:

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

# the command outputs the following 

Test dell'implementazione

Per testare la distribuzione, passare alla finestra del browser e aggiornare la pagina con l'URL del servizio container fornito nel modulo precedente.

L'URL può essere recuperato digitando il seguente comando in un terminale:

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

Ripristino dello stato precedente di un'implementazione

L'ultima implementazione non ha sovrascritto la prima versione dell'applicazione, ha semplicemente creato una nuova versione.

Per verificare le versioni disponibili, aprire un terminale e digitare il seguente 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"
        }
    ]
}

Leggendo l'output del comando precedente, è possibile osservare che sono state effettuate due implementazioni. La versione 1 si trova in uno stato INATTIVO, mentre la versione 2 si trova nello stato ATTIVO.

Il seguente comando offre una panoramica meno dettagliata delle implementazioni:

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

A questo punto, immaginiamo che l'ultima versione dell'applicazione appena distribuita non funzioni correttamente. Forse un bug non è emerso durante il test.

Per accedere al log dei container, aprire un terminale e digitare il seguente 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" "-"

Per eseguire rapidamente il ripristino dello stato precedente dell'implementazione ed eseguire di nuovo la versione precedente, modificare il file lc.json in modo che utilizzi la prima versione dell'immagine del container e ridistribuisca questa immagine.

Modificare il file lc.json come riportato di seguito:

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

Quindi eseguire il comando nel terminale:

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

Dopo un po' di tempo, lo stato dell'implementazione v3, che utilizza l'immagine v1 sarà ATTIVO. Lo stato delle implementazioni v2 e v1 invece sarà INATTIVO.

È possibile verificare che la prima versione sia stata implementata aprendo il browser e puntandolo all'URL del servizio container.

gsg-build-lightsail-3

Conclusioni

Questa è la fine della guida. Prima di fare una meritata pausa, assicurarsi di ripulire l'ambiente per non accumulare addebiti sull'account AWS.

A seguire: Eliminazione delle risorse

Facci sapere com'è andata.

Grazie per il tuo feedback
Siamo contenti che questa pagina ti sia stata d’aiuto. Vuoi condividere ulteriori dettagli per aiutarci a continuare a migliorare?
Chiudi
Grazie per il tuo feedback
Ci dispiace che questa pagina non ti sia stata d'aiuto. Vuoi condividere ulteriori dettagli per aiutarci a continuare a migliorare?
Chiudi