O blog da AWS
Usando o Fargate Spot para executar seus contêineres até 70% mais barato
Por Pritam Pal, Sr. EC2 Spot Specialist SA de AWS
A AWS lançou o AWS Fargate Spot no final de 2019 para clientes que procuram uma maneira econômica de executar contêineres. Discutiremos como usar o ECS Fargate Spot e as Tarefas em Fargate para reduzir o custo de suas cargas de trabalho em contêineres. Explicarei conceitos existentes, como Container Stop Timeout, como capturar sinais SIGTERM para desligamento gracioso de tarefas e apresentarei dois novos conceitos do Amazon Elastic Container Service (Amazon ECS): Provedores de capacidade e Eventos de Serviço da AWS
Visão geral
Em 2017, a AWS lançou o AWS Fargate para o Amazon ECS. O Fargate permite que você gaste menos tempo gerenciando instâncias do Amazon EC2 e mais tempo construindo. Fargate Spot é uma nova opção de compra que permite que os clientes iniciem tarefas utilizando a capacidade não utilizada da AWS com um grande desconto. Uma tarefa Spot é quase indistinguível de uma tarefa sob demanda com as seguintes exceções:
O preço (por hora de CPU e GB-hora) de uma tarefa Spot é variável, com um desconto de 50% a 70% do preço de uma tarefa sob demanda, e uma tarefa Fargate Spot pode ser interrompida (ou seja, parar) quando a AWS precisar da capacidade de volta para atender outros clientes sob demanda.
O Fargate Spot é executado com o mesmo princípio das instâncias Spot do Amazon EC2. Suas tarefas são executadas com capacidade não utilizada na nuvem da AWS. Se você solicitar para executar sua tarefa no Fargate Spot, suas tarefas serão executadas quando a capacidade Fargate Spot estiver disponível. Já que essas tarefas são executadas com a capacidade não utilizada da AWS, você receberá uma notificação de dois minutos quando a AWS precisar desta capacidade de volta, assim como nas Instâncias Spot.
Neste blog explico como iniciar uma tarefa Fargate Spot usando o Console de Gerenciamento da AWS e a Interface da Linha de Comando (ILC), como lidar com avisos de encerramento, o que é um evento SERVICE_TASK_PLACEMENT_FAILURE e outras boas práticas para garantir que você seja um especialista em Fargate Spot!
Conceitos do ECS Fargate
Antes de começar, vamos explorar alguns conceitos de ECS, que usaremos para Fargate Spot neste blog.
StopTask e StopTimeout
Como a tarefa Fargate Spot pode ser interrompida com dois minutos de antecedência, você precisa garantir de que você a finalizou de maneira graciosa.
Para fazer isso, você pode usar conceitos como o parâmetro StopTimeout. Quando StopTask é chamado em uma tarefa, o equivalente ao docker stop é enviado para os contêineres em execução na tarefa. Se o contêiner tratar o valor SIGTERM de maneira graciosa e finalizar dentro de 30 segundos após recebê-lo, nenhum sinal SIGKILL será enviado. Normalmente, você usa o parâmetro StopTimeout da definição da tarefa para controlar esse comportamento. StopTimeout é a duração (em segundos) da espera antes que o contêiner seja interrompido de maneira forçada caso não finalize normalmente por conta própria. Para Fargate 1.3.0 ou posterior, o valor máximo de tempo limite de parada é 120 segundos. Se o parâmetro não for especificado, o valor padrão de 30 segundos será usado.
Provedores de Capacidade
Os Provedores de Capacidade são uma nova forma de gerenciar a capacidade de computação dos contêineres. Esta ferramenta permite que o aplicativo defina seus requisitos sobre como usar a capacidade. Com os Provedores de Capacidade você pode definir regras flexíveis sobre como as cargas de trabalho em contêineres são executadas em diferentes tipos de capacidade de computação e gerenciar o dimensionamento de capacidade. Os provedores de capacidade melhoram a disponibilidade, a escalabilidade e o custo da execução de tarefas e serviços no ECS. A partir de agora, cada cluster pode ter até seis provedores de capacidade e uma estratégia opcional de provedor de capacidade padrão, que determina como as tarefas são distribuídas entre os provedores de capacidade. Para executar suas tarefas, você pode usar a estratégia padrão do provedor de capacidade ou especificar a sua própria estratégia.
Provedores de Capacidade AWS Fargate e AWS Fargate Spot não precisam ser criados. Eles estão disponíveis para todas as contas e devem apenas ser associados a um cluster para que estejam disponíveis para uso. Quando você cria um novo cluster usando o Amazon ECS Console, com o template Networking only, os provedores de capacidade FARGATE e FARGATE_SPOT são associados automaticamente ao novo cluster.
Um cluster pode conter uma combinação de provedores de capacidade FARGATE, FARGATE_SPOT e Auto Scaling Group (ASG); no entanto, neste momento, uma estratégia de provedor de capacidade só pode conter um único provedor de capacidade, seja FARGATE ou Auto Scaling Group, mas não ambos.
Agora que eu cobri esses dois conceitos do ECS Fargate, vamos para a demonstração.
Inicie uma tarefa spot do ECS Fargate usando o AWS Management Console
- Abra o console do Amazon ECS.
- Na barra de navegação, selecione a região que deseja usar.
- No painel de navegação, escolha “Clusters”.
- Na página Clusters, escolha “Create Cluster”.
- Crie um cluster “Networking only”.
Com essa opção, você pode criar um cluster com uma nova VPC e executar tarefas do Fargate. Os provedores de capacidade FARGATE e FARGATE_SPOT são automaticamente associados ao cluster, conforme a imagem a seguir.
- Clique em Update Cluster no canto superior direito para definir uma estratégia de fornecedor de capacidade.
Neste exemplo, utilizo uma combinação de provedores de capacidade FARGATE_SPOT e FARGATE. Selecionei um Peso (Weight) de 4 para FARGATE_SPOT e 1 para FARGATE. Isto significa que para cada cinco tarefas, quatro são iniciadas no FARGATE_SPOT e uma no FARGATE. Você pode distribuir isso como achar mais conveniente. Mais tarefas no Fargate Spot significam mais economia. Mas se sua carga de trabalho requer alta disponibilidade e você não está confortável com interrupções, comece com uma proporção que funcione melhor para você.
- Primeiro criamos uma definição de tarefa. Aqui estão algumas definições de tarefa base com as quais você pode começar. Encontre o link “Task Definition” no painel de navegação esquerdo, clique em “Create new Task Definition”, escolha o tipo “Fargate”, role para baixo, perto da parte inferior da página, encontre o botão “Configure via JSON”. Exclua o JSON pré-preenchido no campo, copie a definição da tarefa Fargate WebApp dos exemplos acima e cole-a. Clique em Save. Clique em Create.
{ "family": "webapp-fargate-task", "networkMode": "awsvpc", "containerDefinitions": [ { "name": "fargate-app", "image": "httpd:2.4",
"portMappings": [ { "containerPort": 80, "hostPort": 80, "protocol": "tcp" } ], "essential": true, "entryPoint": [ "sh", "-c" ], "command": [ "/bin/sh -c \"echo '<html> <head> <title>Amazon ECS Sample App</title> <style>body {margin-top: 40px; background-color: #333;} </style> </head><body> <div style=color:white;text-align:center> <h1>Amazon ECS Sample App</h1> <h2>Congratulations!</h2> <p>Your application is now running on a container in Amazon ECS.</p> </div></body></html>' > /usr/local/apache2/htdocs/index.html && httpd-foreground\"" ]
} ], "requiresCompatibilities": [ "FARGATE" ], "cpu": "256", "memory": "512" }
- Agora que nossa definição de tarefa está pronta, vamos executá-la. Selecione a Task definition que você acabou de criar, clique em “Action” e, em seguida, em “Run Task”. Informe o número de tarefas que deseja executar. Neste caso, escolhi 10. Após configurar a VPC e os security groups, clique em “Executar tarefa”.
O comando Run Task da última etapa inicia 10 tarefas (imagem 5), das quais oito são iniciadas pelo provedor de capacidade FARGATE_SPOT e duas são iniciadas com o provedor de capacidade FARGATE (lembre-se que a proporção definida foi de 4:1).
Aqui podemos ver uma tarefa em execução. Veja cuidadosamente que o provedor de capacidade é “FARGATE_SPOT”
Nesta segunda tarefa, o provedor de capacidade utilizado é “FARGATE”
Na próxima seção, explorarei como iniciar tarefas Fargate Spot usando a Interface Linha de Comando (ILC) da AWS.
Criação de uma tarefa Fargate Spot no ECS usando o AWS CLI
Criar um cluster com provedores de capacidade
Ao criar um novo cluster usando o AWS CLI, você deve especificar quais provedores de capacidade (capacity providers) serão utilizados. No exemplo a seguir, especifiquei dois capacity providers: FARGATE e FARGATE_SPOT.
Utilize o comando abaixo para especificar os capacity providers:
$ bash aws ecs create-cluster \ --cluster-name "Fargate-Spot-Deep-Dive" --capacity-providers FARGATE FARGATE_SPOT
A execução deste comando deve resultar na seguinte saída:
$ bash "cluster": { "status": "PROVISIONING", "defaultCapacityProviderStrategy": [], "statistics": [], "capacityProviders": [ "FARGATE", "FARGATE_SPOT" ], ...
Iniciar uma tarefa
Depois que o cluster for criado, você poderá iniciar uma tarefa Fargate Spot usando o comando “Run Task” e fornecendo o provedor de capacidade Spot no campo –capacity-provider-strategy. Você também deve especificar:
- Uma Task definition
- Opções de peso (weight) para provedores de capacidade
- Uma configuração de rede (Subnets, Security Groups)
- Quantas Tasks você deseja executar
Neste exemplo, as seguintes especificações foram utilizadas com o comando:
$ bash aws ecs run-task \ --capacity-provider-strategy capacityProvider=FARGATE,weight=1 capacityProvider=FARGATE_SPOT,weight=1 \ --cluster "Fargate-Spot-Deep-Dive" \ --task-definition task-def-family:revision \ --network-configuration "awsvpcConfiguration={subnets=[string,string],securityGroups=[string,string],assignPublicIp=string}" \ -count integer \
Se você especificar count = 10 e weight = 1 para ambos os provedores, serão iniciadas 5 tarefas FARGATE_SPOT e 5 FARGATE_SPOT.
Criar um Serviço
O exemplo a seguir mostra como criar um Serviço (Service) utilizando apenas FARGATE_SPOT.
$ bash aws ecs create-service \ --capacity-provider-strategy capacityProvider=FARGATE,weight=1 capacityProvider=FARGATE_SPOT,weight=1 \ --cluster "Fargate-Spot-Deep-Dive" \ --service-name FargateService \ --task-definition task-def-family:revision \ --network-configuration "awsvpcConfiguration={subnets=[string,string],securityGroups=[string,string],assignPublicIp=string}" \ --desired-count integer \
Também é possível criar um serviço com uma combinação de tarefas Spot e sob demanda usando o comando CreateService e fornecendo provedores de capacidade Spot e sob demanda no campo estratégia do provedor de capacidade.
O atributo “base” é um campo opcional, que neste caso, diz que deve haver pelo menos quatro tarefas sob demanda (a base padrão é 0, você não pode especificar mais de um provedor de capacidade com o atributo “base” diferente de zero). O weight (peso) é outro campo opcional que diz que para as seis tarefas restantes, excluindo as quatro definidas pelo atributo “base”, deve haver uma tarefa sob demanda para cada duas tarefas Spot.
$bash aws ecs create-service \ --cluster "my-cluster" --service-name "my-service" --desired-count 10 --capacity-provider-strategy [ {'capacityProvider':'FARGATE_SPOT', 'weight': 2, 'base': 0}, {'capacityProvider':'FARGATE', 'weight': 1, 'base': 4}, ] ...
Adicione os provedores de capacidade FARGATE_SPOT a um cluster existente
$bash aws ecs put-cluster-capacity-providers \ --cluster "Fargate-Spot-Deep-Dive" \ --capacity-providers FARGATE FARGATE_SPOT existing_capacity_provider1 existing_capacity_provider2 \ --default-capacity-provider-strategy existing_default_capacity_provider_strategy \
Como lidar com avisos de encerramento Fargate Spot
Por design, Fargate Spot é um serviço interruptível. Quando as tarefas que usam FARGATE_SPOT são interrompidas devido a uma interrupção Spot, um aviso de dois minutos é enviado antes de uma tarefa ser interrompida.
O aviso é enviado como um evento de alteração de status da tarefa para o Amazon EventBridge e um sinal SIGTERM para a tarefa em execução. Quando você usa Fargate Spot como parte de um serviço (ECS Service), o scheduler desse serviço receberá o sinal de interrupção e tentará iniciar tarefas adicionais no Fargate Spot se houver capacidade disponível.
Para garantir que nossos contêineres finalizem sem problemas antes que a tarefa seja interrompida, o seguinte pode ser usado:
Um valor para StopTimeout de 120 segundos (2 minutos) ou menos na definição de contêiner utilizada pela tarefa. Ao especificar um valor StopTimeout temos um tempo entre o momento em que o evento de alteração de status da tarefa é recebido e quando o contêiner é forçado a parar.
O sinal SIGTERM deve ser recebido dentro do contêiner para realizar qualquer operação de limpeza.
O trecho abaixo de um evento de alteração de status da tarefa mostra o motivo e o código de parada para uma interrupção FARGATE_SPOT.
{ "version": "0", "id": "9bcdac79-b31f-4d3d-9410-fbd727c29fab", "detail-type": "ECS Task State Change", "source": "aws.ecs", "account": "111122223333", "resources": [ "arn:aws:ecs:us-east-1:111122223333:task/b99d40b3-5176-4f71-9a52-9dbd6f1cebef" ], "detail": { "clusterArn": "arn:aws:ecs:us-east-1:111122223333:cluster/default", "createdAt": "2016-12-06T16:41:05.702Z", "desiredStatus": "STOPPED", "lastStatus": "RUNNING", "stoppedReason": "Your Spot Task was interrupted.", "stopCode": "TerminationNotice", "taskArn": "arn:aws:ecs:us-east-1:111122223333:task/b99d40b3-5176-4f71-9a52-9dbd6fEXAMPLE", ... } }
Exemplo de evento SERVICE_TASK_PLACEMENT_FAILURE
Caso o FARGATE_SPOT não consiga subir uma tarefa devido a restrições de capacidade; os eventos SERVICE_TASK_PLACEMENT_FAILURE são entregues.
No exemplo a seguir, a tarefa tentou usar o provedor de capacidade FARGATE_SPOT, mas o scheduler de serviço não pôde obter qualquer capacidade do Fargate Spot.
{ "version": "0", "id": "ddca6449-b258-46c0-8653-e0e3a6d0468b", "detail-type": "ECS Service Action", "source": "aws.ecs", "account": "111122223333", "time": "2019-11-19T19:55:38Z", "region": "us-west-2", "resources": [ "arn:aws:ecs:us-west-2:111122223333:service/default/servicetest" ], "detail": { "eventType": "ERROR", "eventName": "SERVICE_TASK_PLACEMENT_FAILURE", "clusterArn": "arn:aws:ecs:us-west-2:111122223333:cluster/default", "capacityProviderArns": [ "arn:aws:ecs:us-west-2:111122223333:capacity-provider/FARGATE_SPOT" ], "reason": "RESOURCE:FARGATE", "createdAt": "2019-11-06T19:09:33.087Z" } }
O Amazon EventBridge permite automatizar seus serviços da AWS e responder automaticamente a evento, como problemas de disponibilidade de aplicativos ou alterações de recursos. Os eventos dos serviços da AWS são entregues ao EventBridge praticamente em tempo real. Você pode escrever regras simples para indicar quais eventos são de seu interesse e quais ações automatizadas devem ser executadas quando um evento corresponde a uma regra.
Você pode encontrar mais detalhes sobre como usar os Eventos do Amazon ECS aqui.
Preços do Fargate SPOT
Com o AWS Fargate, não há pagamentos antecipados e você paga apenas pelos recursos que utiliza. Você paga pela quantidade de vCPUs e recursos de memória que seus aplicativos consomem em contêineres.
O preço Spot de CPU/hora e GB/hora é o mesmo em todas as zonas de disponibilidade e Task Configuration. No entanto, o preço varia ao longo do dia. O preço mais recente está disponível na página de preços do Fargate. A definição de preço é por segundo com o mínimo de um minuto. A duração é calculada do momento em que o download da(s) imagen(s) de contêiner(s) (pull do docker) é iniciado até o término da tarefa, arredondado para o segundo mais próximo.
Práticas recomendadas de Fargate
- O Fargate Spot é ideal para cargas de trabalho sem estado e tolerantes a falhas, mas não dependa apenas de tarefas Spot para cargas de trabalho críticas, a melhor opção é configurar uma combinação que também inclua capacidade sob demanda.
- Os aplicativos em execução no Fargate Spot devem ser tolerantes a falhas.
- Lidar com interrupções de forma graciosa ao captar sinais SIGTERM.
Conclusão
O Fargate Spot é ideal para cargas de trabalho paralelizáveis, como renderização de imagens, simulações de Monte Carlo e processamento genômico. No entanto, os clientes também podem usar o Fargate Spot para tarefas executadas como parte dos serviços ECS, como sites e APIs, que exigem alta disponibilidade.
O ECS Fargate já facilita a execução de cargas de trabalho em contêineres sem se preocupar com a configuração e o gerenciamento da infraestrutura. O Fargate Spot o torna mais acessível para suas cargas de trabalho sensíveis ao preço. Com a combinação certa de fornecedores de capacidade FARGATE_SPOT e FARGATE_SPOT, você pode obter a capacidade ideal para suas tarefas dentro de seu orçamento.
Disponível para todos os cliente
O AWS Fargate Spot está disponível para todos os nossos clientes. Para obter mais informações, consulte o seguinte link: https://aws.amazon.com/pt/about-aws/whats-new/2019/12/aws-launches-fargate-spot-save-up-to-70-for-fault-tolerant-applications/
Mais informações:
Comece hoje fazendo estes laboratórios:
Este artigo foi traduzido do Blog da AWS em Inglês.
Sobre o Autor
Pritam Pal, Sr. EC2 Spot Specialist SA na AWS.
Sobre o Tradutor
Jairo da Silva Junior, Arquiteto de Soluções Sênior, AWS Brasil.