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)
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
`` `
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:
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.
Mudei para Fargate CLI. Ele atualiza automaticamente uma definição de tarefa adequada.
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.
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} `` `