

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 教程：使用 AWS FIS 测试点实例中断
<a name="fis-tutorial-spot-interruptions"></a>

竞价型实例使用可用的备用 EC2 容量，与按需定价相比，可享受高达 90% 的折扣。但是，Amazon EC2 可以在需要恢复容量时中断您的竞价型实例。在使用竞价型实例时，您必须为可能发生的中断情况做好准备。有关更多信息，请参阅 *Amazon EC2 用户指南*中的[竞价型实例中断](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/spot-interruptions.html)。

您可以使用 AWS 故障注入服务 (AWS FIS) 来测试您的应用程序如何处理竞价型实例中断。使用本教程创建实验模板，该模板使用 AWS FIS `aws:ec2:send-spot-instance-interruptions` 操作来中断您的一个竞价型实例。

或者，要使用亚马逊 EC2 控制台启动实验，请参阅*亚马逊 EC2 用户指南*中的[启动竞价型实例中断](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/initiate-a-spot-instance-interruption.html)。

## 先决条件
<a name="spot-interruptions-prerequisites"></a>

在使用 AWS FIS 中断竞价型实例之前，请先完成以下先决条件。

**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. （可选）创建竞价型实例请求**  
如果要为实验使用新竞价型实例，请运行请求竞价型实例的 [run-instances](https://docs.aws.amazon.com/cli/latest/reference/ec2/run-instances.html) 命令。默认在竞价型实例中断时将其终止。如果将中断行为设置为 `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` 选项使此命令仅返回竞价型实例 ID。下面是示例输出。

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

**4. 添加标签以便 AWS FIS 可以识别目标竞价型实例**  
使用 [create-tags 命令添加标签](https://docs.aws.amazon.com/cli/latest/reference/ec2/create-tags.html) Name=interruptMe 到您的目标竞价型实例。

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

## 步骤 1：创建实验模板
<a name="spot-interruptions-create-template"></a>

使用 AWS FIS 控制台创建实验模板。您可以在模板中指定要运行的操作。此操作会中断带有指定标签的竞价型实例。如果有多个带有该标签的竞价型实例， AWS FIS 会随机中断其中一个。

**创建试验模板**

1. 打开 AWS FIS 控制台，网址[https://console.aws.amazon.com/fis/](https://console.aws.amazon.com/fis/)为。

1. 在导航窗格中，选择**实验模板**。

1. 选择**创建实验模板**。

1. 对于**步骤 1，指定模板详细信息**，请执行以下操作：

   1. 对于**描述和名称**，输入模板的描述和名称。

   1. 选择**下一**步，然后进入**步骤 2，指定操作和目标**。

1. 对于**操作**，请执行以下操作：

   1. 选择**添加操作**。

   1. 输入操作名称。例如，输入 **interruptSpotInstance**。

   1. 对于**操作类型**，请选择 **aws: ec2:**。send-spot-instance-interruptions

   1. 对于 **Targ** et，请保留 AWS FIS 为你创建的目标。

   1. 在 **“操作” 参数 “****中断前持续时间**” 中，指定 2 分钟 (PT2M)。

   1. 选择**保存**。

1. 对于**目标**，请执行以下操作：

   1. 对于 AWS FIS 在上一步中自动创建的目标，选择**编辑**。

   1. 将默认名称替换为更具描述性的名称。例如，输入 **oneSpotInstance**。

   1. 验证**资源类型**是否为 **aws:ec2:spot-instance**。

   1. 对于**目标方法**，选择**资源标签、筛选条件和参数**。

   1. 对于**资源标签**，选择**添加新标签**，然后输入标签键和标签值。使用您为竞价型实例添加的标签进行中断，如本教程在先决条件中所述。

   1. 对于**资源筛选条件**，选择**添加新筛选条件**，然后输入 **State.Name** 作为路径并输入 **running** 作为值。

   1. 对于**选择模式**，选择**计数**。对于**资源数量**，输入 **1**。

   1. 选择**保存**。

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. 请选择**开始实验**。

1. （可选）要为实验添加标签，请选择**添加新标签**，然后输入标签键和标签值。

1. 请选择**开始实验**。当系统提示您确认时，输入 **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>

实验操作完成后，将出现以下情况：
+ 目标竞价型实例会收到一条[实例重新平衡建议](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/rebalance-recommendations.html)。
+ [竞价型实例中断通知](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/spot-interruptions.html#spot-instance-termination-notices)在 Amazon EC2 终止或停止您的实例前两分钟发出。
+ 两分钟后终止或停止竞价型实例。
+ 被 AWS FIS 停止的竞价型实例将保持停止状态，直到您重新启动该实例。

**验证实验是否已经中断实例**

1. 打开亚马逊 EC2 控制台，网址为[https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)。

1. 从导航窗格中，在单独的浏览器选项卡或窗口中打开 **Spot Requests**（竞价型实例请求）和 **Instances**（实例）。

1. 对于 **Spot Requests**（竞价型实例请求），选择该竞价型实例请求。初始状态为 `fulfilled`。实验完成后的状态变化如下：
   + `terminate`：状态变为 `instance-terminated-by-experiment`。
   + `stop`：状态先变为 `marked-for-stop-by-experiment`，然后变为 `instance-stopped-by-experiment`。

1. 对于**实例**，选择竞价型实例。初始状态为 `Running`。在您收到竞价型实例中断通知后两分钟，状态会根据中断行为发生以下变化：
   + `stop`：状态先变为 `Stopping`，然后变为 `Stopped`。
   + `terminate`：状态先变为 `Shutting-down`，然后变为 `Terminated`。

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

如果您不再需要通过 `stop` 中断行为为实验创建的竞价型测试实例，则可以取消竞价型实例请求并终止竞价型实例。

**要取消请求并终止实例，请使用 AWS CLI**

1. 使用[cancel-spot-instance-requests](https://docs.aws.amazon.com/cli/latest/reference/ec2/cancel-spot-instance-requests.html)命令取消竞价型实例请求。

   ```
   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. 打开 AWS FIS 控制台，网址[https://console.aws.amazon.com/fis/](https://console.aws.amazon.com/fis/)为。

1. 在导航窗格中，选择**实验模板**。

1. 选择实验模板，然后依次选择**操作**和**删除实验模板**。

1. 当系统提示您确认时，输入 **delete**，然后选择**删除实验模板**。