Direkt zum Inhalt

Wie konfiguriere und überwache ich den Amazon ECS-Bereitstellungsschutzschalter?

Lesedauer: 6 Minute
0

Ich möchte das Rollback automatisieren und Benachrichtigungen erhalten, wenn meine Amazon Elastic Container Service (Amazon ECS)-Bereitstellung fehlschlägt.

Kurzbeschreibung

Gehe wie folgt vor, um das Rollback zu automatisieren und Bereitstellungen mit dem Amazon ECS-Bereitstellungsschutzschalter zu überwachen:

  1. Konfiguriere den Bereitstellungsschutzschalter.
  2. Konfiguriere Amazon EventBridge so, dass der Bereitstellungsschalter überwacht wird.
  3. Teste das Szenario eines Bereitstellungsfehlers.

Lösung

Hinweis: Wenn du beim Ausführen von AWS Command Line Interface (AWS CLI)-Befehlen Fehlermeldungen erhältst, findest du weitere Informationen dazu unter Problembehandlung bei der AWS CLI. Stelle außerdem sicher, dass du die neueste Version der AWS CLI verwendest.

Den Bereitstellungsschutzschalter konfigurieren

Führe die folgenden Schritte aus:

  1. Erstelle eine JSON-Datei mit einer Aufgabendefinition, die dem folgenden Beispiel ähnelt:
    {
        "family": "my-task",
        "containerDefinitions": [
            {
                "name": "sample-container",
                "image": "nginx:alpine",
                "essential": true
            }
        ],
        "executionRoleArn": "arn:aws:iam::123456789876:role/ecsTaskExecutionRole",
        "networkMode": "awsvpc",
        "requiresCompatibilities": [
            "FARGATE"
        ],
        "cpu": "256",
        "memory": "512"
    }
    Hinweis: Ersetze 123456789876 durch die AWS-Konto-ID. Wenn du keine ecsTaskExecutionRole hast, erstelle eine Aufgabenausführungsrolle.
  2. Führe den folgenden Befehl register-task-definition aus, um die Aufgabendefinition zu registrieren:
    aws ecs register-task-definition \
        --cli-input-json file://taskdef-success.json
    Hinweis: Ersetze taskdef-success.json durch die JSON-Datei mit der Aufgabendefinition.
  3. Um einen Amazon ECS-Service mit aktiviertem Bereitstellungsschutzschalter und Rollback zu erstellen, führe den folgenden Befehl create-service aus:
    aws ecs create-service \
         --cluster default \
         --service-name my-sample-service \
         --deployment-controller type=ECS \
         --desired-count 1 \
         --deployment-configuration "deploymentCircuitBreaker={enable=true,rollback=true}" \
         --task-definition my-task:1 \
         --launch-type FARGATE \
         --network-configuration "awsvpcConfiguration={subnets=[subnet-12345],securityGroups=[sg-12345],assignPublicIp=ENABLED}"
    Hinweis: Ersetze subnet-12345 durch das Subnetz und sg-12345 durch die Sicherheitsgruppen. Du musst deployment-controller auf type=ECS setzen, da der Bereitstellungsschutzschalter nur für Bereitstellungen mit fortlaufenden Updates verfügbar ist.
    Wenn du keinen Standard-Cluster hast, führe den folgenden Befehl create-cluster aus, um den Cluster zu erstellen:
    aws ecs create-cluster \
        --cluster-name example-cluster
    Hinweis: Ersetze example-cluster durch deinen Cluster-Namen.
  4. Führe den folgenden Befehl describe-services aus, um zu bestätigen, dass sich der Amazon ECS-Service im Status Stabil befindet:
    aws ecs describe-services \
        --cluster default \
        --services my-sample-service | jq '.services[0].events[] | {message}'
    Du erhältst eine Ausgabe, die dem folgenden Beispiel ähnelt:
    {
      "message": "(service my-sample-service) has reached a steady state."
    }
    {
      "message": "(service my-sample-service) (deployment ecs-svc/1234567890123456789) deployment completed."
    }
    {
      "message": "(service my-sample-service) has started 1 tasks: (task 2918eb15dd0f4d42affc2a3a07818abf)."
    }

