

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# チュートリアル: FIS を使用してスポットインスタンスの中断 AWS をテストする
<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 Fault Injection Service (AWS FIS) を使用して、アプリケーションがスポットインスタンスの中断を処理する方法をテストできます。このチュートリアルを使用して、FIS AWS `aws:ec2:send-spot-instance-interruptions`アクションを使用してスポットインスタンスの 1 つを中断する実験テンプレートを作成します。

また、Amazon EC2 コンソールで実験を開始するには、『*Amazon EC2 ユーザーガイド*』の「[スポットインスタンスの中断を開始する](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/initiate-a-spot-instance-interruption.html)」を参照してください。

## 前提条件
<a name="spot-interruptions-prerequisites"></a>

FIS AWS を使用してスポットインスタンスを中断する前に、次の前提条件を完了してください。

**1. IAM ロールを作成する**  
ロールを作成し、ユーザーに代わって FIS AWS が`aws:ec2:send-spot-instance-interruptions`アクションを実行できるようにするポリシーをアタッチします。詳細については、「[FIS 実験の IAM AWS ロール](getting-started-iam-service-role.md)」を参照してください。

**2. FIS AWS へのアクセスを検証する**  
FIS AWS にアクセスできることを確認します。詳細については、「[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. FIS AWS がターゲットスポットインスタンスを識別できるようにタグを追加する**  
タグ Name=interruptMe をターゲットのスポットインスタンスに追加するには、[create-tags](https://docs.aws.amazon.com/cli/latest/reference/ec2/create-tags.html) コマンドを使用します。

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

## ステップ 1: 実験テンプレートを作成する
<a name="spot-interruptions-create-template"></a>

FIS AWS コンソールを使用して実験テンプレートを作成します。テンプレートで、実行するアクションを指定します。アクションは、指定されたタグでスポットインスタンスを中断します。タグが付いたスポットインスタンスが複数ある場合、 AWS FIS によってそのうちの 1 つがランダムに選択されます。

**実験テンプレートを作成するには**

1. [https://console.aws.amazon.com/fis/](https://console.aws.amazon.com/fis/) AWS で FIS コンソールを開きます。

1. ナビゲーションペインで、**[実験テンプレート]** を選択します。

1. **[実験テンプレートの作成]** を選択します。

1. **ステップ 1、テンプレートの詳細を指定する**には、次の手順を実行します。

   1. **[説明と名前]** に、テンプレートの説明と名前を入力します。

   1. **次**へ を選択し、**ステップ 2、アクションとターゲットを指定する** に進みます。

1. **[操作]** で、以下の作業を行います。

   1. **[アクションの追加]** を選択します。

   1. アクションに名前を入力します。例えば、**interruptSpotInstance** と入力します。

   1. **アクションの種類**で、**aws:ec2:send-spot-instance-interruptions**を選択します。

   1. **ターゲット** には、FIS AWS が作成するターゲットを保持します。

   1. **[アクションパラメーター]** の **[中断までの時間]** に 2 分 (PT2M) を指定します。

   1. **[Save (保存)]** を選択します。

1. **[ターゲット]** で、以下の作業を行います。

   1.  AWS FIS が前のステップで自動的に作成したターゲットの **[編集]** を選択します。

   1. デフォルト名を、よりわかりやすい名前に置き換えます。例えば、**oneSpotInstance** と入力します。

   1. **[リソースタイプ]** が **aws:ec2:spot-instance** になっていることを確認します。

   1. **[ターゲットメソッド]** に、**[リソース] タグ、フィルター、パラメーター**を選択します。

   1. **[リソースタグ]** で、**[新しいタグを追加]** を選択し、タグのキーとタグの値を入力します。このチュートリアルの前提条件の説明に従って、スポットインスタンスに追加したタグを使用して割り込みます。

   1. **[リソースフィルター]** で **[新しいフィルターを追加]** を選択し、パス **State.Name** と値 **running** を入力します。

   1. **[選択モード]** で、**[カウント]** を選択します。**[リソース数]** に、「**1**」と入力します。

   1. [**Save**] を選択します。

1. **次**へ を選択して、**ステップ 3、サービスアクセスの設定**に移動します。

1. **Service Access** では、**[既存の IAM ロールを使用する]** を選択し、このチュートリアルの前提条件の説明に従って、作成した IAM ロールを選択します。ロールが表示されない場合は、必要な信頼関係があることを確認してください。詳細については、「[FIS 実験の IAM AWS ロール](getting-started-iam-service-role.md)」を参照してください。

1. **次**へ を選択して、**ステップ 4、オプション設定の構成**に移動します。

1. (オプション) **タグ**で、**[Add Tag (タグの追加)]** を選択して、タグのキーと値を指定します。追加するタグは、テンプレートを使用して実行される実験ではなく、実験テンプレートに適用されます。

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. 始めたばかりの実験の詳細ページにいるはずです。または、**[Experiments (実験)]** の 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 がインスタンスを停止または終了する 2 分前に発行されます。
+ 2 分後、スポットインスタンスは終了または停止します。
+  AWS FIS によって停止されたスポットインスタンスは、再起動するまで停止されたままになります。

**インスタンスが実験によって中断されたことを検証するには**

1. Amazon EC2 コンソール ([https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)) を開きます。

1. ナビゲーションペインで、**[スポットリクエスト]** を開いてから、別のブラウザタブまたはウィンドウで**[インスタンス]** を開きます。

1. **スポットリクエスト**で、スポットインスタンスリクエストを選択します。初期ステータスは`fulfilled` です。実験が完了すると、ステータスは次のように変わります。
   + `terminate` - ステータスが `instance-terminated-by-experiment` に変わります。
   + `stop` - ステータスが `marked-for-stop-by-experiment` そしてその後 `instance-stopped-by-experiment` に変わります。

1. **インスタンス**で、スポットインスタンスを選択します。初期ステータスは`Running` です。スポットインスタンスの中断通知を受け取った後 2 分後、ステータスは次のように変化します。
   + `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}}
   ```

実験テンプレートが不要になった場合には、それを削除することができます。

**FIS AWS コンソールを使用して実験テンプレートを削除するには**

1. [https://console.aws.amazon.com/fis/](https://console.aws.amazon.com/fis/) AWS で FIS コンソールを開きます。

1. ナビゲーションペインで、**[Experiment templates (実験テンプレート)]** を選択します。

1. 実験テンプレートを選択し、**[アクション]**、**[実験テンプレートの削除]** を選択します。

1. 確認を求められたら、**delete** と入力し、**[実験テンプレートの削除]** を選択します。