

# Amazon ECS 및 Fargate 워크로드에서 결함 주입 사용
<a name="fault-injection"></a>

고객은 Amazon EC2 및 Fargate 모두에서 Amazon ECS를 사용한 결함 주입을 활용하여 애플리케이션이 특정 장애 시나리오에 어떻게 대응하는지 테스트할 수 있습니다. 이러한 테스트는 애플리케이션의 성능과 복원력을 최적화하는 데 사용 가능한 정보를 제공합니다.

결함 주입이 활성화되면 Amazon ECS 컨테이너 에이전트가 작업이 새 결함 주입 엔드포인트에 액세스하도록 허용합니다. 결함 주입을 사용하려면 `enableFaultInjection` 작업 정의 파라미터를 값을 `true`로 설정하여 옵트인해야 합니다. 기본값은 `false`입니다.

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

**참고**  
결함 주입은 `awsvpc` 또는 `host` 네트워크 모드를 사용하는 작업에서만 작동합니다.  
Windows에서는 오류 주입을 사용할 수 없습니다.

AWS Management Console에서 결함 주입을 활성화하는 방법에 대한 자세한 내용은 [콘솔을 사용하여 Amazon ECS 작업 정의 생성](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/create-task-definition.html)을 참조하세요.

AWS Fault Injection Service에서 테스트할 기능을 활성화해야 합니다. 자세한 내용은 [AWS FISaws:ecs:task 작업 사용](https://docs.aws.amazon.com/fis/latest/userguide/ecs-task-actions.html)을 참조하세요.

**참고**  
새로운 Amazon ECS 최적화 AMI를 사용하지 않거나 사용자 지정 AMI가 있는 경우 다음 종속성을 설치합니다.  
`tc`
`sch_netem` 커널 모듈

# Amazon ECS 결함 주입 엔드포인트
<a name="fault-injection-endpoints"></a>

Amazon ECS 컨테이너 에이전트는 Amazon ECS 작업의 컨테이너에 `ECS_AGENT_URI` 환경 변수를 자동으로 주입하여 컨테이너 에이전트 API 엔드포인트와 상호 작용하는 방법을 제공합니다. 각 엔드포인트에는 `/start`, `/stop`, `/status` 엔드포인트가 포함됩니다. 엔드포인트는 결함 주입이 활성화된 작업의 요청만 수락하며, 각 엔드포인트의 요청 속도 제한은 컨테이너별로 **5**초당 **1**개입니다. 제한을 초과할 경우 오류가 발생합니다.

**참고**  
Amazon ECS Agent `version 1.88.0+`는 결함 주입 엔드포인트를 사용해야 합니다.

결함 주입에 사용할 세 가지 엔드포인트는 다음과 같습니다.
+ [네트워크 블랙홀 포트 엔드포인트](#fis-endpoint-blackhole-ports)
+ [네트워크 패킷 손실 엔드포인트](#fis-endpoint-packet-loss)
+ [네트워크 지연 시간 엔드포인트](#fis-endpoint-latency)

요청이 성공하면 `/start` 엔드포인트를 호출할 때 `running` 메시지와 함께 `200` 응답 코드가 생성되며, `/stop` 엔드포인트에 대해 `stopped`, `/status` 엔드포인트에 대해 `running` 또는 `not-running`이 생성됩니다.

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

요청이 실패하면 다음 오류 코드 중 하나가 반환됩니다.
+ `400`-잘못된 요청
+ `409`-결함 주입 요청이 실행 중인 다른 오류와 충돌
+ `429`-요청에 병목 현상 발생
+ `500`-서버에 예기치 않은 오류 발생

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

**참고**  
네트워크 지연 시간 오류 하나 또는 네트워크 패킷 손실 오류를 한 번에 하나씩 주입할 수 있습니다. 둘 이상의 결과를 주입하려고 하면 요청이 거부됩니다.

## 네트워크 블랙홀 포트 엔드포인트
<a name="fis-endpoint-blackhole-ports"></a>

`{ECS_AGENT_URI}/fault/v1/network-blackhole-port` 엔드포인트는 작업의 네트워크 네임스페이스에 있는 특정 포트 및 프로토콜에 대한 인바운드 또는 아웃바운드 트래픽을 삭제하며 다음 두 가지 모드와 호환됩니다.
+ **awsvpc**-변경 사항이 작업 네트워크 네임스페이스에 적용됨
+ **호스트**-변경 사항이 기본 네트워크 네임스페이스 컨테이너 인스턴스에 적용됨

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

이 엔드포인트는 네트워크 블랙홀 포트 결함 주입을 시작하며 다음 파라미터를 갖습니다.

**포트**  
블랙홀 포트 결함 주입에 사용할 지정된 포트입니다.

유형: 정수

필수 여부: 예

**프로토콜**  
블랙홀 포트 결함 주입에 사용할 프로토콜입니다.

타입: 문자열

유효한 값: `tcp | udp`

필수 여부: 예

**TrafficType**  
결함 주입에 사용되는 트래픽 유형입니다.

타입: 문자열

유효한 값: `ingress | egress`

필수 여부: 예

**SourcesToFilter**  
결함으로부터 보호되는 IPv4 또는 IPv6 주소나 CIDR 블록의 JSON 배열.

유형: 문자열 배열

필수 여부: 아니요

다음은 `start` 엔드포인트 사용에 대한 요청의 예입니다(*빨간색* 값을 자체 값으로 대체).

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

이 엔드포인트는 요청에 지정된 오류를 중지합니다. 이 엔드포인트에는 다음과 같은 파라미터가 있습니다.

**포트**  
중지해야 하는 오류의 영향을 받는 포트입니다.

유형: 정수

필수 여부: 예

**프로토콜**  
오류를 중지하는 데 사용할 프로토콜입니다.

타입: 문자열

유효한 값: `tcp | udp`

필수 여부: 예

**TrafficType**  
결함 주입에 사용되는 트래픽 유형입니다.

타입: 문자열

유효한 값: `ingress | egress`

필수 여부: 예

다음은 `stop` 엔드포인트 사용에 대한 요청의 예입니다(*빨간색* 값을 자체 값으로 대체).

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

이 엔드포인트는 결함 주입의 상태를 확인하는 데 사용됩니다. 이 엔드포인트에는 다음과 같은 파라미터가 있습니다.

**포트**  
오류 상태를 확인할 때 영향을 받는 포트입니다.

유형: 정수

필수 여부: 예

**프로토콜**  
오류 상태를 확인할 때 사용할 프로토콜입니다.

타입: 문자열

유효한 값: `tcp | udp`

필수 여부: 예

**TrafficType**  
결함 주입에 사용되는 트래픽 유형입니다.

타입: 문자열

유효한 값: `ingress | egress`

필수 여부: 예

다음은 `status` 엔드포인트 사용에 대한 요청의 예입니다(*빨간색* 값을 자체 값으로 대체).

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

Http method: POST

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

## 네트워크 지연 시간 엔드포인트
<a name="fis-endpoint-latency"></a>

`{ECS_AGENT_URI}/fault/v1/network-latency` 엔드포인트는 특정 소스로 가는 트래픽 처리를 위해 작업의 네트워크 인터페이스에 지연과 지터를 추가합니다. 엔드포인트는 다음 두 가지 모드와 호환됩니다.
+ **awsvpc**-변경 사항이 작업 네트워크 인터페이스에 적용됨
+ **호스트**-변경 사항이 기본 네트워크 인터페이스에 적용됨

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

이 `/start` 엔드포인트는 네트워크 지연 시간 결함 주입을 시작하며 다음 파라미터를 갖습니다.

**DelayMilliseconds**  
결함 주입에 사용하기 위해 네트워크 인터페이스에 추가할 지연 시간(밀리초)입니다.

유형: 정수

필수 여부: 예

**JitterMilliseconds**  
결함 주입에 사용하기 위해 네트워크 인터페이스에 추가할 지터(밀리초)입니다.

유형: 정수

필수 여부: 예

**소스**  
결함 주입에 사용할 대상인 IPv4 또는 IPv6 주소나 CIDR 블록의 JSON 배열.

유형: 문자열 배열

필수 여부: 예

**SourcesToFilter**  
오류로부터 보호되는 IPv4 또는 IPv6 주소나 CIDR 블록의 JSON 배열. `SourcesToFilter`는 `Sources`보다 우선순위가 높습니다.

유형: 문자열 배열

필수 여부: 아니요

다음은 `/start` 엔드포인트 사용에 대한 요청의 예입니다(*빨간색* 값을 자체 값으로 대체).

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

`{ECS_AGENT_URI}/fault/v1/network-latency/stop` 엔드포인트가 오류를 중지하고 `{ECS_AGENT_URI}/fault/v1/network-latency/status`가 오류 상태를 확인합니다.

다음은 `/stop` 및 `/status` 엔드포인트 사용에 대한 두 가지 예제 요청입니다. 둘 다 `POST HTTP` 메서드를 사용합니다.

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

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

## 네트워크 패킷 손실 엔드포인트
<a name="fis-endpoint-packet-loss"></a>

`{ECS_AGENT_URI}/fault/v1/network-packet-loss` 엔드포인트는 지정된 네트워크 인터페이스에 패킷 손실을 추가합니다. 이 엔드포인트는 다음 두 가지 모드와 호환됩니다.
+ **awsvpc**-변경 사항이 작업 네트워크 인터페이스에 적용됨
+ **호스트**-변경 사항이 기본 네트워크 인터페이스에 적용됨

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

이 `/start` 엔드포인트는 네트워크 패킷 손실 결함 주입을 시작하며 다음 파라미터를 갖습니다.

**LossPercent**  
패킷 손실의 백분율

유형: 정수

필수 여부: 예

**소스**  
결함 주입 테스트에 사용할 IPv4 또는 IPv6 주소나 CIDR 블록의 JSON 배열.

유형: 문자열 배열

필수 여부: 예

**SourcesToFilter**  
오류로부터 보호되는 IPv4 또는 IPv6 주소나 CIDR 블록의 JSON 배열. `SourcesToFilter`는 `Sources`보다 우선순위가 높습니다.

유형: 문자열 배열

필수 여부: 아니요

다음은 `start` 엔드포인트 사용에 대한 요청의 예입니다(*빨간색* 값을 자체 값으로 대체).

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

`{ECS_AGENT_URI}/fault/v1/network-packet-loss/stop` 엔드포인트가 오류를 중지하고 `{ECS_AGENT_URI}/fault/v1/network-packet-loss/status`가 오류 상태를 확인합니다. 한 번에 각 유형의 오류 중 하나만 지원됩니다.

다음은 `/stop` 및 `/status` 엔드포인트 사용에 대한 두 가지 예제 요청입니다. 둘 다 `POST HTTP` 메서드를 사용합니다.

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

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