

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 搭配 Amazon ECS 與 Fargate 工作負載使用故障注入
<a name="fault-injection"></a>

客戶可以在 Amazon EC2 與 Fargate 上搭配 Amazon ECS 使用故障注入，以測試應用程式在特定受損案例下的應對表現。這些測試提供的資訊可用於最佳化應用程式的效能與恢復能力。

啟用故障注入後，Amazon ECS 容器代理程式會允許任務存取新的故障注入端點。您需要選擇加入，才能透過將 `enableFaultInjection` 任務定義參數值設定為 `true` 來使用故障注入。預設值為 `false`。

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

**注意**  
故障注入僅適用於使用 `awsvpc` 或 `host` 網路模式的任務。  
故障注入不適用於 Windows。

如需有關如何在 中啟用錯誤注入的資訊 AWS 管理主控台，請參閱[使用主控台建立 Amazon ECS 任務定義](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/create-task-definition.html)。

您需要在 AWS Fault Injection Service中啟用此功能以進行測試。如需詳細資訊，請參閱[使用 AWS FIS aws：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 容器代理程式會自動將 `ECS_AGENT_URI` 環境變體注入 Amazon ECS 任務的容器中，以提供與容器代理程式 API 端點互動的方法。每個端點都包含 `/start`、`/stop` 與 `/status`端點。這些端點僅接受已啟用故障注入之任務的請求，且每個端點的速率限制為每個容器每 **5** 秒 **1** 個請求。超過此限制會導致錯誤。

**注意**  
需要具有 Amazon ECS Agent `version 1.88.0+` 才能使用故障注入端點。

搭配故障注入使用的三個端點為：
+ [網路黑洞連接埠端點](#fis-endpoint-blackhole-ports)
+ [網路封包遺失端點](#fis-endpoint-packet-loss)
+ [網路延遲端點](#fis-endpoint-latency)

成功的請求會產生 `200` 的回應碼，呼叫 `/start` 端點時訊息為 `running`，呼叫 `/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
```