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)
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
```
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 :
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.
Je suis passé à Fargate CLI. Il met automatiquement à jour une définition de tâche appropriée.
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.
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}```