

# Como o Amazon ECS posiciona tarefas em instâncias de contêineres
<a name="task-placement"></a>

Você pode usar o posicionamento de tarefas para configurar o Amazon ECS para colocar suas tarefas em instâncias de contêiner que atendam a determinados critérios, por exemplo, uma zona de disponibilidade ou um tipo de instância.

Veja estes componentes de posicionamento de tarefas:
+ Estratégia de posicionamento de tarefas: o algoritmo que seleciona instâncias de contêiner para posicionamento de tarefas ou encerramento de tarefas. Por exemplo, o Amazon ECS pode selecionar instâncias de contêiner aleatoriamente ou pode selecionar instâncias de contêiner de modo que as tarefas sejam distribuídas uniformemente em um grupo de instâncias.
+ Grupo de tarefas: um grupo de tarefas relacionadas, por exemplo, tarefas de banco de dados.
+ Restrição de posicionamento de tarefas: essas regras devem ser atendidas para posicionar uma tarefa em uma instância de contêiner. Se a restrição não for atendida, a tarefa não será posicionada e permanecerá no estado `PENDING`. Por exemplo, é possível usar uma restrição para posicionar tarefas somente em um tipo de instância específico. 

O Amazon ECS tem algoritmos diferentes para as diferentes opções de capacidade. 

## Instâncias gerenciadas do Amazon ECS
<a name="managed-instances-launch-type"></a>

Para tarefas que são executadas em instâncias gerenciadas do Amazon ECS, o Amazon ECS deve determinar onde colocar a tarefa e, ao reduzir a escala verticalmente da contagem de tarefas, quais tarefas encerrar. O Amazon ECS faz essa determinação com base nos requisitos de instância especificados no modelo de execução do provedor de capacidade, nos requisitos especificados na definição da tarefa, como CPU e memória, e nas restrições de posicionamento da tarefa.

**nota**  
As instâncias gerenciadas do Amazon ECS não oferecem suporte a estratégias de posicionamento de tarefas. O Amazon ECS fará o possível para distribuir as tarefas entre as zonas de disponibilidade acessíveis.

Quando o Amazon ECS posiciona as tarefas, ele usa o processo a seguir para selecionar as instâncias de contêiner:

1. Identificar instâncias de contêiner que atendam aos requisitos de CPU, GPU, memória e porta na definição de tarefa.

1. Identificar instâncias de contêiner que atendam às limitações de posicionamento de tarefas.

1. Identifique as instâncias de contêiner que atendam aos requisitos de instância especificados no modelo de execução do provedor de capacidade.

1. Selecionar instâncias de contêiner para o posicionamento de tarefas.

## EC2
<a name="ec2-launch-type"></a>

Para tarefas que usam o tipo de execução do EC2, o Amazon ECS deve determinar onde posicionar a tarefa com base nos requisitos especificados na definição da tarefa, como CPU e memória. Do mesmo modo, quando você reduz proporcionalmente a contagem de tarefas, o Amazon ECS deve determinar que tarefas serão concluídas. É possível aplicar estratégias e limitações de posicionamento de tarefas para personalizar como o Amazon ECS posiciona e finaliza tarefas. 

As estratégias padrão de posicionamento de tarefas dependem de você executar as tarefas manualmente (tarefas autônomas) ou em um serviço. Para tarefas executadas como parte de um serviço Amazon ECS, a estratégia de colocação de tarefas será `spread` usando `attribute:ecs.availability-zone`. Não existe uma restrição padrão de colocação de tarefas para tarefas que não estão em serviços. Para obter mais informações, consulte [Programação de contêineres no Amazon ECS](scheduling_tasks.md).

**nota**  
As estratégias de posicionamento de tarefas têm como base o melhor esforço. O Amazon ECS ainda tenta posicionar tarefas mesmo quando a opção de posicionamento ideal está indisponível. No entanto, as restrições de posicionamento de tarefas são vinculativas e podem impedir o posicionamento delas. 

É possível usar estratégias e restrições de posicionamento de tarefas em conjunto. Por exemplo, você pode usar uma estratégia de posicionamento de tarefas e uma restrição de posicionamento de tarefas para distribuir tarefas entre zonas de disponibilidade e tarefas de compartimento com base na memória dentro de cada zona de disponibilidade, mas apenas para instâncias G2.

Quando o Amazon ECS posiciona as tarefas, ele usa o processo a seguir para selecionar as instâncias de contêiner:

1. Identificar instâncias de contêiner que atendam aos requisitos de CPU, GPU, memória e porta na definição de tarefa.

1. Identificar instâncias de contêiner que atendam às limitações de posicionamento de tarefas.

1. Identificar instâncias de contêiner que atendam às estratégias de posicionamento de tarefas.

1. Selecionar instâncias de contêiner para o posicionamento de tarefas.

## Fargate
<a name="fargate-launch-type"></a>

Não há suporte para estratégias e restrições de posicionamento de tarefas que usam o Fargate. O Fargate fará o possível para distribuir tarefas em zonas de disponibilidade acessíveis. Se o provedor de capacidade incluir o Fargate e o Fargate Spot, o comportamento da distribuição será independente para cada provedor de capacidade. 

