Bereitstellen einer Container-Webanwendung auf Amazon Lightsail

HANDBUCH „ERSTE SCHRITTE“

Modul 4: Bereitstellen einer neuen Containerversion

In diesem Modul lernen Sie, einen bereits bereitgestellten Container zu aktualisieren

Einführung

Während der Lebensdauer einer Anwendung wird sie viele Male aktualisiert. In diesem Modul lernen Sie, wie Sie Ihre Bereitstellung aktualisieren und wie Sie eine Bereitstellung zurücksetzen können, falls die neue Anwendungsversion Probleme aufweist.

Lerninhalte

  • Aktualisieren des Anwendungscodes und Erstellen eines neuen lokalen Container-Images
  • Übertragen des aktualisierten Container-Images an Amazon Lightsail
  • Bereitstellen der neuen Version in Ihrer Anwendung
  • Zurücksetzen einer Bereitstellung, falls etwas schief läuft

 Veranschlagte Zeit

10 Minuten

 Voraussetzungen für das Modul

  • AWS-Konto mit Administratorzugriff**
  • Empfohlener Browser: aktuelle Version von Chrome oder Firefox

[**] Innerhalb der letzten 24 Stunden erstellte Konten haben möglicherweise noch keinen Zugriff auf alle für dieses Tutorial erforderlichen Services.

Implementierung

Aktualisieren Sie Ihren Anwendungscode und erstellen Sie ein neues Container-Image

Nehmen wir an, der Name der Stadt auf der Startseite der Anwendung ist falsch und muss geändert werden.

Öffnen Sie die Datei code/templates/index.html. Suchen Sie nach „Las Vegas“ und ersetzen Sie es durch „Paris“.

Erstellen und testen Sie dann den Container wie in Modul 2 beschrieben. Öffnen Sie ein Terminal und geben Sie die folgenden Befehle ein:

# 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

Nachdem der Container jetzt ausgeführt wird, öffnen Sie einen Browser und verweisen Sie ihn auf http://localhost:8080. Sie sollten den Startbildschirm der Anwendung mit dem neuen Städtenamen sehen.

gsg-build-lightsail-4

Übertragen des aktualisierten Container-Images an Amazon Lightsail

Nachdem der Container nun erstellt wurde, besteht der nächste Schritt darin, dieses neue Container-Image an Amazon Lightsail zu übertragen.

Öffnen Sie ein Terminal und geben Sie die folgenden Befehle ein:

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. 

Die letzte Zeile der Ausgabe zeigt den internen Namen Ihres Containers an. Notieren Sie sich den Namen, da wir diesen benötigen, um den Container im Container-Service bereitzustellen. Falls Sie zu einem späteren Zeitpunkt auf den Containernamen zugreifen möchten, können Sie den folgenden Befehl eingeben:

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

Beachten Sie den Status „Status“: „WIRD BEREITGESTELLT“ . Nach einer Weile ändert sich der Status in AKTIV. Die Bereitstellung dauert ein paar Minuten. Sie können den Status Ihrer Bereitstellung mit dem folgenden Befehl überprüfen:

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

Testen Sie Ihre Bereitstellung

Um Ihre Bereitstellung zu testen, rufen Sie zuerst die für Sie erstellte URL Lightsail ab. Öffnen Sie ein Terminal und geben Sie den folgenden Befehl ein:

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

Wir haben jetzt zwei Versionen unseres Container-Images – :signup-application.latest.1 and :signup-application.latest.2.

Stellen Sie eine neue Version Ihrer Anwendung bereit

Da das Container-Image jetzt in Amazon Lightsail gespeichert ist, können wir dieses Image mit ähnlichen Befehlen wie im vorherigen Modul beschrieben für den Container-Service bereitstellen: Container bereitstellen.

Bearbeiten Sie die Datei lc.json und ersetzen Sie den Namen des zu verwendenden Images - :signup-application.latest.1 – durch die neue Version :signup-application.latest.2.

Die neue Datei lc.json sollte folgendermaßen aussehen:

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

Stellen Sie dann den Container bereit, indem Sie den folgenden Befehl eingeben:

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

# the command outputs the following 

Testen Sie Ihre Bereitstellung

Um die Bereitstellung zu testen, wechseln Sie zu Ihrem Browserfenster und aktualisieren Sie die Seite, auf der Container-Service-URL, die im vorherigen Modul bereitgestellt wurde.

Sie können die URL abrufen, indem Sie diesen Befehl in ein Terminal eingeben:

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

Rollback (Zurücksetzen) einer Bereitstellung

Bei der letzten Bereitstellung wurde die erste Version der Anwendung nicht überschrieben, sondern es wurde lediglich eine neue Version erstellt.

Um die verfügbaren Versionen zu überprüfen, öffnen Sie ein Terminal und geben Sie den folgenden Befehl ein:

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

Wenn Sie die Ausgabe des vorherigen Befehls lesen, können Sie feststellen, dass zwei Verteilungen vorgenommen wurden. Version 1 befindet sich im Status „INAKTIV“, während Version 2 „AKTIV“ ist.

Der folgende Befehl bietet einen weniger detaillierten Überblick über Ihre Bereitstellungen:

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

Stellen Sie sich nun vor, die letzte Version der Anwendung, die Sie gerade bereitgestellt haben, verhält sich nicht korrekt. Vielleicht ist bei den Tests ein Fehler nicht aufgetaucht.

Um auf das Protokoll Ihrer Container zuzugreifen, öffnen Sie ein Terminal und geben Sie den folgenden Befehl ein:

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

Um die Bereitstellung schnell wieder rückgängig zu machen und die vorherige Version der Anwendung erneut bereitzustellen, ändern Sie die Datei lc.json so, dass sie die erste Version des Container-Images verwendet, und stellen Sie dieses Image erneut bereit.

Ändern Sie die Datei lc.json wie folgt:

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

Führen Sie dann den folgenden Befehl in dem Terminal aus:

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

Nach einer Weile ist die Bereitstellung v3 mit Container-Image v1 AKTIV. Bereitstellungen v2 und v1 sind INAKTIV.

Sie können überprüfen, ob die erste Version bereitgestellt wurde, indem Sie Ihren Browser öffnen und auf die Container-Service-URL verweisen.

gsg-build-lightsail-3

Zusammenfassung

Dies ist das Ende dieses Leitfadens. Bevor Sie sich eine wohlverdiente Pause gönnen, sollten Sie die Umgebung aufräumen, damit keine Gebühren auf Ihrem AWS-Konto anfallen.

Nächstes Thema: Bereinigen von Ressourcen

Lassen Sie uns wissen, wie wir abgeschnitten haben.

Vielen Dank für Ihr Feedback
Wir freuen uns, dass diese Seite Ihnen geholfen hat. Würden Sie uns weitere Details mitteilen, damit wir uns weiter verbessern können?
Schließen
Vielen Dank für Ihr Feedback
Es tut uns leid, dass diese Seite Ihnen nicht weiterhelfen konnte. Würden Sie uns weitere Details mitteilen, damit wir uns weiter verbessern können?
Schließen