Aws-cli: aws ecs - So aktualisieren Sie eine Aufgabendefinition

Erstellt am 29. Dez. 2017  ·  18Kommentare  ·  Quelle: aws/aws-cli

Gibt es eine Möglichkeit, einer ECS-Aufgabendefinition eine neue Revision hinzuzufügen?

In meinem Fall möchte ich die Container-URL in meiner CD-Pipeline über die Befehlszeile aktualisieren. Entweder fehlt die Dokumentation wie das geht oder ist das aktuell nur über die Managementkonsole möglich?

siehe https://github.com/aws/amazon-ecs-cli/issues/91 (aber ich verwende nicht Docker Compose)

guidance

Hilfreichster Kommentar

Danke @m-radzikowski Ich habe Ihre Lösung leicht modifiziert, sodass sie auch funktioniert, wenn git Hash als Image-Tag anstelle von "latest" verwendet wird. Benötigt jedoch einige Umgebungsvariablen, um zu funktionieren
```

!/bin/bash

Skript zum Abrufen der aktuellen Aufgabendefinition und basierend darauf, eine neue ECR-Bildadresse zur alten Vorlage hinzuzufügen und nicht benötigte Attribute zu entfernen, dann senden wir eine neue Aufgabendefinition, erhalten eine neue Revisionsnummer von der Ausgabe und aktualisieren den Dienst

setze -e
ECR_IMAGE="${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_DEFAULT_REGION}.amazonaws.com/${IMAGE_REPO_NAME}:${CODEBUILD_RESOLVED_SOURCE_VERSION}"
TASK_DEFINITION=$(aws ecs describe-task-definition --task-definition "$TASK_FAMILY" --region "$AWS_DEFAULT_REGION")
NEW_TASK_DEFINTIION=$(echo $TASK_DEFINITION | jq --arg IMAGE "$ECR_IMAGE" '.taskDefinition | .containerDefinitions[0].image = $IMAGE | del(.taskDefinitionArn) | del(.revision) | del(.status) | del(.requiresAttributes) | del(.kompatibilitäten)')
NEW_TASK_INFO=$(aws ecs register-task-definition --region "$AWS_DEFAULT_REGION" --cli-input-json "$NEW_TASK_DEFINTIION")
NEW_REVISION=$(echo $NEW_TASK_INFO | jq '.taskDefinition.revision')
aws ecs update-service --cluster ${ECS_CLUSTER} --service ${SERVICE_NAME} --task-definition ${TASK_FAMILY}:${NEW_REVISION}```

Alle 18 Kommentare

Hm, ich bin mir nicht sicher. Im Allgemeinen ist der beste Ort für nutzungsbezogene Fragen der Stack-Überlauf, wie in unserer README erwähnt .

Wenn man sich jedoch die Dokumente ansieht, scheint es, als würde die Verwendung von register-task-definition eine neue Überarbeitung erstellen. Von https://docs.aws.amazon.com/cli/latest/reference/ecs/register-task-definition.html#output :

          revision -> (integer)
              The revision of the task in a particular family. The revision is
              a version number of a task definition in a family. When you reg-
              ister  a task definition for the first time, the revision is 1 ;
              each time you register a new revision of a  task  definition  in
              the  same  family,  the  revision  value always increases by one
              (even if you have deregistered previous revisions in  this  fam-
              ily).

Das würde ich erstmal probieren.

danke, sorry für das geräusch. Ich hatte erwartet, dass es ein separater Befehl ist, der mit anderen wie update-service übereinstimmt

Hallo @Extrawurst, ich habe das gleiche Problem. Ich habe mich gefragt, ob Sie eine Lösung gefunden haben.

Hallo @menocomp siehe @jamesls Antwort. Verwenden Sie einfach register-task-definition und es wird eine neue Revision erstellt, wenn die Familie bereits existiert

register-task-definition ist kein zufriedenstellender Weg, um eine bloße Erhöhung der Revisionsnummer zu erreichen.

register-task-definition erfordert die Aufgabendefinitionsparameter oder JSON als Eingabe. Wenn Sie das von describe-task-definition beschaffen, werden eine zusätzliche Wörterbuchebene _und_ Felder hinzugefügt, die für die Verwendung mit register-task-definition ungültig sind.

Nach dem Reduzieren des Wörterbuchs der obersten Ebene:

$ aws ecs register-task-definition --family name --cli-input-json file:///tmp/task-definition.json