# Ajuste de escala automático e posicionamento de tarefas das instâncias gerenciadas do Amazon ECS
<a name="managed-instance-auto-scaling"></a>

As instâncias gerenciadas do Amazon ECS usam algoritmos inteligentes para escalar automaticamente a capacidade do cluster e posicionar tarefas de forma eficiente em toda a infraestrutura. A compreensão de como esses algoritmos funcionam ajuda você a otimizar suas configurações de serviço e solucionar problemas de comportamento de posicionamento.

## Algoritmo de posicionamento de tarefa
<a name="managed-instance-task-placement-algorithm"></a>

As instâncias gerenciadas do Amazon ECS usam um algoritmo de posicionamento sofisticado que equilibra a disponibilidade, a utilização de recursos e os requisitos de rede ao programar tarefas.

### Distribuição de zonas de disponibilidade
<a name="managed-instance-az-spread-behavior"></a>

Por padrão, as instâncias gerenciadas do Amazon ECS priorizam a disponibilidade distribuindo tarefas entre várias zonas de disponibilidade:
+ Para serviços com várias tarefas, as instâncias gerenciadas do Amazon ECS garantem a distribuição em pelo menos três instâncias de diferentes zonas de disponibilidade, quando possível
+ Esse comportamento fornece tolerância a falhas, mas pode resultar em menor utilização de recursos por instância.
+ A distribuição de zonas de disponibilidade tem precedência sobre a otimização do empacotamento

### Comportamento do empacotamento
<a name="managed-instance-bin-packing"></a>

Embora as instâncias gerenciadas do Amazon ECS possam realizar o empacotamento para maximizar a utilização de recursos, esse comportamento é influenciado pela configuração da rede:
+ Para conseguir o empacotamento, configure seu serviço para usar uma única sub-rede
+ As configurações de várias sub-redes priorizam a distribuição de zonas de disponibilidade em relação à densidade de recursos
+ O empacotamento é mais provável durante o lançamento inicial do serviço do que durante eventos de escala

### Considerações sobre densidade de ENI
<a name="managed-instance-eni-density"></a>

Para serviços que usam o modo de rede `awsvpc`, as instâncias gerenciadas do Amazon ECS consideram a densidade da interface de rede elástica (ENI) ao tomar decisões de posicionamento:
+ Cada tarefa no modo `awsvpc` exige uma ENI dedicada
+ Os tipos de instância têm limites de ENI diferentes que afetam a densidade da tarefa
+ As instâncias gerenciadas do Amazon ECS contam com a disponibilidade da ENI ao selecionar instâncias de destino

**nota**  
Melhorias nos cálculos de densidade da ENI estão sendo feitas continuamente para otimizar as decisões de posicionamento.

## Lógica de decisão do provedor de capacidade
<a name="managed-instance-capacity-provider-decisions"></a>

Os provedores de capacidade de instâncias gerenciadas do Amazon ECS tomam decisões de escala e posicionamento com base em vários fatores:

Requisitos de recursos  
Requisitos de CPU, memória e rede das tarefas pendentes

Disponibilidade da instância  
Capacidade e utilização atuais em todas as instâncias existentes

Restrições de rede  
Configuração de sub-rede e disponibilidade da ENI

Distribuição de zonas de disponibilidade  
Manter a tolerância a falhas em várias zonas de disponibilidade

## Opções de configuração
<a name="managed-instance-configuration-options"></a>

### Estratégia de seleção de sub-rede
<a name="managed-instance-subnet-strategy"></a>

Sua configuração de sub-rede afeta significativamente o comportamento de posicionamento de tarefas:

Várias sub-redes (padrão)  
Prioriza a distribuição de zonas de disponibilidade para alta disponibilidade  
Pode resultar em menor utilização de recursos por instância  
Recomendado para workloads de produção que exigem tolerância a falhas

Sub-rede única  
Permite o empacotamento para maior utilização de recursos  
Reduz a tolerância a falhas concentrando as tarefas em uma zona de disponibilidade  
Adequado para workloads de desenvolvimento ou com custo otimizado

### Considerações sobre modo de rede
<a name="managed-instance-network-mode-considerations"></a>

O modo de rede escolhido afeta as decisões de posicionamento:
+ Modo `awsvpc`: cada tarefa requer uma ENI dedicada, limitando a densidade da tarefa por instância
+ Modo `host`: as tarefas usam a rede do host diretamente, com o posicionamento orientado principalmente pela disponibilidade de recursos

### Considerações sobre arquitetura de CPU
<a name="managed-instance-cpu-architecture-considerations"></a>

O `cpuArchitecture` que você especifica na definição da tarefa é usado para colocar tarefas em uma arquitetura específica. Se você não especificar um `cpuArchitecture`, o Amazon ECS tentará colocar as tarefas em qualquer arquitetura de CPU disponível com base na configuração do provedor de capacidade. É possível especificar `X86_64` ou `ARM64`.

