

# Utilice la inyección de errores con las cargas de trabajo de Amazon ECS y Fargate
<a name="fault-injection"></a>

Los clientes pueden utilizar la inyección de errores con Amazon ECS tanto en Amazon EC2 como en Fargate para probar de qué manera la aplicación responde a determinados escenarios de deterioro. Estas pruebas proporcionan información útil para optimizar el rendimiento y la resiliencia de la aplicación.

Cuando la inyección de errores está habilitada, el agente de contenedores de Amazon ECS permite que las tareas accedan a nuevos puntos de conexión de inyección de errores. Debe optar por utilizar la inyección de errores. Para ello, configure el valor del parámetro de definición de la tarea `enableFaultInjection` en `true`. El valor predeterminado es `false`. 

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

**nota**  
La inyección de errores solo funciona con tareas que utilicen los modos de red `awsvpc` o `host`.  
La inyección de errores no está disponible en Windows.

Para obtener información sobre cómo habilitar la inyección de errores en la Consola de administración de AWS, consulte [Creación de una definición de tarea de Amazon ECS mediante la consola](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/create-task-definition.html).

Tendrá que habilitar la característica para las pruebas en AWS Fault Injection Service. Para obtener más información, consulte [Uso de las acciones aws:ecs:task de AWS FIS](https://docs.aws.amazon.com/fis/latest/userguide/ecs-task-actions.html).

**nota**  
Si no utiliza las nuevas AMI optimizadas para Amazon ECS o tiene una AMI personalizada, instale las siguientes dependencias:  
`tc`
Módulo de kernel de `sch_netem`

# Puntos de conexión de inyección de errores de Amazon ECS
<a name="fault-injection-endpoints"></a>

El agente del contenedor de Amazon ECS inyecta automáticamente la variable de entorno `ECS_AGENT_URI` en los contenedores de las tareas de Amazon ECS para proporcionar un método que permita interactuar con el punto de conexión de la API del agente de contenedor. Cada punto de conexión incluye un punto de conexión de `/start`, `/stop` y `/status` Los puntos de conexión solo aceptan solicitudes de tareas que tengan habilitada la inyección de errores, y cada punto de conexión tiene un límite de velocidad de **1** solicitud cada **5** segundos por contenedor. Si se supera el límite, se produce un error.

**nota**  
Se requiere el agente de Amazon ECS `version 1.88.0+` para utilizar los puntos de conexión de inyección de errores.

Los tres puntos de conexión que se utilizan con la inyección de errores son:
+ [Punto de conexión del puerto blackhole de la red](#fis-endpoint-blackhole-ports)
+ [Punto de conexión de pérdida de paquetes de red](#fis-endpoint-packet-loss)
+ [Punto de conexión de latencia de red](#fis-endpoint-latency)

Si la solicitud se realiza correctamente, se obtiene un código de respuesta `200` con un mensaje de `running` cuando se llama al punto de conexión de `/start`, `stopped` para el punto de conexión de `/stop` y `running` o `not-running` para el punto de conexión de `/status`.

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

Si la solicitud no se realiza correctamente, se devuelve uno de los siguientes códigos de error:
+ `400`: solicitud errónea
+ `409`: la solicitud de inyección de errores entra en conflicto con otro error de ejecución
+ `429`: la solicitud se ha limitado
+ `500`: se presentó un error inesperado en el servidor

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

**nota**  
Se puede inyectar un error de latencia de red o un error de pérdida de paquetes de red cada vez. Si se intenta inyectar más de uno, se rechazará la solicitud.

## Punto de conexión del puerto blackhole de la red
<a name="fis-endpoint-blackhole-ports"></a>

El punto de conexión de `{ECS_AGENT_URI}/fault/v1/network-blackhole-port` descarta el tráfico entrante o saliente para un puerto y protocolo específicos en el espacio de nombres de red de una tarea y es compatible con dos modos:
+ **awsvp**: los cambios se aplican al espacio de nombres de la red de la tarea
+ **host**: los cambios se aplican a la instancia de contenedor de espacio de nombres de red predeterminada

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

Este punto de conexión inicia las inyecciones de errores en el puerto blackhole de la red y tiene los siguientes parámetros:

**Puerto**  
El puerto especificado que se utilizará para la inyección de errores del puerto blackhole.

Tipo: número entero

Obligatorio: sí

**Protocolo**  
El protocolo que se utilizará para la inyección de errores en el puerto blackhole.

Tipo: cadena

Valores válidos: `tcp | udp`

Obligatorio: sí

**TrafficType**  
El tipo de tráfico que la inyección de errores utiliza.

Tipo: cadena

Valores válidos: `ingress | egress`

Obligatorio: sí

**SourcesToFilter**  
Una matriz JSON de direcciones IPv4 o IPv6 o bloques de CIDR que están protegidos frente al error.

Tipo: matriz de cadenas

Obligatorio: no

A continuación, se muestra un ejemplo de solicitud para utilizar el punto de conexión de `start` (sustituya los valores en *rojo* por valores propios):

```
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>

Este punto de conexión detiene el error especificado en la solicitud. Este punto de conexión tiene los siguientes parámetros:

**Puerto**  
El puerto afectado por el error que se debe detener.

Tipo: número entero

Obligatorio: sí

**Protocolo**  
El protocolo que se utilizará para detener el error.

Tipo: cadena

Valores válidos: `tcp | udp`

Obligatorio: sí

**TrafficType**  
El tipo de tráfico que la inyección de errores utiliza.

Tipo: cadena

Valores válidos: `ingress | egress`

Obligatorio: sí

A continuación, se muestra un ejemplo de solicitud para utilizar el punto de conexión de `stop` (sustituya los valores en *rojo* por valores propios):

```
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>

Este punto de conexión se utiliza para comprobar el estado de la inyección de errores. Este punto de conexión tiene los siguientes parámetros:

**Puerto**  
El puerto afectado para comprobar el estado del error.

Tipo: número entero

Obligatorio: sí

**Protocolo**  
El protocolo que se utilizará al comprobar el estado del error.

Tipo: cadena

Valores válidos: `tcp | udp`

Obligatorio: sí

**TrafficType**  
El tipo de tráfico que la inyección de errores utiliza.

Tipo: cadena

Valores válidos: `ingress | egress`

Obligatorio: sí

A continuación, se muestra un ejemplo de solicitud para utilizar el punto de conexión de `status` (sustituya los valores en *rojo* por valores propios):

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

Http method: POST

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

## Punto de conexión de latencia de red
<a name="fis-endpoint-latency"></a>

El punto de conexión de `{ECS_AGENT_URI}/fault/v1/network-latency` agrega retardo y fluctuación a la interfaz de red de la tarea para el tráfico a determinados orígenes. El punto de conexión es compatible con dos modos:
+ **awsvpc**: los cambios se aplican a la interfaz de red de la tarea
+ **host**: los cambios se aplican a la interfaz de red predeterminada

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

Este punto de conexión de `/start` inicia la inyección de errores de latencia de la red y tiene los siguientes parámetros:

**DelayMilliseconds**  
La cantidad de milisegundos de retardo que se agregarán a la interfaz de red que se utilizará para la inyección de errores.

Tipo: número entero

Obligatorio: sí

**JitterMilliseconds**  
La cantidad de milisegundos de fluctuación que se agregarán a la interfaz de red que se utilizará para la inyección de errores.

Tipo: número entero

Obligatorio: sí

**Orígenes**  
Una matriz JSON de direcciones IPv4 o IPv6 o bloques de CIDR que son destino para su uso con inyección de errores.

Tipo: matriz de cadenas

Obligatorio: sí

**SourcesToFilter**  
Una matriz JSON de direcciones IPv4 o IPv6 o bloques de CIDR protegidos frente al error. `SourcesToFilter` tiene prioridad sobre `Sources`.

Tipo: matriz de cadenas

Obligatorio: no

A continuación, se muestra un ejemplo de solicitud para utilizar el punto de conexión de `/start` (sustituya los valores en *rojo* por valores propios):

```
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>

El punto de conexión de `{ECS_AGENT_URI}/fault/v1/network-latency/stop` detiene el error, mientras que `{ECS_AGENT_URI}/fault/v1/network-latency/status` comprueba el estado del error.

Los siguientes son dos ejemplos de solicitudes para utilizar los puntos de conexión de `/stop` y `/status`. Ambos utilizan el método `POST HTTP`.

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

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

## Punto de conexión de pérdida de paquetes de red
<a name="fis-endpoint-packet-loss"></a>

El punto de conexión de `{ECS_AGENT_URI}/fault/v1/network-packet-loss` agrega la pérdida de paquetes a la interfaz de red dada. Este punto de conexión es compatible con dos modos:
+ **awsvpc**: los cambios se aplican a la interfaz de red de la tarea
+ **host**: los cambios se aplican a la interfaz de red predeterminada

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

Este punto de conexión de `/start` inicia la inyección de errores de pérdida de paquetes de red y tiene los siguientes parámetros:

**LossPercent**  
El porcentaje de pérdida de paquetes

Tipo: número entero

Obligatorio: sí

**Orígenes**  
Una matriz JSON de direcciones IPv4 o IPv6 o bloques de CIDR a utilizar para las pruebas de inyección de errores.

Tipo: matriz de cadenas

Obligatorio: sí

**SourcesToFilter**  
Una matriz JSON de direcciones IPv4 o IPv6 o bloques de CIDR protegidos frente al error. `SourcesToFilter` tiene prioridad sobre `Sources`.

Tipo: matriz de cadenas

Obligatorio: no

A continuación, se muestra un ejemplo de solicitud para utilizar el punto de conexión de `start` (sustituya los valores en *rojo* por valores propios):

```
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 y /status
<a name="fis-endpoint-packet-loss-stop-status"></a>

El punto de conexión de `{ECS_AGENT_URI}/fault/v1/network-packet-loss/stop` detiene el error, mientras que `{ECS_AGENT_URI}/fault/v1/network-packet-loss/status` comprueba el estado del error. Solo se admite uno de cada tipo de error a la vez.

Los siguientes son dos ejemplos de solicitudes para utilizar los puntos de conexión de `/stop` y `/status`. Ambos utilizan el método `POST HTTP`.

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

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