Está com dificuldade para rodar mais do que algumas tasks por host ECS? Então continue lendo e descubra uma solução simples que vai aumentar drasticamente o número de tasks ECS que você consegue executar.
Contexto
Por padrão, o ECS no EC2 limita o número de tasks que podem rodar em cada nó. O limite exato depende do tipo de instância utilizada. Essa limitação existe porque cada task precisa ter uma Elastic Network Interface (ENI) atribuída, o que restringe o número máximo de tasks por instância.
O ENI trunking entra em cena!
O ENI trunking (com a configuração de conta awsvpcTrunking) permite que um host execute muito mais tasks. Isso é feito usando a ENI primária para a comunicação do host, enquanto ENIs adicionais são atribuídas para o trunking. Essas ENIs extras são adicionadas como branch interfaces, até o limite máximo daquele tipo de instância.
Vamos pegar um tipo de nó bem comum: o r5.xlarge. Por padrão, ele suporta três tasks, mas com o ENI trunking habilitado esse número sobe para 20. (Tabela de referência com o número máximo de tasks por tipo de instância.)
Habilitando o trunking em um cluster existente
Habilitar o trunking na criação de um cluster ECS funciona bem, mas e se você já tem um cluster e agora quer ativar o trunking?
Primeiro, verifique se o trunking está habilitado com o comando abaixo. Você pode executá-lo no CloudShell ou em uma CLI configurada adequadamente:
aws ecs list-attributes --target-type container-instance --attribute-name ecs.awsvpc-trunk-id --cluster <Cluster Name> --region <Region>
Se o retorno for uma lista de atributos vazia, o cluster informado não tem o trunking habilitado.
Pontos de atenção sobre o trunking
Antes de habilitar o trunking, vale conferir a documentação da AWS, que descreve suas limitações.
Os pontos de atenção mais comuns sobre o ENI trunking são:
- Apenas o modo de rede awsvpc é suportado.
- O launch type precisa ser EC2 (o Fargate não precisa desse recurso, pois já fornece uma ENI dedicada para cada task por padrão).
- Redes compartilhadas não são suportadas.
- Containers Windows não são suportados.
- A service linked role precisa existir (é criada por padrão quando o cluster ECS é criado).
- Requisições de DNS IPV4 baseadas em recursos (registro A) não devem estar habilitadas (padrão na criação de instâncias EC2).
Vamos habilitar o trunking
Se você usar o Console Web da AWS para habilitar o trunking em um cluster existente, a interface vai mostrar que ele está ativado, mas é bem provável que o comando aws ecs list-attributes retorne um array de atributos vazio, indicando que, na prática, ele não está habilitado.

Console da AWS mostrando, possivelmente de forma incorreta, que o trunking está habilitado
Se for esse o caso, você pode habilitar o trunking para todos os clusters da conta executando o seguinte comando:
aws ecs put-account-setting-default --name awsvpcTrunking --value enabled --region <Region>
Com esse método, basta definir o padrão uma vez por região para cada conta, já que o comando ajusta a propriedade default account setting para o trunking.
As novas instâncias ECS vão assumir essa mudança de configuração, ou você pode reiniciar as instâncias já implantadas. Se estiver usando um autoscaling group, aumente o número de instâncias e recicle os nós para aplicar a mudança sem interrupções.
Para confirmar se o trunking está funcionando, basta checar a contagem de tasks por host ou rodar novamente o comando aws ecs list-attributes. Agora ele deve retornar uma lista de interfaces habilitadas para trunking, em vez de um array de atributos vazio.
Se você ainda não conhece a DoiT, vale muito a pena dar uma olhada. Nosso time está pronto para conhecer melhor você e as suas necessidades de engenharia em nuvem. Formados exclusivamente por talentos sêniores de engenharia, somos especializados em consultoria avançada em nuvem, design arquitetural e apoio em debugging. Entre em contato e vamos conversar!