

# Usar a injeção de falhas com suas workloads do Amazon ECS e do Fargate
<a name="fault-injection"></a>

Os clientes podem usar a injeção de falhas com o Amazon ECS no Amazon EC2 e Fargate para testar como suas aplicações respondem a determinados cenários de comprometimento. Esses testes fornecem informações que você pode utilizar para otimizar a performance e a resiliência das aplicações.

Quando a injeção de falhas está habilitada, o agente de contêiner do Amazon ECS permite que as tarefas acessem novos endpoints de injeção de falhas. Você precisa fazer a opção para usar a injeção de falhas definindo o valor do parâmetro de definição de tarefa `enableFaultInjection` como `true`. O valor padrão é `false`. 

```
{
    ...
   "enableFaultInjection": true
}
```

**nota**  
A injeção de falhas funciona somente com tarefas que usam os modos de rede `awsvpc` ou `host`.  
O recurso de injeção de falhas não está disponível no Windows.

Para obter informações sobre como habilitar a injeção de falhas no Console de gerenciamento da AWS, consulte [Criar uma definição de tarefa do Amazon ECS usando o console](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/create-task-definition.html).

Será necessário habilitar o recurso para testes no AWS Fault Injection Service. Para obter mais informações, consulte [Utilizar as ações do AWS FIS aws:ecs:task](https://docs.aws.amazon.com/fis/latest/userguide/ecs-task-actions.html).

**nota**  
Se você não usar as novas AMIs otimizadas do Amazon ECS ou tiver uma AMI personalizada, instale as seguintes dependências:  
`tc`
Módulo de kernel `sch_netem`

# Endpoints para injeção de falhas do Amazon ECS
<a name="fault-injection-endpoints"></a>

O agente de contêiner do Amazon ECS injeta automaticamente a variável de ambiente `ECS_AGENT_URI` nos contêineres de tarefas do Amazon ECS para fornecer um método de interação com o endpoint da API do agente de contêiner. Cada endpoint inclui um endpoint `/start`, `/stop` e `/status`. Esses endpoints somente aceitam solicitações de tarefas que habilitaram a injeção de falhas, e cada um tem um limite de taxa de **1** solicitação a cada **5** segundos por contêiner. Exceder o limite resulta em um erro.

**nota**  
O Agente do Amazon ECS `version 1.88.0+` é necessário para utilizar endpoints de injeção de falhas.

Os três endpoints para uso com a injeção de falhas são:
+ [Endpoint de porta de buraco negro de rede](#fis-endpoint-blackhole-ports)
+ [Endpoint de perda de pacotes de rede](#fis-endpoint-packet-loss)
+ [Endpoint de latência da rede](#fis-endpoint-latency)

Uma solicitação com êxito resulta em um código de resposta `200` com uma mensagem de `running` ao chamar o endpoint `/start`, `stopped` para o endpoint `/stop` e `running` ou `not-running` para o endpoint `/status`.

```
{
    "Status": <string>
}
```

Uma solicitação sem êxito retorna um destes códigos de erro:
+ `400`: solicitação inválida
+ `409`: a solicitação de injeção de falhas está em conflito com outra falha em execução
+ `429`: a solicitação foi limitada
+ `500`: o servidor teve um erro inesperado

```
{
	"Error":  <string message> 
}
```

**nota**  
Uma falha de latência de rede ou uma falha de perda de pacote de rede pode ser injetada por vez. A tentativa de injetar mais de uma faz com que a solicitação seja rejeitada.

## Endpoint de porta de buraco negro de rede
<a name="fis-endpoint-blackhole-ports"></a>

O endpoint `{ECS_AGENT_URI}/fault/v1/network-blackhole-port` elimina o tráfego de entrada ou saída de uma porta e protocolo específicos no namespace de rede de uma tarefa e é compatível com dois modos:
+ **awsvpc**: as alterações são aplicadas ao namespace da rede de tarefas
+ **host**: as alterações são aplicadas à instância de contêiner do namespace de rede padrão

### \$1ECS\$1AGENT\$1URI\$1/fault/v1/network-blackhole-port/start
<a name="fis-endpoint-blackhole-ports-start"></a>

Esse endpoint inicia as injeções de falha na porta de buraco negro de rede e inclui os seguintes parâmetros:

**Porta**  
A porta especificada para uso na injeção de falhas na porta de buraco negro.

Tipo: inteiro

Obrigatório: Sim

**Protocolo**  
O protocolo para uso na injeção de falhas na porta de buraco negro.

Tipo: string

Valores válidos: `tcp | udp`

Obrigatório: Sim

**TrafficType**  
O tipo de tráfego utilizado pela injeção de falhas.

Tipo: string

Valores válidos: `ingress | egress`

Obrigatório: Sim

**SourcesToFilter**  
Uma matriz JSON de endereços IPv4 ou IPv6 ou blocos CIDR protegidos contra falha.

Tipo: matriz de strings

Obrigatório: Não

O exemplo a seguir mostra como utilizar o endpoint `start` (substitua os valores em *vermelho* pelos seus próprios):

```
Endpoint: ${ECS_AGENT_URI}/fault/v1/network-blackhole-port/start

Http method:POST

Request payload: 
{
    "Port": 1234,
    "Protocol": "tcp|udp",
    "TrafficType": "ingress|egress"
    "SourcesToFilter": ["${IP1}", "${IP2}", ...],
}
```

### \$1ECS\$1AGENT\$1URI\$1/fault/v1/network-blackhole-port/stop
<a name="fis-endpoint-blackhole-ports-stop"></a>

Esse endpoint interrompe a falha especificada na solicitação. Esse endpoint tem os seguintes parâmetros:

**Porta**  
A porta afetada pela falha que deve ser interrompida.

Tipo: inteiro

Obrigatório: Sim

**Protocolo**  
O protocolo a ser usado para interromper essa falha.

Tipo: string

Valores válidos: `tcp | udp`

Obrigatório: Sim

**TrafficType**  
O tipo de tráfego utilizado pela injeção de falhas.

Tipo: string

Valores válidos: `ingress | egress`

Obrigatório: Sim

O exemplo a seguir mostra como utilizar o endpoint `stop` (substitua os valores em *vermelho* pelos seus próprios):

```
Endpoint: ${ECS_AGENT_URI}/fault/v1/network-blackhole-port/stop

Http method: POST

Request payload: 
{
    "Port": 1234,
    "Protocol": "tcp|udp",
    "TrafficType": "ingress|egress", 
}
```

### \$1ECS\$1AGENT\$1URI\$1/fault/v1/network-blackhole-port/status
<a name="fis-endpoint-blackhole-ports-status"></a>

Esse endpoint é usado para verificar o status da injeção de falhas. Esse endpoint tem os seguintes parâmetros:

**Porta**  
A porta afetada para verificar o status da falha.

Tipo: inteiro

Obrigatório: Sim

**Protocolo**  
O protocolo a ser utilizado ao verificar o status da falha.

Tipo: string

Valores válidos: `tcp | udp`

Obrigatório: Sim

**TrafficType**  
O tipo de tráfego utilizado pela injeção de falhas.

Tipo: string

Valores válidos: `ingress | egress`

Obrigatório: Sim

O exemplo a seguir mostra como utilizar o endpoint `status` (substitua os valores em *vermelho* pelos seus próprios):

```
Endpoint: ${ECS_AGENT_URI}/fault/v1/network-blackhole-port/status

Http method: POST

Request payload: 
{
   "Port": 1234,
   "Protocol": "tcp|udp",
   "TrafficType": "ingress|egress",
}
```

## Endpoint de latência da rede
<a name="fis-endpoint-latency"></a>

O endpoint `{ECS_AGENT_URI}/fault/v1/network-latency` adiciona atraso e instabilidade à interface de rede da tarefa para o tráfego para uma origem específica. O endpoint é compatível com dois modos:
+ **awsvpc**: as alterações são aplicadas à interface de rede da tarefa
+ **host**: as alterações são aplicadas à interface de rede padrão

### \$1ECS\$1AGENT\$1URI\$1/fault/v1/network-latency/start
<a name="fis-endpoint-latency-start"></a>

Esse endpoint `/start` inicia a injeção de falha de latência da rede e tem os seguintes parâmetros:

**DelayMilliseconds**  
O número de milissegundos de atraso a serem adicionados à interface de rede para uso na injeção de falhas.

Tipo: inteiro

Obrigatório: Sim

**JitterMilliseconds**  
O número de milissegundos de instabilidade a serem adicionados à interface de rede para uso na injeção de falhas.

Tipo: inteiro

Obrigatório: Sim

**Fontes**  
Uma matriz JSON de endereços IPv4 ou IPv6 ou blocos CIDR que se destinam ao uso com injeção de falhas.

Tipo: matriz de strings

Obrigatório: Sim

**SourcesToFilter**  
Uma matriz JSON de endereços IPv4 ou IPv6 ou blocos CIDR protegidos contra falha. `SourcesToFilter` tem prioridade sobre `Sources`.

Tipo: matriz de strings

Obrigatório: Não

O exemplo a seguir mostra como utilizar o endpoint `/start` (substitua os valores em *vermelho* pelos seus próprios):

```
Endpoint: ${ECS_AGENT_URI}/fault/v1/network-latency/start

Http method: POST

Request payload: 
{
    "DelayMilliseconds": 123,
    "JitterMilliseconds": 123,
    "Sources": ["${IP1}", "${IP2}", ...],
    "SourcesToFilter": ["${IP1}", "${IP2}", ...],
}
```

### \$1ECS\$1AGENT\$1URI\$1/fault/v1/network-latency/stop and /status
<a name="fis-endpoint-latency-stop-status"></a>

O endpoint `{ECS_AGENT_URI}/fault/v1/network-latency/stop` interrompe a falha, e o `{ECS_AGENT_URI}/fault/v1/network-latency/status` verifica o status da falha.

Veja a seguir dois exemplos de solicitações para usar os endpoints `/stop` e `/status`. Ambos utilizam o método `POST HTTP`.

```
Endpoint: ${ECS_AGENT_URI}/fault/v1/network-latency/stop
```

```
Endpoint: ${ECS_AGENT_URI}/fault/v1/network-latency/status
```

## Endpoint de perda de pacotes de rede
<a name="fis-endpoint-packet-loss"></a>

O endpoint `{ECS_AGENT_URI}/fault/v1/network-packet-loss` adiciona perda de pacotes à interface de rede fornecida. Esse endpoint é compatível com dois modos:
+ **awsvpc**: as alterações são aplicadas à interface de rede da tarefa
+ **host**: as alterações são aplicadas à interface de rede padrão

### \$1ECS\$1AGENT\$1URI\$1/fault/v1/network-packet-loss/start
<a name="fis-endpoint-packet-loss-start"></a>

Esse endpoint `/start` inicia a injeção de falha de perda de pacotes de rede e tem os seguintes parâmetros:

**LossPercent**  
A porcentagem de perda de pacotes

Tipo: inteiro

Obrigatório: Sim

**Fontes**  
Uma matriz JSON de endereços IPv4 ou IPv6 ou blocos CIDR a serem usados para testes de injeção de falhas.

Tipo: matriz de strings

Obrigatório: Sim

**SourcesToFilter**  
Uma matriz JSON de endereços IPv4 ou IPv6 ou blocos CIDR protegidos contra falha. `SourcesToFilter` tem prioridade sobre `Sources`.

Tipo: matriz de strings

Obrigatório: Não

O exemplo a seguir mostra como utilizar o endpoint `start` (substitua os valores em *vermelho* pelos seus próprios):

```
Endpoint: ${ECS_AGENT_URI}/fault/v1/network-packet-loss/start

Http method: POST

{
    "LossPercent": 6,  
    "Sources": ["${IP1}", "${IP2}", ...],
    "SourcesToFilter": ["${IP1}", "${IP2}", ...],
}
```

### \$1ECS\$1AGENT\$1URI\$1/fault/v1/network-packet-loss/stop and /status
<a name="fis-endpoint-packet-loss-stop-status"></a>

O endpoint `{ECS_AGENT_URI}/fault/v1/network-packet-loss/stop` interrompe a falha, e o `{ECS_AGENT_URI}/fault/v1/network-packet-loss/status` verifica o status da falha. Somente um de cada tipo de falha é compatível de cada vez.

Veja a seguir dois exemplos de solicitações para usar os endpoints `/stop` e `/status`. Ambos utilizam o método `POST HTTP`.

```
Endpoint: ${ECS_AGENT_URI}/fault/v1/network-packet-loss/stop
```

```
Endpoint: ${{ECS_AGENT_URI}/fault/v1/network-packet-loss/status
```