## Solução de problemas do posicionamento de tarefas
<a name="managed-instance-troubleshooting-placement"></a>

### Padrões de posicionamento comuns
<a name="managed-instance-common-placement-patterns"></a>

A compreensão dos padrões de posicionamento esperados ajuda a distinguir o comportamento normal dos possíveis problemas:

Distribuição expandida  
Tarefas distribuídas em várias instâncias com utilização parcial  
Comportamento normal ao usar várias sub-redes  
Indica a priorização da disponibilidade em relação à eficiência dos recursos

Posicionamento concentrado  
Várias tarefas colocadas em menos instâncias com maior utilização  
Esperado ao usar a configuração de sub-rede única  
Pode ocorrer durante o lançamento inicial do serviço

Distribuição desigual  
Algumas instâncias são muito utilizadas, enquanto outras permanecem subutilizadas  
Pode indicar limites de ENI ou restrições de recursos  
Considere analisar os tipos de instância e a configuração de rede

### Otimizar o comportamento de posicionamento
<a name="managed-instance-placement-optimization"></a>

Para otimizar o posicionamento das tarefas de acordo com seus requisitos específicos:

1. Avalie seus requisitos de disponibilidade em relação às necessidades de otimização de custos

1. Escolha a configuração de sub-rede apropriada com base em suas prioridades

1. Selecione tipos de instância com capacidade de ENI adequada para seu modo de rede

1. Monitore os padrões de posicionamento e ajuste a configuração conforme necessário

## Práticas recomendadas
<a name="managed-instance-best-practices"></a>
+ **Para workloads de produção**: use várias sub-redes em diferentes zonas de disponibilidade para garantir alta disponibilidade, aceitando a compensação na utilização de recursos
+ **Para desenvolvimento ou teste**: considere a configuração de uma única sub-rede para maximizar a utilização de recursos e reduzir custos
+ **Para o modo `awsvpc`**: escolha tipos de instância com capacidade de ENI suficiente para evitar restrições de posicionamento
+ **Para otimização de custos**: monitore os padrões de utilização e ajuste a configuração do serviço para equilibrar disponibilidade e eficiência
+ **Para solução de problemas**: analise a configuração da sub-rede e o modo de rede ao investigar padrões de posicionamento inesperados

# Uso de estratégias para definir o posicionamento de tarefas do Amazon ECS
<a name="task-placement-strategies"></a>

Para tarefas que usam o tipo de execução do EC2, o Amazon ECS deve determinar onde posicionar a tarefa com base nos requisitos especificados na definição da tarefa, como CPU e memória. Do mesmo modo, quando você reduz proporcionalmente a contagem de tarefas, o Amazon ECS deve determinar que tarefas serão concluídas. É possível aplicar estratégias e limitações de posicionamento de tarefas para personalizar como o Amazon ECS posiciona e finaliza tarefas. 

As estratégias padrão de posicionamento de tarefas dependem de você executar as tarefas manualmente (tarefas autônomas) ou em um serviço. Para tarefas executadas como parte de um serviço Amazon ECS, a estratégia de colocação de tarefas será `spread` usando `attribute:ecs.availability-zone`. Não existe uma restrição padrão de colocação de tarefas para tarefas que não estão em serviços. Para obter mais informações, consulte [Programação de contêineres no Amazon ECS](scheduling_tasks.md).

**nota**  
As estratégias de posicionamento de tarefas têm como base o melhor esforço. O Amazon ECS ainda tenta posicionar tarefas mesmo quando a opção de posicionamento ideal está indisponível. No entanto, as restrições de posicionamento de tarefas são vinculativas e podem impedir o posicionamento delas. 

É possível usar estratégias e restrições de posicionamento de tarefas em conjunto. Por exemplo, você pode usar uma estratégia de posicionamento de tarefas e uma restrição de posicionamento de tarefas para distribuir tarefas entre zonas de disponibilidade e tarefas de compartimento com base na memória dentro de cada zona de disponibilidade, mas apenas para instâncias G2.

Quando o Amazon ECS posiciona as tarefas, ele usa o processo a seguir para selecionar as instâncias de contêiner:

1. Identificar instâncias de contêiner que atendam aos requisitos de CPU, GPU, memória e porta na definição de tarefa.

1. Identificar instâncias de contêiner que atendam às limitações de posicionamento de tarefas.

1. Identificar instâncias de contêiner que atendam às estratégias de posicionamento de tarefas.

1. Selecionar instâncias de contêiner para o posicionamento de tarefas.

Você especifica estratégias de posicionamento de tarefas na definição do serviço ou na definição da tarefa usando o parâmetro `placementStrategy`.

```
"placementStrategy": [
    {
        "field": "The field to apply the placement strategy against",
        "type": "The placement strategy to use"
    }
]
```

Você pode especificar as estratégias ao executar uma tarefa ([RunTask](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_RunTask.html)), criar um serviço ([CreateService](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_CreateService.html)) ou atualizar um serviço existente ([UpdateService](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_UpdateService.html)).

A tabela a seguir descreve os tipos e campos disponíveis.