EventBridge so konfigurieren, dass der Bereitstellungsschalter überwacht wird

Führe die folgenden Schritte aus:

  1. Führe den folgenden Befehl create-topic aus, um ein Amazon Simple Notification Service (Amazon SNS)-Thema zu erstellen, das als EventBridge-Regelziel verwendet werden soll:

    aws sns create-topic \
        --name my-topic

    Hinweis: Ersetze my-topic durch den Namen des SNS-Themas.

  2. Um die Themenattribute so zu aktualisieren, dass Aufrufe der erforderlichen APIs möglich sind, führe den folgenden Befehl set-topic-attributes aus:

    aws sns set-topic-attributes \
        --topic-arn arn:aws:sns:eu-west-1:123456789876:my-topic \
        --attribute-name Policy \
        --attribute-value '{
      "Version": "2008-10-17",
      "Id": "my_topic_policy",
      "Statement": [
        {
          "Sid": "my_topic_default",
          "Effect": "Allow",
          "Principal": {
            "AWS": "*"
          },
          "Action": [
            "SNS:GetTopicAttributes",
            "SNS:SetTopicAttributes",
            "SNS:AddPermission",
            "SNS:RemovePermission",
            "SNS:DeleteTopic",
            "SNS:Subscribe",
            "SNS:ListSubscriptionsByTopic",
            "SNS:Publish"
          ],
          "Resource": "arn:aws:sns:eu-west-1:123456789876:my-topic",
          "Condition": {
            "StringEquals": {
              "AWS:SourceOwner": "123456789876"
            }
          }
        },
        {
          "Sid": "my_topic_for_sns_Publish",
          "Effect": "Allow",
          "Principal": {
            "Service": "events.amazonaws.com"
          },
          "Action": "sns:Publish",
          "Resource": "arn:aws:sns:eu-west-1:123456789876:my-topic"
        }
      ]
    }'

    Hinweis: Ersetze eu-west-1 durch die AWS-Region, 123456789876 durch die Konto-ID, my-topic durch den Themennamen.

  3. Um das SNS-Thema mit der E-Mail zu abonnieren, führe den folgenden subscribe-Befehl aus:

    aws sns subscribe \
        --topic-arn arn:aws:sns:eu-west-1:123456789876:my-topic \
        --protocol email \
        --notification-endpoint example@example.com

    Hinweis: Ersetze eu-west-1 durch die Region, 123456789876 durch die Konto-ID, my-topic durch den Themennamen und example@example.com durch den E-Mail-Adresse.

  4. Wähle in der Bestätigungs-E-Mail, die du erhältst, die Option Abonnement bestätigen aus.

  5. Führe den folgenden put-rule-Befehl aus, um eine EventBridge-Regel für fehlgeschlagene Ereignisse bei der Servicebereitstellung zu erstellen:

    aws events put-rule \
      --name "EcsServiceDeploymentFailed" \
      --event-pattern "{\"source\":[\"aws.ecs\"],\"detail-type\":[\"ECS Deployment State Change\"],\"detail\":{\"eventName\":[\"SERVICE_DEPLOYMENT_FAILED\"]}}"
  6. Um das SNS-Thema als EventBridge-Regelziel hinzuzufügen, führe den folgenden Befehl put-targets aus:

    aws events put-targets \
        --rule EcsServiceDeploymentFailed --targets "Id"="1","Arn"="arn:aws:sns:eu-west-1:123456789876:my-topic"

    Hinweis: Ersetze eu-west-1 durch die Region, 123456789876 durch die Konto-ID und my-topic durch die Themennamen.

Das Szenario eines Bereitstellungsfehlers testen

