チュートリアル: AWS FIS でスポットインスタンスの中断をテストする - AWS フォールトインジェクションサービス

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

チュートリアル: AWS FIS でスポットインスタンスの中断をテストする

スポットインスタンスは、利用可能な予備の EC2 キャパシティーを使用します。オンデマンド料金と比較して最大 90% の割引が適用されます。しかし、Amazon EC2 は、必要なときにスポットインスタンスを中断できます。スポットインスタンスを使用する場合には、中断に備えておく必要があります。詳細については、[Amazon EC2 ユーザーガイド] の[スポットインスタンス中断] を参照してください。

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

また、Amazon EC2 コンソールで実験を開始するには、『Amazon EC2 ユーザーガイド』の「スポットインスタンスの中断を開始する」を参照してください。

前提条件

AWS FIS でスポットインスタンスを中断する前に、以下の前提条件が満たされていることを確認してください。

1. IAM ロールの作成

ロールを作成し、AWS FIS にユーザーに代わって aws:ec2:send-spot-instance-interruptions アクションを実行できるポリシーをアタッチします。詳細については、「AWS FIS 実験用の IAM ロール」を参照してください。

2. AWS FIS へのアクセスを検証する

AWS FIS にアクセスできることを確認します。詳細については、「AWS FIS ポリシー例」を参照してください。

3. (オプション) スポットインスタンスリクエストを作成する

この実験に新しいスポットインスタンスを使用する場合は、run-instances コマンドでスポットインスタンスをリクエストします。デフォルトでは、スポットインスタンスは中断されると終了します。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 がターゲットのスポットインスタンスを識別できるようにタグを追加します。

タグ Name=interruptMe をターゲットのスポットインスタンスに追加するには、create-tags コマンドを使用します。

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

ステップ 1: 実験テンプレートを作成する

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

実験テンプレートを作成するには
  1. https://console.aws.amazon.com/fis/ で AWS FIS コンソールを開きます。

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

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

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

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

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

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

    3. アクションタイプ でaws:ec2:send-spot-instance-interruptions を選択します。

    4. ターゲット については、AWS FIS が作成したターゲットをそのまま使用してください。

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

    6. [保存] を選択します。

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

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

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

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

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

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

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

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

    8. [保存] を選択します。

  7. [サービスアクセス] では、[既存の IAM ロールを使用する] を選択し、このチュートリアルの前提条件の説明に従って作成した IAM ロールを選択します。ロールが表示されない場合は、必要な信頼関係があることを確認してください。詳細については、「AWS FIS 実験用の IAM ロール」を参照してください。

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

  9. [実験テンプレートの作成] を選択します。確認を求められたら、「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: 実験を開始する

実験テンプレートの作成が完了したら、それを使用して実験を開始できます。

実験を開始するには
  1. 作成した実験テンプレートの詳細ページに移動する必要があります。または、[実験テンプレート] の ID を選択して、詳細ページを開きます。

  2. [実験を開始する] を選択します。

  3. (オプション) 実験にタグを追加するには、[新しいタグを追加] を選択し、タグキーとタグ値を入力します。

  4. [実験を開始する] を選択します。確認を求められたら、start を入力して、[実験を開始する] を選択します。

ステップ 3: 実験の進行状況を追跡する

実験の完了、停止、または失敗するまで、実行中の実験の進行状況を追跡できます。

実験の進行状況を追跡するには
  1. 始めたばかりの実験の詳細ページにいるはずです。または、[実験] の ID を選択して、詳細ページを開きます。

  2. 実験の状態を表示するには、[詳細] ペインの [状態] を確認してください。詳細については、「実験状態」を参照してください。

  3. 実験の状態が [実行中] のときは、次のステップに進みます。

ステップ 4: 実験結果の検証

この実験のアクションが完了すると、以下の状況が発生します。

  • ターゲットのスポットインスタンスはインスタンスの再調整に関する推奨事項を受け取ります。

  • スポットインスタンスの中断通知は、Amazon EC2 がインスタンスを停止または終了する 2 分前に発行されます。

  • 2 分後、スポットインスタンスは終了または停止します。

  • AWS FIS で停止されたスポットインスタンスは、ユーザーにより再起動されるまで停止状態を維持します。

インスタンスが実験によって中断されたことを検証するには
  1. Amazon EC2 コンソール (https://console.aws.amazon.com/ec2/) を開きます。

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

  3. スポットリクエストで、スポットインスタンスリクエストを選択します。初期ステータスは、fulfilled です。実験が完了すると、ステータスは次のように変わります。

    • terminate - ステータスが instance-terminated-by-experiment に変わります。

    • stop - ステータスが marked-for-stop-by-experiment そしてその後 instance-stopped-by-experiment に変わります。

  4. インスタンスで、スポットインスタンスを選択します。初期ステータスは、Running です。スポットインスタンスの中断通知を受け取った後 2 分後、ステータスは次のように変化します。

    • stop - ステータスが Stopping そしてその後 Stopped に変わります。

    • terminate - ステータスが Shutting-down そしてその後 Terminated に変わります。

ステップ 5:クリーンアップ

この実験のテストスポットインスタンスを中断動作 stop で作成した場合で、そのスポットインスタンスが必要でなくなったら、スポットインスタンスリクエストをキャンセルし、スポットインスタンスを終了することができます。

リクエストをキャンセルし、AWS CLI を使用してインスタンスを終了するには
  1. cancel-spot-instance-requests コマンドを使用して、スポットインスタンスリクエストをキャンセルします。

    aws ec2 cancel-spot-instance-requests --spot-instance-request-ids sir-ksie869j
  2. インスタンスを終了するには、terminate-instances コマンドを使用します。

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

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

AWS FIS コンソールを使用して実験テンプレートを削除するには
  1. https://console.aws.amazon.com/fis/ で AWS FIS コンソールを開きます。

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

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

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