| type | Valores de campo válidos | 
| --- | --- | 
| binpack As tarefas são colocadas em instâncias de contêiner para deixar a menor quantidade de CPU ou memória não utilizada. Essa estratégia minimiza o número de instâncias de contêiner em uso. Quando essa estratégia é usada e uma ação de redução de escala na horizontal é executada, o Amazon ECS encerra as tarefas. Ele faz isso com base na quantidade de recursos que são deixados na instância de contêiner após o encerramento da tarefa. A instância de contêiner que tiver os recursos mais disponíveis após o encerramento da tarefa fará com que essa tarefa seja encerrada. |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/AmazonECS/latest/developerguide/task-placement-strategies.html)  | 
| random As tarefas são colocadas aleatoriamente. | Não usado | 
| spreadAs tarefas são colocadas uniformemente com base no valor especificado. As tarefas de serviço são distribuídas com base nas tarefas desse serviço. Tarefas autônomas são distribuídas com base nas tarefas do mesmo grupo de tarefas. Para obter mais informações sobre grupos de tarefas, consulte [Tarefas do Amazon ECS relacionadas a grupos](task-groups.md). Quando a estratégia `spread` for usada e uma ação de redução for executada, o Amazon ECS selecionará tarefas para encerrar que mantenham um equilíbrio entre as Zonas de disponibilidade. Dentro de uma zona de disponibilidade, as tarefas são selecionadas aleatoriamente. |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/AmazonECS/latest/developerguide/task-placement-strategies.html)  | 

As estratégias de posicionamento de tarefas também podem ser atualizadas para os serviços existentes. Para obter mais informações, consulte [Como o Amazon ECS posiciona tarefas em instâncias de contêineres](task-placement.md).

É possível criar uma estratégia de posicionamento de tarefas que use várias estratégias criando matrizes de estratégias na ordem em que você desejar que elas sejam executadas. Por exemplo, se você quiser distribuir tarefas entre zonas de disponibilidade e, em seguida, agrupar tarefas com base na memória dentro de cada zona de disponibilidade, especifique a estratégia de zona de disponibilidade seguida pela estratégia de memória. Para obter exemplos de estratégias, consulte [Exemplo de estratégias de posicionamento de tarefas do Amazon ECS](strategy-examples.md).

# Exemplo de estratégias de posicionamento de tarefas do Amazon ECS
<a name="strategy-examples"></a>

É possível especificar estratégias de posicionamento de tarefas com as ações a seguir: [CreateService](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_CreateService.html), [UpdateService](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_UpdateService.html) e [RunTask](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_RunTask.html).