Führe die folgenden Schritte aus:

  1. Erstelle eine JSON-Datei mit einem falschen Image-Tag in ihrer Aufgabendefinition, das der folgenden ähnelt:

    {
        "family": "my-task",
        "containerDefinitions": [
            {
                "name": "sample-container",
                "image": "nginx:wrong-image-tag",
                "essential": true
            }
        ],
        "executionRoleArn": "arn:aws:iam::123456789876:role/ecsTaskExecutionRole",
        "networkMode": "awsvpc",
        "requiresCompatibilities": [
            "FARGATE"
        ],
        "cpu": "256",
        "memory": "512"
    }

    Hinweis: Ersetze sample-container durch die Container-Instance, nginx:wrong-image-tag durch ein falsches Image-Tag und 123456789876 durch die Konto-ID. Ein falsches Image-Tag führt dazu, dass die Bereitstellung fehlschlägt.

  2. Führe den folgenden Befehl register-task-definition aus, um die Aufgabendefinition zu registrieren:

    aws ecs register-task-definition --cli-input-json file://taskdef-failure.json

    Hinweis: Ersetze taskdef-failure.json durch den Titel der JSON-Datei mit der Aufgabendefinition.

  3. Um den Service mit der neuen Aufgabendefinition zu aktualisieren und eine neue Bereitstellung zu starten, führe den folgenden update-service-Befehl aus:

    aws ecs update-service --service my-sample-service --task-definition my-task:2

    Hinweis: Ersetze my-sample-service durch den Service und my-task:2 durch die Aufgabe. Die neue Bereitstellung schlägt fehl, weil die Aufgabe das Image nicht abrufen kann. Du erhältst eine Ausgabe, die dem folgenden Beispiel ähnelt:

    {
        "version": "0",
        "id": "12345abc-2f7c-f86a-e544-a69218eb1446",
        "detail-type": "ECS Deployment State Change",
        "source": "aws.ecs",
        "account": "123456789876",
        "time": "2024-11-19T17:42:41Z",
        "region": "eu-west-1",
        "resources": [
            "arn:aws:ecs:eu-west-1:123456789876:service/default/my-sample-service"
        ],
        "detail": {
            "eventType": "ERROR",
            "eventName": "SERVICE_DEPLOYMENT_FAILED",
            "clusterArn": "arn:aws:ecs:eu-west-1:123456789876:cluster/default",
            "deploymentId": "ecs-svc/9876543210987654321",
            "updatedAt": "2024-11-19T17:42:40.73Z",
            "reason": "ECS deployment circuit breaker: tasks failed to start."
        }
    }
  4. Führe den folgenden Befehl describe-services aus, um zu überprüfen, ob der Amazon ECS-Service zurückgesetzt wurde:

    aws ecs describe-services \
        --cluster default \
        --services my-sample-service | jq '.services[0].events[] | {message}'

    Du erhältst eine Ausgabe, die dem folgenden Beispiel ähnelt:

    {
      "message": "(service my-sample-service) has reached a steady state."
    }
    {
      "message": "(service my-sample-service) (deployment ecs-svc/1234567890123456789) deployment completed."
    }
    {
      "message": "(service my-sample-service) rolling back to deployment ecs-svc/1234567890123456789."
    }
    {
      "message": "(service my-sample-service) (deployment ecs-svc/9876543210987654321) deployment failed: tasks failed to start."
    }
    {
      "message": "(service my-sample-service) has started 1 tasks: (task b808c60616134ec1ac0c656a2bff1ef2)."
    }
    {
      "message": "(service my-sample-service) has started 1 tasks: (task 846c9aebd9224c2b832a38942cae5ea6)."
    }
    {
      "message": "(service my-sample-service) has started 1 tasks: (task 7143d03444574f2db2b567d75df3fe72)."
    }
    {
      "message": "(service my-sample-service) has started 1 tasks: (task 9a6a399770d940a2b442560c02a6a4c0)."
    }
    {
      "message": "(service my-sample-service) has reached a steady state."
    }
    {
      "message": "(service my-sample-service) (deployment ecs-svc/1234567890123456789) deployment completed."
    }
    {
      "message": "(service my-sample-service) has started 1 tasks: (task 2918eb15dd0f4d42affc2a3a07818abf)."
    }

Ähnliche Informationen

So erkennt der Amazon ECS-Bereitstellungsschutzschalter Ausfälle

Ankündigung des Amazon ECS-Bereitstellungsschutzschalters

AWS OFFICIALAktualisiert vor 2 Jahren