

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

# 教學課程：使用 AWS FIS 測試 Spot 執行個體中斷
<a name="fis-tutorial-spot-interruptions"></a>

Spot 執行個體使用可用的備用 EC2 容量，相較於隨需定價，最多可獲得 90% 的折扣。不過，Amazon EC2 可以在需要恢復容量時中斷 Spot 執行個體。使用 Spot 執行個體時，您必須準備好解決潛在的中斷。如需詳細資訊，請參閱《*Amazon EC2 使用者指南*》中的 [Spot 執行個體中斷](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/spot-interruptions.html)。

您可以使用 AWS Fault Injection Service (AWS FIS) 來測試應用程式如何處理 Spot 執行個體中斷。使用此教學課程來建立實驗範本，該範本使用 AWS FIS `aws:ec2:send-spot-instance-interruptions`動作來中斷其中一個 Spot 執行個體。

或者，若要使用 Amazon EC2 主控台啟動實驗，請參閱《*Amazon EC2 使用者指南*》中的[啟動 Spot 執行個體中斷](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/initiate-a-spot-instance-interruption.html)。

## 先決條件
<a name="spot-interruptions-prerequisites"></a>

您必須先完成下列先決條件，才能使用 AWS FIS 中斷 Spot 執行個體。

**1. 建立 IAM 角色**  
建立角色並連接政策，讓 AWS FIS 代表您執行`aws:ec2:send-spot-instance-interruptions`動作。如需詳細資訊，請參閱[AWS FIS 實驗的 IAM 角色](getting-started-iam-service-role.md)。

**2. 驗證對 AWS FIS 的存取**  
確保您可存取 AWS FIS。如需詳細資訊，請參閱 [AWS FIS 政策範例](security_iam_id-based-policy-examples.md)。

