Qual é a abordagem certa para fazer com que minhas tarefas do Amazon ECS atualizem suas imagens Docker, uma vez que essas imagens foram atualizadas no registro correspondente?
docker
docker-registry
amazon-ecs
aknuds1
fonte
fonte
Respostas:
Se sua tarefa estiver sendo executada em um serviço, você pode forçar uma nova implantação. Isso força a definição da tarefa a ser reavaliada e a nova imagem do contêiner a ser obtida.
fonte
Sempre que você inicia uma tarefa (por meio das chamadas de API
StartTask
eRunTask
ou que é iniciada automaticamente como parte de um serviço), o Agente ECS executará umdocker pull
dos queimage
você especificar em sua definição de tarefa. Se você usar o mesmo nome de imagem (incluindo tag) cada vez que for enviar para o registro, poderá fazer com que a nova imagem seja executada executando uma nova tarefa. Observe que se o Docker não conseguir acessar o registro por qualquer motivo (por exemplo, problemas de rede ou problemas de autenticação), o Agente ECS tentará usar uma imagem em cache; se você deseja evitar que imagens em cache sejam usadas ao atualizar sua imagem, você desejará enviar uma tag diferente para seu registro a cada vez e atualizar sua definição de tarefa de forma correspondente antes de executar a nova tarefa.Atualizar: esse comportamento agora pode ser ajustado por
ECS_IMAGE_PULL_BEHAVIOR
meio da variável de ambiente definida no agente ECS. Consulte a documentação para obter detalhes. No momento da escrita, as seguintes configurações são suportadas:fonte
/var/log/ecs
.Registrar uma nova definição de tarefa e atualizar o serviço para usar a nova definição de tarefa é a abordagem recomendada pela AWS. A maneira mais fácil de fazer isso é:
Este tutorial tem mais detalhes e descreve como as etapas acima se encaixam em um processo de desenvolvimento de produto de ponta a ponta.
Divulgação completa: este tutorial apresenta contêineres da Bitnami e eu trabalho para a Bitnami. No entanto, os pensamentos expressos aqui são meus e não a opinião de Bitnami.
fonte
Existem duas maneiras de fazer isso.
Primeiro, use o AWS CodeDeploy. Você pode configurar as seções de implantação Azul / Verde na definição de serviço ECS. Isso inclui um CodeDeployRoleForECS, outro TargetGroup para switch e um Listener de teste (opcional). O AWS ECS criará o aplicativo CodeDeploy e o grupo de implantação e vinculará esses recursos do CodeDeploy ao seu ECS Cluster / Service e ELB / TargetGroups para você. Em seguida, você pode usar CodeDeploy para iniciar uma implantação, na qual você precisa inserir um AppSpec que especifica o uso de qual tarefa / contêiner para atualizar qual serviço. Aqui é onde você especifica sua nova tarefa / contêiner. Em seguida, você verá que novas instâncias são ativadas no novo TargetGroup e o antigo TargetGroup é desconectado do ELB e, em breve, as instâncias antigas registradas no antigo TargetGroup serão encerradas.
Isso parece muito complicado. Na verdade, uma vez que / se você habilitou o escalonamento automático em seu serviço ECS, uma maneira simples de fazer isso é apenas forçar uma nova implantação usando o console ou CLI, como um cavalheiro aqui apontou:
aws ecs update-service --cluster <cluster name> --service <service name> --force-new-deployment
Dessa forma, você ainda pode usar o tipo de implantação "rolling update", e o ECS simplesmente ativará novas instâncias e drenará as antigas sem tempo de inatividade do serviço, se tudo estiver OK. O lado ruim é que você perde o controle fino da implantação e não pode reverter para a versão anterior se houver um erro e isso interromperá o serviço em andamento. Mas esta é uma maneira muito simples de fazer.
BTW, não se esqueça de definir os números adequados para porcentagem mínima saudável e porcentagem máxima, como 100 e 200.
fonte
Criei um script para implantar imagens atualizadas do Docker em um serviço de teste no ECS, de modo que a definição de tarefa correspondente se refira às versões atuais das imagens do Docker. Não sei ao certo se estou seguindo as práticas recomendadas, portanto, comentários serão bem-vindos.
Para que o script funcione, você precisa de uma instância sobressalente do ECS ou de um
deploymentConfiguration.minimumHealthyPercent
valor para que o ECS possa roubar uma instância para implantar a definição de tarefa atualizada.Meu algoritmo é assim:
Meu código colado abaixo:
deploy-ecs
_common.py
fonte
AWS CodePipeline.
Você pode definir ECR como uma origem e ECS como um destino para implantar.
fonte
O seguinte funcionou para mim, caso a tag da imagem do docker fosse a mesma:
fonte
Encontrou o mesmo problema. Depois de passar horas, concluí estas etapas simplificadas para implantação automatizada de imagem atualizada:
1. Mudanças na definição da tarefa ECS: Para um melhor entendimento, vamos supor que você criou uma definição de tarefa com os detalhes abaixo (nota: esses números mudariam de acordo com a definição da sua tarefa):
Em seguida, você precisa fazer as seguintes alterações:
2. Marque sua imagem como < nome-da-sua-imagem>: mais recente . A chave mais recente se encarrega de ser puxada pela respectiva tarefa do ECS.
3. Empurre para a imagem para ECR
4. Aplicar desdobramento forçado
Observação: escrevi todos os comandos presumindo que a região seja us-east-1 . Basta substituí-lo por sua respectiva região durante a implementação.
fonte
Usando o AWS cli, experimentei o aws ecs update-service conforme sugerido acima. Não foi obtido o docker mais recente do ECR. No final, executei novamente meu manual do Ansible que criou o cluster ECS. A versão da definição da tarefa é alterada quando ecs_taskdefinition é executado. Então está tudo bem. A nova imagem da janela de encaixe é selecionada.
Sinceramente, não tenho certeza se a alteração da versão da tarefa força a reimplantação ou se o manual usando o ecs_service faz com que a tarefa seja recarregada.
Se alguém estiver interessado, terei permissão para publicar uma versão limpa de meu manual.
fonte
Bem, também estou tentando encontrar uma maneira automatizada de fazer isso, ou seja, enviar as alterações para ECR e, em seguida, a tag mais recente deve ser selecionada pelo serviço. Certo, você pode fazer isso manualmente, parando a tarefa para seu serviço de seu cluster. Novas tarefas extrairão os contêineres ECR atualizados.
fonte
Os seguintes comandos funcionaram para mim
fonte