¿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)
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
''
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:
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.
Me cambié a Fargate CLI. Actualiza automáticamente una definición de tarea adecuada.
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é.
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} ``