**3. （選用） 建立 Spot 執行個體請求**  
如果您希望在此實驗中使用新的 Spot 執行個體，請使用 [run-instances](https://docs.aws.amazon.com/cli/latest/reference/ec2/run-instances.html) 命令來請求 Spot 執行個體。預設為終止中斷的 Spot 執行個體。如果您將中斷行為設定為 `stop`，您還必須將 類型設定為 `persistent`。在本教學課程中，請勿將中斷行為設定為 `hibernate`，因為休眠程序會立即開始。

```
aws ec2 run-instances \
    --image-id ami-0ab193018fEXAMPLE \
    --instance-type "t2.micro" \
    --count 1 \
    --subnet-id subnet-1234567890abcdef0 \
    --security-group-ids sg-111222333444aaab \
    --instance-market-options file://spot-options.json \
    --query Instances[*].InstanceId
```

以下是 `spot-options.json` 檔案的範例。

```
{
    "MarketType": "spot",
    "SpotOptions": { 
        "SpotInstanceType": "persistent",
        "InstanceInterruptionBehavior": "stop"
    }
}
```

範例命令中的 `--query`選項使其能夠讓命令只傳回 Spot 執行個體的執行個體 ID。下列為範例輸出。

```
[
    "i-0abcdef1234567890"   
]
```

**4. 新增標籤，讓 AWS FIS 可以識別目標 Spot 執行個體**  
使用 [create-tags](https://docs.aws.amazon.com/cli/latest/reference/ec2/create-tags.html) 命令將標籤新增至Name=interruptMe您的目標 Spot 執行個體。

```
aws ec2 create-tags \
    --resources i-0abcdef1234567890 \
    --tags Key=Name,Value=interruptMe
```

## 步驟 1：建立實驗範本
<a name="spot-interruptions-create-template"></a>

使用 AWS FIS 主控台建立實驗範本。在 範本中，您可以指定要執行的動作。動作會中斷具有指定標籤的 Spot 執行個體。如果有一個以上的 Spot 執行個體具有標籤， AWS FIS 會隨機選擇其中一個。

**建立實驗範本**

1. 在 https：//[https://console.aws.amazon.com/fis/](https://console.aws.amazon.com/fis/) 開啟 AWS FIS 主控台。

1. 在導覽窗格中，選擇**實驗範本**。

1. 選擇**建立實驗範本**。

1. 針對**步驟 1，指定範本詳細資訊**，執行下列動作：

   1. 針對**描述和名稱**，輸入範本的描述和名稱。

   1. 選擇**下一步**，然後移至**步驟 2，指定動作和目標**。

1. 對於 **Actions (動作)**，執行下列動作：

   1. 選擇**新增動作**。

   1. 輸入動作的名稱。例如，​輸入 **interruptSpotInstance**。

   1. 針對**動作類型**，選擇 **aws：ec2：send-spot-instance-interruptions**。

   1. 對於**目標**，保留 AWS FIS 為您建立的目標。

   1. 對於**動作參數**，**中斷之前的持續時間**，指定 2 分鐘 (PT2M)。

   1. 選擇 **Save** (儲存)。

1. 對於 **Targets (目標)**，執行下列動作：

   1. 針對 AWS FIS 在上一個步驟中自動為您建立的目標，選擇**編輯**。

   1. 以更描述性的名稱取代預設名稱。例如，​輸入 **oneSpotInstance**。

   1. 確認**資源類型**為 **aws：ec2：spot-instance**。

   1. 針對**目標方法**，選擇**資源標籤、篩選條件和參數**。

   1. 針對**資源標籤**，選擇**新增標籤**，然後輸入標籤索引鍵和標籤值。使用您新增至 Spot 執行個體的標籤來中斷，如本教學課程的先決條件所述。

   1. 針對**資源篩選條件**，選擇**新增篩選條件**，然後輸入 **State.Name** 做為路徑，輸入 **running**做為值。

   1. 針對**選取模式**，選擇**計數**。針對**資源數量**，輸入 **1**。

   1. 選擇 **Save** (儲存)。

1. 選擇**下一步**以移至**步驟 3，設定服務存取**。

1. 針對**服務存取**，選擇**使用現有的 IAM 角色**，然後選擇您建立的 IAM 角色，如本教學課程的先決條件所述。如果您的角色未顯示，請確認其具有所需的信任關係。如需詳細資訊，請參閱[AWS FIS 實驗的 IAM 角色](getting-started-iam-service-role.md)。

1. 選擇**下一步**以移至**步驟 4，設定選用設定**。

1. （選用） 針對**標籤**，選擇**新增標籤**，並指定標籤索引鍵和標籤值。您新增的標籤會套用至實驗範本，而不是使用範本執行的實驗。

1. 選擇**下一步**以移至**步驟 5，檢閱並建立**。

1. 檢閱範本，然後選擇**建立實驗範本**。出現確認提示時，輸入 `create`，然後選擇**建立實驗範本**。

**（選用） 檢視實驗範本 JSON**  
選擇**匯出**索引標籤。以下是上述主控台程序所建立 JSON 的範例。

```
{
    "description": "Test Spot Instance interruptions",
    "targets": {
        "oneSpotInstance": {
            "resourceType": "aws:ec2:spot-instance",
            "resourceTags": {
                "Name": "interruptMe"
            },
            "filters": [
                {
                    "path": "State.Name",
                    "values": [
                        "running"
                    ]
                }
            ],
            "selectionMode": "COUNT(1)"
        }
    },
    "actions": {
        "interruptSpotInstance": {
            "actionId": "aws:ec2:send-spot-instance-interruptions",
            "parameters": {
                "durationBeforeInterruption": "PT2M"
            },
            "targets": {
                "SpotInstances": "oneSpotInstance"
            }
        }
    },
    "stopConditions": [
        {
            "source": "none"
        }
    ],
    "roleArn": "arn:aws:iam::123456789012:role/AllowFISSpotInterruptionActions",
    "tags": {
        "Name": "my-template"
    }
}
```

## 步驟 2：開始實驗
<a name="spot-interruptions-start-experiment"></a>

完成建立實驗範本後，您可以使用它來開始實驗。

**開始實驗**

1. 您應該位於您剛建立之實驗範本的詳細資訊頁面。否則，請選擇**實驗範本**，然後選擇實驗範本的 ID 以開啟詳細資訊頁面。

1. 選擇 **Start experiment** (開始實驗)。

1. （選用） 若要將標籤新增至實驗，請選擇**新增標籤**並輸入標籤索引鍵和標籤值。

1. 選擇 **Start experiment** (開始實驗)。出現確認提示時，輸入 **start** 並選擇**開始實驗**。

## 步驟 3：追蹤實驗進度
<a name="spot-interruptions-track-experiment"></a>

您可以追蹤執行中實驗的進度，直到實驗完成、停止或失敗為止。

**追蹤實驗的進度**

1. 您應該位於您剛開始之實驗的詳細資訊頁面。否則，請選擇**實驗**，然後選擇實驗的 ID 以開啟詳細資訊頁面。

1. 若要檢視實驗狀態，請在**詳細資訊**窗格中檢查**狀態**。如需詳細資訊，請參閱[實驗狀態](view-experiment-progress.md#experiment-states)。

1. 當實驗的狀態正在**執行**時，請前往下一個步驟。

## 步驟 4：驗證實驗結果
<a name="spot-interruptions-verify-experiment-result"></a>

此實驗的動作完成時，會發生下列情況：
+ 目標 Spot 執行個體會收到[執行個體重新平衡建議](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/rebalance-recommendations.html)。
+ [Spot 執行個體中斷通知](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/spot-interruptions.html#spot-instance-termination-notices)會在 Amazon EC2 終止或停止執行個體的兩分鐘前發出。
+ 兩分鐘後，Spot 執行個體會終止或停止。
+ FIS AWS 停止的 Spot 執行個體會保持停止狀態，直到您重新啟動為止。

**驗證執行個體是否被實驗中斷**

1. 在 [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/) 開啟 Amazon EC2 主控台。

1. 從導覽窗格中，在單獨的瀏覽器索引標籤或視窗中開啟 **Spot Requests** (Spot 請求) 和 **Instances** (執行個體)。

1. 對於 **Spot Requests** (Spot 請求)，選取 Spot 執行個體請求。起始狀態為 `fulfilled`。實驗完成後，狀態會變更，如下所示：
   + `terminate` - 狀態變更為 `instance-terminated-by-experiment`。
   + `stop` - 狀態會變更為 `marked-for-stop-by-experiment`，然後變更為 `instance-stopped-by-experiment`。

1. 對於 **Instances** (執行個體)，選取 Spot 執行個體。起始狀態為 `Running`。收到 Spot 執行個體中斷通知後兩分鐘，狀態會變更，如下所示：
   + `stop` - 狀態會變更為 `Stopping`，然後變更為 `Stopped`。
   + `terminate` - 狀態會變更為 `Shutting-down`，然後變更為 `Terminated`。

## 步驟 5：清除
<a name="spot-interruptions-cleanup"></a>

如果您為此實驗使用 的中斷行為建立測試 Spot 執行個體，`stop`且不再需要它，您可以取消 Spot 執行個體請求並終止 Spot 執行個體。

**使用 取消請求並終止執行個體 AWS CLI**

1. 使用 [cancel-spot-instance-requests](https://docs.aws.amazon.com/cli/latest/reference/ec2/cancel-spot-instance-requests.html) 命令來取消 Spot 執行個體請求。

   ```
   aws ec2 cancel-spot-instance-requests --spot-instance-request-ids sir-ksie869j
   ```

1. 使用 [terminate-instances](https://docs.aws.amazon.com/cli/latest/reference/ec2/terminate-instances.html) 命令來終止執行個體。

   ```
   aws ec2 terminate-instances --instance-ids i-0abcdef1234567890
   ```

如果您不再需要實驗範本，則可以將其刪除。

**使用 AWS FIS 主控台刪除實驗範本**

1. 在 https：//[https://console.aws.amazon.com/fis/](https://console.aws.amazon.com/fis/) 開啟 AWS FIS 主控台。

1. 在導覽窗格中，選擇**實驗範本**。

1. 選取實驗範本，然後選擇**動作**、**刪除實驗範本**。

1. 出現確認提示時，輸入 **delete**，然後選擇**刪除實驗範本**。