**Topics**
+ [Distribuir tarefas uniformemente entre zonas de disponibilidade](#even-az)
+ [Distribuir tarefas uniformemente entre todas as instâncias](#even-instance)
+ [Tarefas de agrupamento baseadas na memória](#binpack)
+ [Posicionar tarefas aleatoriamente](#random)
+ [Distribui tarefas uniformemente em zonas de disponibilidade e, em seguida, distribui as tarefas uniformemente entre as instâncias em cada zona de disponibilidade](#az-instance)
+ [Distribui tarefas uniformemente em zonas de disponibilidade e, em seguida, agrupa as tarefas com base na memória em cada zona de disponibilidade](#az-memory)
+ [Distribui as tarefas uniformemente entre as instâncias e, em seguida, agrupa as tarefas com base na memória](#instance-memory)

## Distribuir tarefas uniformemente entre zonas de disponibilidade
<a name="even-az"></a>

A estratégia a seguir distribui tarefas uniformemente em zonas de disponibilidade.

```
"placementStrategy": [
    {
        "field": "attribute:ecs.availability-zone",
        "type": "spread"
    }
]
```

## Distribuir tarefas uniformemente entre todas as instâncias
<a name="even-instance"></a>

A estratégia a seguir distribui tarefas uniformemente em todas as instâncias.

```
"placementStrategy": [
    {
        "field": "instanceId",
        "type": "spread"
    }
]
```

## Tarefas de agrupamento baseadas na memória
<a name="binpack"></a>

O pacote de estratégias a seguir agrupa tarefas com base na memória.

```
"placementStrategy": [
    {
        "field": "memory",
        "type": "binpack"
    }
]
```

## Posicionar tarefas aleatoriamente
<a name="random"></a>

A estratégia a seguir posiciona tarefas aleatoriamente.

```
"placementStrategy": [
    {
        "type": "random"
    }
]
```

## Distribui tarefas uniformemente em zonas de disponibilidade e, em seguida, distribui as tarefas uniformemente entre as instâncias em cada zona de disponibilidade
<a name="az-instance"></a>

A estratégia a seguir distribui tarefas uniformemente em zonas de disponibilidade, em seguida, distribui as tarefas uniformemente entre as instâncias em cada Zona de disponibilidade.

```
"placementStrategy": [
    {
        "field": "attribute:ecs.availability-zone",
        "type": "spread"
    },
    {
        "field": "instanceId",
        "type": "spread"
    }
]
```

## Distribui tarefas uniformemente em zonas de disponibilidade e, em seguida, agrupa as tarefas com base na memória em cada zona de disponibilidade
<a name="az-memory"></a>

A estratégia a seguir distribui tarefas uniformemente em zonas de disponibilidade, em seguida agrupa as tarefas com base na memória em cada Zona de disponibilidade.

```
"placementStrategy": [
    {
        "field": "attribute:ecs.availability-zone",
        "type": "spread"
    },
    {
        "field": "memory",
        "type": "binpack"
    }
]
```

## Distribui as tarefas uniformemente entre as instâncias e, em seguida, agrupa as tarefas com base na memória
<a name="instance-memory"></a>

A estratégia a seguir distribui as tarefas uniformemente em todas as instâncias e, em seguida, agrupa as tarefas com base na memória de cada instância. 

```
"placementStrategy": [
    {
        "field": "instanceId",
        "type": "spread"
    },
    {
        "field": "memory",
        "type": "binpack"
    }
]
```

# Tarefas do Amazon ECS relacionadas a grupos
<a name="task-groups"></a>

É possível identificar um conjunto de tarefas relacionadas e posicioná-las em um grupo de tarefas. Todas as tarefas com o mesmo nome de grupo de tarefas são consideradas um conjunto quando for usada a estratégia de posicionamento de tarefas `spread`. Por exemplo, suponha que você está executando diferentes aplicações em um cluster, como bases de dados e servidores da Web. Para garantir que os bancos de dados fiquem equilibrados nas zonas de disponibilidade, adicione-os a um grupo de tarefas denominado `databases` e use a estratégia de posicionamento de tarefas `spread`. Para obter mais informações, consulte [Uso de estratégias para definir o posicionamento de tarefas do Amazon ECS](task-placement-strategies.md).

Grupos de tarefas também podem ser usados como uma restrição de posicionamento de tarefas. Quando você especifica um grupo de tarefas na restrição `memberOf`, as tarefas são enviadas somente para instâncias de contêiner que executam tarefas no grupo de tarefas especificado. Para ver um exemplo, consulte [Exemplo de restrições de posicionamento de tarefas do Amazon ECS](constraint-examples.md).

Por padrão, as tarefas autônomas usarão o nome da família de definição de tarefa (por exemplo, `family:my-task-definition`) como o nome do grupo de tarefas, se não for especificado um nome de grupo de tarefas personalizado. As tarefas iniciadas como parte de um serviço usam o nome do serviço como nome do grupo de tarefas e não podem ser alteradas.

Os requisitos do grupo de tarefas a seguir se aplicam.
+ O nome de um grupo de tarefas deve ser 255 caracteres ou menos.
+ Cada tarefa pode estar em exatamente um grupo.
+ Após iniciar uma tarefa, você não poderá modificar o grupo de tarefas dela.

# Definição de quais instâncias de contêiner o Amazon ECS usa em tarefas
<a name="task-placement-constraints"></a>

Uma restrição no posicionamento de tarefas é uma regra sobre uma instância de contêiner que o Amazon ECS usa para determinar se a tarefa tem permissão para ser executada na instância. Pelo menos uma instância de contêiner deve corresponder à restrição. Se não houver instâncias que correspondam à restrição, a tarefa permanecerá em um estado `PENDING`. Ao criar um novo serviço ou atualizar um existente, é possível especificar restrições de posicionamento de tarefas para as tarefas do serviço. 

Você pode especificar restrições de posicionamento de tarefas na definição do serviço, na definição de tarefa ou na tarefa usando o parâmetro `placementConstraint`.

```
"placementConstraints": [
    {
        "expression": "The expression that defines the task placement constraints",
        "type": "The placement constraint type to use"
    }
]
```

A tabela a seguir descreve como usar os parâmetros.


| Constraint type | Pode ser especificado quando | 
| --- | --- | 
| distinctInstanceColoque cada tarefa ativa em uma instância de contêiner diferente.O Amazon ECS analisa o status desejado das tarefas para a colocação da tarefa. Por exemplo, se o status desejado da tarefa existente for `STOPPED` (mas o último não for), uma nova tarefa de entrada poderá ser colocada na mesma instância, apesar da restrição de colocação `distinctInstance`. Portanto, você pode ver duas tarefas com o último status de `RUNNING` na mesma instância. Recomendamos que os clientes que buscam um forte isolamento para as tarefas usem o Fargate. O Fargate executa cada tarefa em um ambiente de virtualização de hardware. Isso garante que essas workloads em contêineres não compartilhem interfaces de rede, armazenamento temporário do Fargate, CPU ou memória com outras tarefas. Para obter mais informações, consulte [Security Overview of AWS Fargate](https://d1.awsstatic.com/whitepapers/AWS_Fargate_Security_Overview_Whitepaper.pdf). |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/AmazonECS/latest/developerguide/task-placement-constraints.html)  | 
| memberOfPosicionar tarefas em instâncias de contêiner que atendam a uma expressão.  | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/AmazonECS/latest/developerguide/task-placement-constraints.html) | 

Ao usar o tipo de restrição `memberOf`, você pode criar uma expressão usando a linguagem de consulta do cluster, que define as instâncias de contêiner nas quais o Amazon ECS pode posicionar tarefas. A expressão é uma forma de agrupar as instâncias de contêiner por atributos. A expressão vai no parâmetro `expression ` de `placementConstraint`.

## Atributos de instância de contêiner do Amazon ECS
<a name="attributes"></a>

É possível adicionar metadados personalizados, conhecidos como *atributos*, às instâncias de contêiner. Cada atributo tem um nome e um valor de string opcional. É possível usar os atributos integrados fornecidos pelo Amazon ECS ou definir atributos personalizados.

As seções a seguir contêm exemplos de atributos internos, opcionais e personalizados.

### Atributos integrados
<a name="ecs-automatic-attributes"></a>

O Amazon ECS aplica automaticamente os seguintes atributos às instâncias de contêiner.

`ecs.ami-id`  
A ID do AMI usado para executar a instância. Um exemplo de valor do atributo é `ami-1234abcd`.

`ecs.availability-zone`  
A zona de disponibilidade para a instância. Um exemplo de valor do atributo é `us-east-1a`.

`ecs.instance-type`  
O tipo de instância para a instância. Um exemplo de valor do atributo é `g2.2xlarge`.

`ecs.os-type`  
O sistema operacional para a instância. Os valores possíveis para esse atributo são `linux` e `windows`.

`ecs.os-family`  
A versão do sistema operacional para a instância.  
Para instâncias de Linux, o valor válido é `LINUX`. Para instâncias de Windows, o ECS define o valor no formato `WINDOWS_SERVER_<OS_Release>_<FULL or CORE>`. Os valores válidos são `WINDOWS_SERVER_2022_FULL`, `WINDOWS_SERVER_2022_CORE`, `WINDOWS_SERVER_20H2_CORE`, `WINDOWS_SERVER_2019_FULL`, `WINDOWS_SERVER_2019_CORE` e `WINDOWS_SERVER_2016_FULL`.  
Isso é importante para contêineres do Windows e Windows containers on AWS Fargate, pois porque a versão do sistema operacional de cada contêiner do Windows deve corresponder à do host. Se a versão Windows da imagem do contêiner for diferente da do host, o contêiner não será iniciado. Para obter mais informações, consulte [Compatibilidade de versão do contêiner do Windows](https://learn.microsoft.com/en-us/virtualization/windowscontainers/deploy-containers/version-compatibility?tabs=windows-server-2022%2Cwindows-11) no site de documentação da Microsoft.  
Caso seu cluster execute várias versões do Windows, é possível garantir que uma tarefa seja colocada em uma instância do EC2 em execução na mesma versão usando a restrição de posicionamento: `memberOf(attribute:ecs.os-family == WINDOWS_SERVER_<OS_Release>_<FULL or CORE>)`. Para obter mais informações, consulte [Recuperação de metadados da AMI do Windows otimizada para o Amazon ECS](retrieve-ecs-optimized_windows_AMI.md).

`ecs.cpu-architecture`  
A arquitetura da CPU para a instância. São exemplos de valores do atributo `x86_64` e `arm64`.

`ecs.vpc-id`  
A VPC na qual a instância foi executada. Um exemplo de valor do atributo é `vpc-1234abcd`.

`ecs.subnet-id`  
A sub-rede que a instância está usando. Um exemplo de valor do atributo é `subnet-1234abcd`.

**nota**  
As instâncias gerenciadas do Amazon ECS oferecem suporte ao seguinte subconjunto de atributos:  
`ecs.subnet-id`
`ecs.availability-zone`
`ecs.instance-type`
`ecs.cpu-architecture`

### Atributos opcionais
<a name="ecs-optional-attributes"></a>

O Amazon ECS pode adicionar os seguintes atributos às instâncias de contêiner.

`ecs.awsvpc-trunk-id`  
Se esse atributo existir, a instância terá uma interface de rede de tronco. Para obter mais informações, consulte [Aumento das interfaces de rede de instâncias de contêiner do Linux no Amazon ECS](container-instance-eni.md).

`ecs.outpost-arn`  
Se esse atributo existir, ele conterá o nome de recurso da Amazon (ARN) do Outpost. Para obter mais informações, consulte [Amazon Elastic Container Service no AWS Outposts](using-outposts.md).

`ecs.capability.external`  
Se esse atributo existir, a instância será identificada como uma instância externa. Para obter mais informações, consulte [Clusters do Amazon ECS para instâncias externas](ecs-anywhere.md).

### Atributos personalizados
<a name="ecs-custom-attributes"></a>

É possível aplicar atributos personalizados às instâncias de contêiner. Por exemplo, você pode definir um atributo com o nome “pilha” e um valor de “prod”.

Ao especificar atributos personalizados, considere o descrito a seguir.
+ O `name` deve conter entre 1 e 128 caracteres e o nome pode conter letras (maiúsculas e minúsculas), números, hifens, sublinhados, barras “/”, barras “\$1” ou pontos.
+ O `value` deve conter entre 1 e 128 caracteres e pode conter letras (maiúsculas e minúsculas), números, hifens, sublinhados, pontos, arrobas (@), barras “/”, barras “\$1” dois pontos (:) ou espaços. O valor não pode conter espaço em branco no começo ou no fim.

# Criação de expressões para definir instâncias de contêiner em tarefas do Amazon ECS
<a name="cluster-query-language"></a>

Consultas ao cluster são expressões que permitem agrupar objetos. Por exemplo, você pode agrupar instâncias de contêiner por atributos, como Zona de disponibilidade, tipo de instância ou metadados personalizados. Para obter mais informações, consulte [Atributos de instância de contêiner do Amazon ECS](task-placement-constraints.md#attributes).

Depois de definir um grupo de instâncias de contêiner, você pode personalizar o Amazon ECS para posicionar tarefas em instâncias de contêiner baseadas no grupo. Para obter mais informações, consulte [Execução de uma aplicação como uma tarefa do Amazon ECS](standalone-task-create.md) e [Criação de uma implantação de atualização contínua do Amazon ECS](create-service-console-v2.md). Também é possível aplicar um filtro de grupo ao listar instâncias de contêiner.

## Sintaxe da expressão
<a name="expression-syntax"></a>

As expressões têm a seguinte sintaxe:

```
subject operator [argument]
```

**Assunto**  
O atributo ou o campo a ser avaliado.

`agentConnected`  
Selecione instâncias de contêiner pelo status da conexão do agente de contêiner do Amazon ECS. É possível usar esse filtro para pesquisar instâncias com agentes de contêiner desconectados.  
Operadores válidos: equals (==), not\$1equals (\$1=), in, not\$1in (\$1in), matches (=\$1), not\$1matches (\$1\$1)

`agentVersion`  
Selecione instâncias de contêiner pela versão do agente de contêiner do Amazon ECS. É possível usar esse filtro para encontrar instâncias que estejam executando versões desatualizadas do agente de contêiner do Amazon ECS.  
Operadores válidos: equals (==), not\$1equals (\$1=), greater\$1than (>), greater\$1than\$1equal (>=), less\$1than (<), less\$1than\$1equal (<=)

`attribute:attribute-name`  
Selecione instâncias de contêiner por atributo. Para obter mais informações, consulte [Atributos de instância de contêiner do Amazon ECS](task-placement-constraints.md#attributes).

`ec2InstanceId`  
Selecione instâncias de contêiner pelo ID da instância do Amazon EC2.  
Operadores válidos: equals (==), not\$1equals (\$1=), in, not\$1in (\$1in), matches (=\$1), not\$1matches (\$1\$1)

`registeredAt`  
Selecione instâncias de contêiner na data de registro da instância de contêiner. É possível usar esse filtro para encontrar instâncias recém-registradas ou instâncias muito antigas.  
Operadores válidos: equals (==), not\$1equals (\$1=), greater\$1than (>), greater\$1than\$1equal (>=), less\$1than (<), less\$1than\$1equal (<=)  
Formatos de data válidos: 2018-06-18T22:28:28\$100:00, 2018-06-18T22:28:28Z, 2018-06-18T22:28:28, 2018-06-18

`runningTasksCount`  
Selecione instâncias de contêiner pelo número de tarefas em execução. É possível usar esse filtro para encontrar instâncias vazias ou quase vazias (algumas tarefas em execução).  
Operadores válidos: equals (==), not\$1equals (\$1=), greater\$1than (>), greater\$1than\$1equal (>=), less\$1than (<), less\$1than\$1equal (<=)

`task:group`  
Selecione instâncias de contêiner por grupo de tarefas. Para obter mais informações, consulte [Tarefas do Amazon ECS relacionadas a grupos](task-groups.md).

**Operador**  
O operador de comparação. Os operadores a seguir são aceitos.


|  Operador  |  Descrição  | 
| --- | --- | 
|  ==, equals  |  Igualdade de strings  | 
|  \$1=, not\$1equals  |  Desigualdade de strings  | 
|  >, greater\$1than  |  Maior que  | 
|  >=, greater\$1than\$1equal  |  Maior ou igual a  | 
|  <, less\$1than  |  Menor que  | 
|  <=, less\$1than\$1equal  |  Menor ou igual a  | 
|  exists  |  O sujeito existe  | 
|  \$1exists, not\$1exists  |  O sujeito não existe  | 
|  em  |  Valor na lista de argumentos  | 
|  \$1in, not\$1in  |  Valor fora da lista de argumentos  | 
|  =\$1, matches  |  Correspondência de padrão  | 
|  \$1\$1, not\$1matches  |  Divergência de padrão  | 

**nota**  
Uma expressão individual não pode conter parênteses. No entanto, os parênteses podem ser usados para especificar precedência em expressões compostas.

**Argumento**  
Para muitos operadores, o argumento é um valor literal.

Os operadores `in` e `not_in` esperam uma lista de argumentos como argumento. Você especifica uma lista de argumentos da seguinte forma:

```
[argument1, argument2, ..., argumentN]
```

Os operadores matches e not\$1matches um argumento que se conforme à sintaxe de expressões regulares em Java. Para mais informações, consulte [java.util.regex.Pattern.](http://docs.oracle.com/javase/6/docs/api/java/util/regex/Pattern.html)

**Expressões compostas**

É possível combinar expressões usando os operadores booleanos a seguir:
+ &&, e
+ \$1\$1, ou
+ \$1, not

É possível especificar a precedência usando parênteses:

```
(expression1 or expression2) and expression3
```

## Exemplo de expressões
<a name="expression-examples"></a>

Veja a seguir exemplos de expressões.

**Exemplo: igualdade de strings**  
A expressão a seguir seleciona instâncias com o tipo de instância especificado.

```
attribute:ecs.instance-type == t2.small
```

**Exemplo: lista de argumentos**  
A expressão a seguir seleciona instâncias na Zona de disponibilidade us-east-1a ou us-east-1b.

```
attribute:ecs.availability-zone in [us-east-1a, us-east-1b]
```

**Exemplo: expressão composta**  
A expressão a seguir seleciona as instâncias G2 que não estiverem na zona de disponibilidade us-east-1d.

```
attribute:ecs.instance-type =~ g2.* and attribute:ecs.availability-zone != us-east-1d
```

**Exemplo: afinidade de tarefas**  
A expressão a seguir seleciona as instâncias que são tarefas de hospedagem no grupo `service:production`.

```
task:group == service:production
```

**Exemplo: antiafinidade de tarefas**  
A expressão a seguir seleciona as instâncias que não são tarefas de hospedagem no grupo de bancos de dados.

```
not(task:group == database)
```

**Exemplo: contagem de tarefas em execução**  
A expressão a seguir seleciona as instâncias que estão executando apenas uma tarefa.

```
runningTasksCount == 1
```

**Exemplo: versão do agente de contêiner do Amazon ECS**  
A expressão a seguir seleciona instâncias que estão executando uma versão do agente de contêiner abaixo de 1.14.5.

```
agentVersion < 1.14.5
```

**Exemplo: tempo de registro da instância**  
A expressão a seguir seleciona instâncias que foram registradas antes de 13 de fevereiro de 2018.

```
registeredAt < 2018-02-13
```

**Exemplo: ID de instância do Amazon EC2**  
A expressão a seguir seleciona instâncias com os IDs de instância do Amazon EC2 a seguir.

```
ec2InstanceId in ['i-abcd1234', 'i-wxyx7890']
```

# Exemplo de restrições de posicionamento de tarefas do Amazon ECS
<a name="constraint-examples"></a>

Os exemplos de restrição de colocação da tarefa são os seguintes.

Esse exemplo usa a restrição `memberOf` para colocar tarefas em instâncias t2. Ele pode ser especificado com as seguintes ações: [CreateService](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_CreateService.html), [UpdateService](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_UpdateService.html), [RegisterTaskDefinition](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_RegisterTaskDefinition.html) e [RunTask](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_RunTask.html).

```
"placementConstraints": [
    {
        "expression": "attribute:ecs.instance-type =~ t2.*",
        "type": "memberOf"
    }
]
```

O exemplo usa a restrição `memberOf` para posicionar tarefas de réplica em instâncias com tarefas no grupo de tarefas `daemon-service` de serviço de daemon, respeitando quaisquer estratégias de posicionamento de tarefas que também estejam especificadas. Essa restrição garante que as tarefas do serviço de daemon sejam colocadas na instância do EC2 antes das tarefas do serviço de réplica.

Substitua `daemon-service` pelo nome do serviço de daemon.

```
"placementConstraints": [
    {
        "expression": "task:group == service:daemon-service",
        "type": "memberOf"
    }
]
```

O exemplo usa a restrição `memberOf` para posicionar tarefas em instâncias com outras tarefas no grupo de tarefas `databases`, respeitando quaisquer estratégias de posicionamento de tarefas que também estejam especificadas. Para obter mais informações sobre grupos de tarefas, consulte [Tarefas do Amazon ECS relacionadas a grupos](task-groups.md). Ele pode ser especificado com as seguintes ações: [CreateService](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_CreateService.html), [UpdateService](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_UpdateService.html), [RegisterTaskDefinition](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_RegisterTaskDefinition.html) e [RunTask](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_RunTask.html).

```
"placementConstraints": [
    {
        "expression": "task:group == databases",
        "type": "memberOf"
    }
]
```

A limitação `distinctInstance` posiciona cada tarefa no grupo em uma instância diferente. Ele pode ser especificado com as seguintes ações: [CreateService](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_CreateService.html), [UpdateService](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_UpdateService.html) e [RunTask](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_RunTask.html)

O Amazon ECS analisa o status desejado das tarefas para a colocação da tarefa. Por exemplo, se o status desejado da tarefa existente for `STOPPED` (mas o último não for), uma nova tarefa de entrada poderá ser colocada na mesma instância, apesar da restrição de colocação `distinctInstance`. Portanto, você pode ver duas tarefas com o último status de `RUNNING` na mesma instância.

```
"placementConstraints": [
    {
        "type": "distinctInstance"
    }
]
```