Parameter validation failed:
Unknown parameter in input: "taskDefinitionArn", must be one of: family, taskRoleArn, executionRoleArn, networkMode, containerDefinitions, volumes, placementConstraints, requiresCompatibilities, cpu, memory, tags, pidMode, ipcMode, proxyConfiguration
Unknown parameter in input: "revision", must be one of: family, taskRoleArn, executionRoleArn, networkMode, containerDefinitions, volumes, placementConstraints, requiresCompatibilities, cpu, memory, tags, pidMode, ipcMode, proxyConfiguration
Unknown parameter in input: "status", must be one of: family, taskRoleArn, executionRoleArn, networkMode, containerDefinitions, volumes, placementConstraints, requiresCompatibilities, cpu, memory, tags, pidMode, ipcMode, proxyConfiguration
Unknown parameter in input: "requiresAttributes", must be one of: family, taskRoleArn, executionRoleArn, networkMode, containerDefinitions, volumes, placementConstraints, requiresCompatibilities, cpu, memory, tags, pidMode, ipcMode, proxyConfiguration
Unknown parameter in input: "compatibilities", must be one of: family, taskRoleArn, executionRoleArn, networkMode, containerDefinitions, volumes, placementConstraints, requiresCompatibilities, cpu, memory, tags, pidMode, ipcMode, proxyConfiguration

Ich denke, dies sollte als Feature-Request wieder geöffnet werden. Derzeit ist das CLI für ECS Task-Update, das für CI/CD erforderlich ist, nicht einfach und erfordert zusätzliche Tricks.

Der im Web am häufigsten anzutreffende Ablauf besteht darin, describe-task-definition aufzurufen, die Containerdefinition daraus abzurufen, den Parameter image ändern und ihn mit register-task-definition --family $FAMILY --container-definitions $UPDATED_DEFINITION .

Mit Fargate bin ich auf ein Problem mit diesem Flow gestoßen - die Aufgabe konnte nicht mit demselben JSON aktualisiert werden, sie erforderte zusätzliche Parameter und ich musste im Grunde alle Top-Level-Werte von describe-task JSON als register-task-definition Parameter (wie CPU, Speicher usw.).

Die bessere Lösung für mich war also, JSON als vollständige Eingabe für die Aufgabe zu verwenden, aber es hat seine eigenen Probleme, die von @shatil erwähnt werden. Schließlich endete ich mit einem Skript wie folgt:

TASK_DEFINITION=$(aws ecs describe-task-definition --task-definition "$TASK_FAMILY" --region "us-east-1")
NEW_TASK_DEFINTIION=$(echo $TASK_DEFINITION | jq --arg IMAGE "$NEW_IMAGE" '.taskDefinition | .containerDefinitions[0].image = $IMAGE | del(.taskDefinitionArn) | del(.revision) | del(.status) | del(.requiresAttributes) | del(.compatibilities)')
aws ecs register-task-definition --region "us-east-1" --cli-input-json "$NEW_TASK_DEFINTIION"

Danke @m-radzikowski Ich habe Ihre Lösung leicht modifiziert, sodass sie auch funktioniert, wenn git Hash als Image-Tag anstelle von "latest" verwendet wird. Benötigt jedoch einige Umgebungsvariablen, um zu funktionieren
```

!/bin/bash

Skript zum Abrufen der aktuellen Aufgabendefinition und basierend darauf, eine neue ECR-Bildadresse zur alten Vorlage hinzuzufügen und nicht benötigte Attribute zu entfernen, dann senden wir eine neue Aufgabendefinition, erhalten eine neue Revisionsnummer von der Ausgabe und aktualisieren den Dienst

setze -e
ECR_IMAGE="${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_DEFAULT_REGION}.amazonaws.com/${IMAGE_REPO_NAME}:${CODEBUILD_RESOLVED_SOURCE_VERSION}"
TASK_DEFINITION=$(aws ecs describe-task-definition --task-definition "$TASK_FAMILY" --region "$AWS_DEFAULT_REGION")
NEW_TASK_DEFINTIION=$(echo $TASK_DEFINITION | jq --arg IMAGE "$ECR_IMAGE" '.taskDefinition | .containerDefinitions[0].image = $IMAGE | del(.taskDefinitionArn) | del(.revision) | del(.status) | del(.requiresAttributes) | del(.kompatibilitäten)')
NEW_TASK_INFO=$(aws ecs register-task-definition --region "$AWS_DEFAULT_REGION" --cli-input-json "$NEW_TASK_DEFINTIION")
NEW_REVISION=$(echo $NEW_TASK_INFO | jq '.taskDefinition.revision')
aws ecs update-service --cluster ${ECS_CLUSTER} --service ${SERVICE_NAME} --task-definition ${TASK_FAMILY}:${NEW_REVISION}```

