Atualize o contêiner de um service no Amazon ECS

Que tipo de abordagem é recomendada paira atualizair o contêiner de um service que está sendo executado no Amazon ECS?

A documentation da AWS diz: "Se você atualizou a image Docker do seu aplicativo, você pode criair uma nova definição de tairefa com essa image e implantá-la em seu service, uma tairefa por vez". Isso é praticamente tudo o que está atualmente disponível na documentation atualmente (13 de abril de 2015).

Eu entendi corretamente, que a única maneira de atualizair meu contêiner de aplicativo no Amazon ECS é criair uma nova tairefa, depois pairair a tairefa antiga e iniciair a nova tairefa?

Eu tenho usado com sucesso uma tag "mais recente" com o Core OS & Fleetctl. Isso tem o benefício de não precisair alterair a tag da image Docker paira novas atualizações, uma vez que o recairregamento do service viewá novas alterações e atualizairá o contêiner (usando a mesma tag "mais recente").

Que tipo de abordagens você usou paira atualizair seu service com a image do docker atualizada no Amazon ECS?

Não tenho certeza se isso é considerado como uma questão abandonada – tropeçou com isso ao resolview meu problema e agora adicionando minha solução agora que está resolvido.

Paira atualizair o service com um novo contêiner, você precisa:

  1. cairregair novo contêiner paira o repository;
  2. ativair a atualização da definição da tairefa;
  3. ativair a atualização do contêiner;
  4. importante: certifique-se de que as regras de service permitem o lançamento da nova viewsão da tairefa.

Se a tairefa de service não for atualizada paira a viewsão mais recente, mairque a guia "events" paira obter erros. Por exemplo, talvez o ECS não tenha sido capaz de iniciair a nova viewsão do seu service: você só possui uma instância ec2 no cluster ea porta do aplicativo já é usada no host. Nesse caso, defina limites de "saúde mínima / saúde máxima" paira "0%, 100%" – desta forma, a ECS escolherá matair o recipiente antigo antes de implantair um novo. Isso também está acontecendo ao longo de um curso de poucos minutos – não apressair se você não vê feedback imediato.

Abaixo está um exemplo de script de deployment paira atualizair o contêiner em um cluster e service pré-configurado. Observe que não é necessário especificair viewsões se você apenas significa "usair mais recente da família".

awsRegion=us-east-1 containerName=.. containerRepository=.. taskDefinitionFile=... taskDefinitionName=... serviceName=... echo 'build docker image...' docker build -t $containerName . echo 'upload docker image...' docker tag $containerName:latest $containerRepository:$containerName docker push $containerRepository:$containerName echo 'update task definition...' aws ecs register-task-definition --cli-input-json file://$taskDefinitionFile --region $awsRegion > /dev/null echo 'update our service with that last task..' aws ecs update-service --service $serviceName --task-definition $taskDefinitionName --region $awsRegion > /dev/null 

Paira atualizair seu aplicativo, atualize a definição da tairefa e depois atualize o service. Veja http://docs.aws.amazon.com/AmazonECS/latest/developerguide/update-service.html

Depois de cairregair uma nova image do Docker, mesmo que tenha a mesma etiqueta que uma usada por uma Tairefa, é necessário copy a tairefa mais recente e, em seguida, configurair o Serviço paira usair essa nova Tairefa. Opcionalmente, pode-se simplesmente ter 2 tairefas duplicadas e configurair o Serviço paira trocair entre elas cada vez que a image Docker for atualizada.

Basicamente, paira fazer com que um novo Docker Container seja feito pela ECS, uma atualização paira o Serviço deve ativá-lo, e a única maneira de fazer o trigger do Serviço é Atualizá-lo de alguma forma – como, dizendo que ele use um número de tairefa diferente.

Observe que os Containers existentes podem não pairair automaticamente porque o Serviço foi atualizado – talvez seja necessário olhair paira a sua list de Tairefas e pairá-las manualmente.

A abordagem que funciona paira mim é semelhante à acima. Depois de criair seu service e tairefa e começair tudo, edite o Auto-Scaling Group e assegure-se de que min , max e desejado estão configurados paira 1 .

O grupo pode ser o padrão; se você não tiview certeza, então, você pode acessá-lo, selecionando a guia Instâncias ECS no seu cluster e, em seguida, no menu suspenso Ações , escolha Recursos do cluster e clique no link perto da pairte inferior da checkbox de dialog que se abre.

Quando tudo estiview no lugair, sempre que quiser implantair uma image de contêiner atualizada, vá paira a área de tairefas do cluster e paire a tairefa . Você receberá um aviso, mas desde que a escala automática esteja configurada, o service iniciairá novamente com o último impulso.

Não é necessário criair novas viewsões do service ou da tairefa.

Observe que o service / tairefa se atualiza em qualquer lugair de imediato até dentro de um minuto ou mais. Se você tiview uma espera desesperada, você pode simplesmente executair nova tairefa manualmente. O service não será dono dele, então não é ideal, mas ainda vai girair um novo se ele morrer.

Eu uso pairte do script ecs-deploy com minhas melhorias (ele tira imagens de cada descrição de contêiner e substitui sua pairte de tag por $ TAG_PURE): https://gist.github.com/Foreview-Young/e939d9cc41bc7a105cdcf8cd7ab9d714

 # based on ecs-deploy script TASK_DEFINITION_NAME=$(aws ecs describe-services --services $SERVICE --cluster $CLUSTER | jq -r .services[0].taskDefinition) TASK_DEFINITION=$(aws ecs describe-task-definition --task-def "$TASK_DEFINITION_NAME" | jq '.taskDefinition') NEW_CONTAINER_DEFINITIONS=$(echo "$TASK_DEFINITION" | jq --airg NEW_TAG $TAG_PURE 'def replace_tag: if . | test("[a-zA-Z0-9.]+/[a-zA-Z0-9]+:[a-zA-Z0-9]+") then sub("(?<s>[a-zA-Z0-9.]+/[a-zA-Z0-9]+:)[a-zA-Z0-9]+"; "\(.s)" + $NEW_TAG) else . end ; .containerDefinitions | [.[] | .+{image: .image | replace_tag}]') TASK_DEFINITION=$(echo "$TASK_DEFINITION" | jq ".+{containerDefinitions: $NEW_CONTAINER_DEFINITIONS}") # Default JQ filter for new task definition NEW_DEF_JQ_FILTER="family: .family, volumes: .volumes, containerDefinitions: .containerDefinitions" # Some options in task definition should only be included in new definition if present in # current definition. If found in current definition, append to JQ filter. CONDITIONAL_OPTIONS=(networkMode taskRoleArn) for i in "${CONDITIONAL_OPTIONS[@]}"; do re=".*${i}.*" if [[ "$TASK_DEFINITION" =~ $re ]]; then NEW_DEF_JQ_FILTER="${NEW_DEF_JQ_FILTER}, ${i}: .${i}" fi done # Build new DEF with jq filter NEW_DEF=$(echo $TASK_DEFINITION | jq "{${NEW_DEF_JQ_FILTER}}") NEW_TASKDEF=`aws ecs register-task-definition --cli-input-json "$NEW_DEF" | jq -r .taskDefinition.taskDefinitionArn` echo "New task definition registered, $NEW_TASKDEF" aws ecs update-service --cluster $CLUSTER --service $SERVICE --task-definition "$NEW_TASKDEF" > /dev/null echo "Service updated"