Aws-cli: aws ecs - como atualizar uma definição de tarefa

Criado em 29 dez. 2017  ·  18Comentários  ·  Fonte: aws/aws-cli

Existe uma maneira de adicionar uma nova revisão a uma definição de tarefa do ECS?

No meu caso, quero atualizar a URL do contêiner no pipeline do meu CD usando a linha de comando. A documentação está faltando como fazer isso ou só é possível atualmente usando o console de gerenciamento?

consulte https://github.com/aws/amazon-ecs-cli/issues/91 (mas não estou usando docker compose)

guidance

Comentários muito úteis

Obrigado @ m-radzikowski. Modifiquei levemente sua solução para que ela também funcione ao usar git hash como tag de imagem em vez de "mais recente". Precisa de algumas variáveis ​​ambientais para funcionar, embora
`` `

! / bin / bash

Script para obter a definição da tarefa atual e, com base nisso, adicionar novo endereço de imagem ecr ao modelo antigo e remover atributos que não são necessários, então enviamos uma nova definição de tarefa, obtemos um novo número de revisão da saída e atualizamos o serviço

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 --tarefa-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 (.status) | del (.requiresAttributes) | del (.compatabilities) ')
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} `` `

Todos 18 comentários

Hmm, não tenho certeza. Em geral, o melhor lugar para perguntas relacionadas ao uso seria no estouro de pilha, conforme mencionado em nosso README .

Olhando para a documentação, porém, parece que apenas usar register-task-definition criaria uma nova revisão. 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).

Eu daria uma chance a isso primeiro.

obrigado, desculpe pelo barulho. Eu esperava que fosse um comando separado consistente com outros como update-service

Olá @Extrawurst, estou com o mesmo problema. Eu queria saber se você encontrou uma solução.

oi @menocomp veja a resposta de @jamesls . apenas use register-task-definition e ele irá criar uma nova revisão se a família já existir

register-task-definition não é uma maneira satisfatória de realizar um simples aumento no número de revisão.

register-task-definition requer os parâmetros de definição de tarefa ou JSON como entrada. Obter isso de describe-task-definition adiciona uma camada de dicionário adicional _and_ campos que são inválidos para uso com register-task-definition .

Depois de nivelar o dicionário de nível 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

Acho que isso deve ser reaberto como uma solicitação de recurso. Atualmente, a CLI para atualização de tarefas do ECS, necessária para CI / CD, não é direta e requer truques adicionais.

O fluxo mais comumente encontrado na web é chamar describe-task-definition , obter a definição do contêiner dele, alterar o parâmetro image e enviá-lo de volta com register-task-definition --family $FAMILY --container-definitions $UPDATED_DEFINITION .

Usando Fargate, encontrei um problema com este fluxo - a tarefa não podia ser atualizada com o mesmo JSON, ela exigia parâmetros adicionais e basicamente tive que colocar todos os valores de nível superior de describe-task JSON como register-task-definition parâmetros (como cpu, memória e assim por diante).

Portanto, a melhor solução para mim era usar JSON como entrada completa para a tarefa, mas ele tem seus próprios problemas mencionados por @shatil. Finalmente terminei com um script 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"

Obrigado @ m-radzikowski. Modifiquei levemente sua solução para que ela também funcione ao usar git hash como tag de imagem em vez de "mais recente". Precisa de algumas variáveis ​​ambientais para funcionar, embora
`` `

! / bin / bash

Script para obter a definição da tarefa atual e, com base nisso, adicionar novo endereço de imagem ecr ao modelo antigo e remover atributos que não são necessários, então enviamos uma nova definição de tarefa, obtemos um novo número de revisão da saída e atualizamos o serviço

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 --tarefa-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 (.status) | del (.requiresAttributes) | del (.compatabilities) ')
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} `` `

Qual é o status disso? como podemos criar uma revisão de definição de tarefa? Eu acho que haveria algo como:

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

então sim estou procurando:

_ aws ecs update-task-definition _

Eu verifiquei usando aws ecs help e esse utilitário não existe:


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


Criei este tíquete: https://github.com/aws/aws-cli/issues/4401

suporte aws-cli, se você não quiser que discutamos, simplesmente não use o github, desculpe, ainda é válido e deve ser reaberto

Talvez você não precise de jq :

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

Os usuários Fargate podem precisar de comandos longos 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 um usuário fargate, descobri um hack usando para ecs cli e --tags.

O que quer que você coloque no número da versão, ele definirá a revisão como a próxima.

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'

Mudei para Fargate CLI. Ele atualiza automaticamente uma definição de tarefa adequada.

https://github.com/awslabs/fargatecli

Mudei para Fargate CLI. Ele atualiza automaticamente uma definição de tarefa adequada.

https://github.com/awslabs/fargatecli

Obrigado por compartilhar isso - não tinha visto. Estamos ansiosos para conferir.

fargatecli não funciona se você tiver volumes definidos

Talvez você não precise de jq :

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

Os usuários Fargate podem precisar de comandos longos 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>

Aqui está uma versão completa que não requer 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"

Somando-se à resposta de

Se você deseja apenas atualizar seu cluster ECS para usar a imagem mais recente (tag com "mais recente"), isso deve ser o suficiente:

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

O --force-new-deployment param faz o truque.

@oalagtash Obrigado pela informação. Vou tentar.

Esta página foi útil?
0 / 5 - 0 avaliações