Aws-cli: aws ecs - cómo actualizar una definición de tarea

Creado en 29 dic. 2017  ·  18Comentarios  ·  Fuente: aws/aws-cli

¿Hay alguna forma de agregar una nueva revisión a la definición de una tarea de ECS?

En mi caso, quiero actualizar la URL del contenedor en mi canalización de CD usando la línea de comando. ¿Falta la documentación sobre cómo hacer eso o solo es posible actualmente usando la consola de administración?

ver https://github.com/aws/amazon-ecs-cli/issues/91 (pero no estoy usando docker compose)

guidance

Comentario más útil

Gracias @ m-radzikowski Modifiqué ligeramente su solución para que también funcione cuando se usa git hash como etiqueta de imagen en lugar de "última". Sin embargo, necesita algunas variables ambientales para funcionar
''

! / bin / bash

Secuencia de comandos para obtener la definición actual de la tarea, y en base a eso, agregue una nueva dirección de imagen ecr a la plantilla anterior y elimine los atributos que no son necesarios, luego enviamos una nueva definición de tarea, obtenemos un nuevo número de revisión de la salida y el servicio de actualización

set -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 --tarea-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 (.compatibilidades) ')
NEW_TASK_INFO = $ (aws ecs registro-tarea-definición - región "$ 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} ``

Todos 18 comentarios

Hmm, no estoy seguro. En general, el mejor lugar para las preguntas relacionadas con el uso sería el desbordamiento de pila, como se menciona en nuestro README .

Sin embargo, al revisar los documentos, parece que solo usar register-task-definition crearía una nueva revisión. De 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).

Primero le daría una oportunidad.

gracias, perdon por el ruido. Esperaba que fuera un comando separado consistente con otros como update-service

Hola @Extrawurst tengo el mismo problema. Me preguntaba si encontraste una solución.

hola @menocomp ver la respuesta de @jamesls . solo use register-task-definition y creará una nueva revisión si la familia ya existe

register-task-definition no es una forma satisfactoria de lograr un simple aumento del número de revisión.

register-task-definition requiere los parámetros de definición de tarea o JSON como entrada. Obtener eso de describe-task-definition agrega una capa de diccionario adicional _y_ campos que no son válidos para su uso con register-task-definition .

Después de aplanar el diccionario de nivel superior:

$ 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

Creo que esto debería reabrirse como una solicitud de función. Actualmente, CLI para la actualización de tareas ECS, necesaria para CI / CD, no es sencilla y requiere trucos adicionales.

El flujo que se encuentra más comúnmente en la web es llamar a describe-task-definition , obtener la definición del contenedor, cambiar el parámetro image y retrocederlo con register-task-definition --family $FAMILY --container-definitions $UPDATED_DEFINITION .

Al usar Fargate, encontré un problema con este flujo: la tarea no se podía actualizar con el mismo JSON, requería parámetros adicionales y básicamente tuve que poner todos los valores de nivel superior desde describe-task JSON como register-task-definition parámetros (como cpu, memoria, etc.).

Entonces, la mejor solución para mí fue usar JSON como entrada completa para la tarea, pero tiene sus propios problemas mencionados por @shatil. Finalmente terminé con un guión como este:

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"

Gracias @ m-radzikowski Modifiqué ligeramente su solución para que también funcione cuando se usa git hash como etiqueta de imagen en lugar de "última". Sin embargo, necesita algunas variables ambientales para funcionar
''

! / bin / bash

Secuencia de comandos para obtener la definición actual de la tarea, y en base a eso, agregue una nueva dirección de imagen ecr a la plantilla anterior y elimine los atributos que no son necesarios, luego enviamos una nueva definición de tarea, obtenemos un nuevo número de revisión de la salida y el servicio de actualización

set -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 --tarea-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 (.compatibilidades) ')
NEW_TASK_INFO = $ (aws ecs registro-tarea-definición - región "$ 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} ``

¿Cuál es el estado de esto? ¿Cómo podemos crear una revisión de la definición de la tarea? Pensaría que habría algo como:

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

entonces si estoy buscando:

_ aws ecs actualización-tarea-definición _

Verifiqué usando aws ecs help y no existe tal utilidad:


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


Creé este ticket: https://github.com/aws/aws-cli/issues/4401

Soporte aws-cli, si no le gusta que discutamos, simplemente no use github, lo siento, esto sigue siendo válido y debe reabrirse

Es posible que no necesite jq :

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

Los usuarios de Fargate pueden necesitar comandos largos como este:

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>

Como usuario de fargate, encontré un truco que usaba para ecs cli y --tags.

Independientemente de lo que ingrese en el número de versión, establecerá la revisión como la siguiente.

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'

Me cambié a Fargate CLI. Actualiza automáticamente una definición de tarea adecuada.

https://github.com/awslabs/fargatecli

Me cambié a Fargate CLI. Actualiza automáticamente una definición de tarea adecuada.

https://github.com/awslabs/fargatecli

Gracias por compartir eso, no lo había visto. Esperamos comprobarlo.

fargatecli no funciona si tiene volúmenes definidos

Es posible que no necesite jq :

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

Los usuarios de Fargate pueden necesitar comandos largos como este:

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>

Aquí hay una versión completa que no requiere 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"

Agregando a la respuesta de @sashokbg , register-task-definition se queja de que necesita cadenas para los valores de la CPU y la memoria. El comando --query usa la sintaxis JMESPath, que admite la conversión de tipo to_string ($ arg), así que simplemente envuelva esos dos en to_string ()

Si solo desea actualizar su clúster de ECS para usar la imagen más reciente (etiqueta con "última"), esto debería ser suficiente:

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

El --force-new-deployment funciona.

@oalagtash Gracias por la información. Lo intentaré.

¿Fue útil esta página
0 / 5 - 0 calificaciones