Wie ist der Stand dazu? Wie können wir eine Aufgabendefinitionsrevision erstellen? Ich würde mir vorstellen, dass es sowas gibt:

aws ecs update-task-definition --task-definition "$task_fam" --revision "ecr/name:tag"

also ja ich suche:

_ aws ecs Update-Aufgaben-Definition _

Ich habe mit aws ecs help nachgesehen und es gibt kein solches Dienstprogramm:


Screen Shot 2019-08-13 at 10 31 13 AM


Ich habe dieses Ticket erstellt: https://github.com/aws/aws-cli/issues/4401

aws-cli-Unterstützung, wenn Sie nicht möchten, dass wir darüber diskutieren, verwenden Sie einfach kein Github, Entschuldigung, dies ist immer noch gültig und sollte erneut geöffnet werden

Möglicherweise benötigen Sie jq :

aws describe-task-definition --task-definition myapp \
     --query 'taskDefinition.{containerDefinitions:containerDefinitions}' \
     > /tmp/task-definitions.json 

Fargate-Benutzer benötigen möglicherweise lange Befehle wie diese:

aws ecs register-task-definition \
    --family myapp \
    --cli-input-json file:///tmp/task.json \
    --requires-compatibilities FARGATE \
    --network-mode awsvpc \
    --cpu 1024 --memory 2048 \
    --task-role-arn <arn> --execution-role-arn <arn>

Als Fargate-Benutzer habe ich einen Hack gefunden, der für ecs cli und --tags verwendet.

Was auch immer Sie in die Versionsnummer eingeben, es wird die Revision als nächste festgelegt.

ecs-cli compose --project-name PROJECT-NAME --file DOCKER_COMPOSE_FILE --ecs-params ECS_PARAMS_FILE --region REGION create --launch-type FARGATE --tags 'TaskDefinition=TASK:VERSION_NUMBER'

Ich bin auf Fargate CLI umgestiegen. Es aktualisiert automatisch eine geeignete Aufgabendefinition.

https://github.com/awslabs/fargatecli

Ich bin auf Fargate CLI umgestiegen. Es aktualisiert automatisch eine geeignete Aufgabendefinition.

https://github.com/awslabs/fargatecli

Danke fürs Teilen - hatte es nicht gesehen. Freuen Sie sich darauf, es zu überprüfen.

fargatecli funktioniert nicht, wenn Sie Volumes definiert haben

Möglicherweise benötigen Sie jq :

aws describe-task-definition --task-definition myapp \
     --query 'taskDefinition.{containerDefinitions:containerDefinitions}' \
     > /tmp/task-definitions.json 

Fargate-Benutzer benötigen möglicherweise lange Befehle wie diese:

aws ecs register-task-definition \
    --family myapp \
    --cli-input-json file:///tmp/task.json \
    --requires-compatibilities FARGATE \
    --network-mode awsvpc \
    --cpu 1024 --memory 2048 \
    --task-role-arn <arn> --execution-role-arn <arn>

Hier ist eine Vollversion, die kein JQ erfordert:

NEW_TASK_DEFINTION=\$(aws ecs describe-task-definition --task-definition {task def} 
      --query '{  containerDefinitions: taskDefinition.containerDefinitions,
                  family: taskDefinition.family,
                  taskRoleArn: taskDefinition.taskRoleArn,
                  executionRoleArn: taskDefinition.executionRoleArn,
                  networkMode: taskDefinition.networkMode,
                  volumes: taskDefinition.volumes,
                  placementConstraints: taskDefinition.placementConstraints,
                  requiresCompatibilities: taskDefinition.requiresCompatibilities,
                  cpu: taskDefinition.cpu,
                  memory: taskDefinition.memory}')

aws ecs register-task-definition --cli-input-json "$NEW_TASK_DEFINTION"

In Ergänzung zur Antwort von

Wenn Sie nur Ihren ECS-Cluster aktualisieren möchten, um das neueste Image zu verwenden (mit "latest" kennzeichnen), sollte dies ausreichen:

aws ecs update-service --cluster your-cluster-name --service your-service-name --force-new-deployment

Der Parameter --force-new-deployment macht den Trick.

@oalgtash Danke für die Info. Ich werde es versuchen.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen