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)
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
```
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:
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.
Ich bin auf Fargate CLI umgestiegen. Es aktualisiert automatisch eine geeignete Aufgabendefinition.
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.
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}```