Aws-cli: aws ecs - comment mettre à jour une définition de tâche

Créé le 29 déc. 2017  ·  18Commentaires  ·  Source: aws/aws-cli

Existe-t-il un moyen d'ajouter une nouvelle révision à une définition de tâche ECS ?

Dans mon cas, je souhaite mettre à jour l'URL du conteneur dans mon pipeline de CD à l'aide de la ligne de commande. Soit la documentation est manquante comment faire cela, soit il n'est possible actuellement d'utiliser la console de gestion ?

voir https://github.com/aws/amazon-ecs-cli/issues/91 (mais je n'utilise pas docker compose)

guidance

Commentaire le plus utile

Merci @m-radzikowski J'ai légèrement modifié votre solution afin qu'elle fonctionne également lors de l'utilisation de git hash comme balise d'image au lieu de "dernière". A besoin de quelques variables environnementales pour fonctionner cependant
```

!/bin/bash

Script pour obtenir la définition de tâche actuelle, et en fonction de cela, ajoutez une nouvelle adresse d'image ecr à l'ancien modèle et supprimez les attributs qui ne sont pas nécessaires, puis nous envoyons une nouvelle définition de tâche, obtenons un nouveau numéro de révision à partir du service de sortie et de mise à jour

définir -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(.compatibilitys)')
NEW_TASK_INFO=$(aws ecs register-task-definition --region "$AWS_DEFAULT_REGION" --cli-input-json "$NEW_TASK_DEFINTIION")
NEW_REVISION=$(écho $NEW_TASK_INFO | jq '.taskDefinition.revision')
aws ecs update-service --cluster ${ECS_CLUSTER} --service ${SERVICE_NAME} --task-definition ${TASK_FAMILY}:${NEW_REVISION}```

Tous les 18 commentaires

Hum, je ne suis pas sûr. En général, le meilleur endroit pour les questions liées à l'utilisation serait le débordement de la pile, comme mentionné dans notre README .

En parcourant la documentation, il semble que le simple fait d'utiliser register-task-definition créerait une nouvelle révision. Depuis 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).

Je donnerais ça d'abord.

merci, désolé pour le bruit. Je m'attendais à ce que ce soit une commande distincte cohérente avec d'autres comme update-service

Bonjour @Extrawurst J'ai le même problème. Je me demandais si vous aviez trouvé une solution.

salut @menocomp voir la réponse de @jamesls . utilisez simplement register-task-definition et cela créera une nouvelle révision si la famille existe déjà

register-task-definition n'est pas un moyen satisfaisant d'accomplir une simple augmentation du numéro de révision.

register-task-definition requiert les paramètres de définition de tâche ou JSON comme entrée. L'obtention de cela à partir de describe-task-definition ajoute une couche de dictionnaire supplémentaire _et_ des champs non valides pour une utilisation avec register-task-definition .

Après avoir aplati le dictionnaire de niveau supérieur :

$ 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

Je pense que cela devrait être rouvert en tant que demande de fonctionnalité. Actuellement, la mise à jour de la tâche CLI pour ECS, requise pour CI/CD, n'est pas simple et nécessite des astuces supplémentaires.

Le flux le plus couramment trouvé sur le Web consiste à appeler describe-task-definition , à obtenir la définition du conteneur, à modifier le paramètre image et à le repousser avec register-task-definition --family $FAMILY --container-definitions $UPDATED_DEFINITION .

En utilisant Fargate, j'ai rencontré un problème avec ce flux - la tâche ne pouvait pas être mise à jour avec le même JSON, elle nécessitait des paramètres supplémentaires, et je devais essentiellement mettre toutes les valeurs de niveau supérieur de describe-task JSON comme register-task-definition Paramètres

Donc, la meilleure solution pour moi était d'utiliser JSON comme entrée complète pour la tâche, mais il a ses propres problèmes mentionnés par @shatil. Enfin, j'ai terminé avec un script comme celui-ci :

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"

Merci @m-radzikowski J'ai légèrement modifié votre solution afin qu'elle fonctionne également lors de l'utilisation de git hash comme balise d'image au lieu de "dernière". A besoin de quelques variables environnementales pour fonctionner cependant
```

!/bin/bash

Script pour obtenir la définition de tâche actuelle, et en fonction de cela, ajoutez une nouvelle adresse d'image ecr à l'ancien modèle et supprimez les attributs qui ne sont pas nécessaires, puis nous envoyons une nouvelle définition de tâche, obtenons un nouveau numéro de révision à partir du service de sortie et de mise à jour

définir -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(.compatibilitys)')
NEW_TASK_INFO=$(aws ecs register-task-definition --region "$AWS_DEFAULT_REGION" --cli-input-json "$NEW_TASK_DEFINTIION")
NEW_REVISION=$(écho $NEW_TASK_INFO | jq '.taskDefinition.revision')
aws ecs update-service --cluster ${ECS_CLUSTER} --service ${SERVICE_NAME} --task-definition ${TASK_FAMILY}:${NEW_REVISION}```

Quel est le statut à ce sujet ? comment pouvons-nous créer une révision de définition de tâche ? Je pense qu'il y aurait quelque chose comme :

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

alors oui je cherche :

_ aws ecs update-task-definition _

J'ai vérifié avec aws ecs help et il n'y a pas un tel utilitaire :


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


J'ai créé ce ticket : https://github.com/aws/aws-cli/issues/4401

support aws-cli, si vous n'aimez pas que nous discutions, n'utilisez pas github, désolé, cela est toujours valable et devrait être rouvert

Vous n'aurez peut-être pas besoin de jq :

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

Les utilisateurs de Fargate peuvent avoir besoin de commandes longues comme celle-ci :

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>

En tant qu'utilisateur de fargate, j'ai trouvé un hack utilisant pour ecs cli et --tags.

Quoi que vous mettez dans le numéro de version, cela définira la révision comme la prochaine.

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'

Je suis passé à Fargate CLI. Il met automatiquement à jour une définition de tâche appropriée.

https://github.com/awslabs/fargatecli

Je suis passé à Fargate CLI. Il met automatiquement à jour une définition de tâche appropriée.

https://github.com/awslabs/fargatecli

Merci d'avoir partagé cela - je ne l'avais pas vu. Hâte de le vérifier.

fargatecli ne fonctionne pas si vous avez défini des volumes

Vous n'aurez peut-être pas besoin de jq :

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

Les utilisateurs de Fargate peuvent avoir besoin de commandes longues comme celle-ci :

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>

Voici une version complète qui ne nécessite pas JQ :

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"

En plus de la réponse de

Si vous souhaitez simplement mettre à jour votre cluster ECS pour utiliser la dernière image (tag avec "latest"), cela devrait suffire :

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

Le --force-new-deployment fait l'affaire.

@oalagtash Merci pour l'info. Je vais l'essayer.

Cette page vous a été utile?
0 / 5 - 0 notes