⏹️

AWS FISでスポットインスタンスの中断をシミュレートする

2024/12/13に公開

TL;DR

AWS Fault Injection Service(FIS)を用いて,スポットインスタンスの中断をシミュレーションする方法を紹介します.

AWS FISとは

Amazon Web Services(AWS)が提供するフルマネージド型のカオスエンジニアリングサービスです.このサービスを使用することで,本番環境やテスト環境でシステムの耐障害性を向上させるための実験を安全かつ計画的に実施できます.

https://aws.amazon.com/jp/fis/

AWS FISの特徴

  • システムの耐障害性テスト
    • AWS FISは,障害シナリオをシミュレートして,システムがエラーやダウンタイムに対してどのように動作するかをテストできます.
    • シミュレーションから,システムが異常な状況でも安定して稼働し続けられるよう設計や運用を改善できます.
  • カオスエンジニアリングの実現
    • 「カオスエンジニアリング」とは,意図的に障害を発生させることで、システムの回復力や堅牢性を向上させる手法です.
    • AWS FISは,このプロセスを自動化し,標準化されたツールとして提供します.
  • フルマネージド型の安全な環境
    • AWS FISは完全にマネージドされており,ユーザーがインフラを管理する必要がありません.
    • 実験は事前に設定されたガードレール(安全対策)内で行われるため,本番環境に与える影響を最小限に抑えられます.

AWS FISの主な機能

  • 障害注入アクション
    • CPUやメモリの負荷を人工的に増加させる.
    • インスタンスやサービスの停止をシミュレートする.
    • ネットワーク遅延や接続障害を発生させる.
  • 実験テンプレート
    • 「実験テンプレート」を使用して,障害注入シナリオを簡単に設計できます.
      • ターゲットリソース
      • 注入する障害
      • ガードレール設定など
  • 安全ガードレール
    • 実験中にシステム全体がダウンしないようにするための安全措置です.
      • 例:「インスタンスの最大停止数を設定する」など,リスクを制御するオプション

ユースケース

  • システムの復旧能力のテスト
    • オートスケーリングやフェイルオーバー機能が正常に動作するかを確認します.
  • ネットワークの耐障害性評価
    • ネットワークの断続的な障害やレイテンシの増加に対するサービスの応答性を確認します.
  • 運用チームの対応能力向上
    • システム障害時の手動対応フローやアラートシステムが適切に機能するかをテストします.

今回やること

AWS Fault Injection Service(FIS)を用いて,スポットインスタンスの中断(中断通知の送付)をシミュレーションする方法を紹介します.
スポットインスタンスの中断
スポットインスタンスは,余剰のEC2リソースを活用することで低コストを実現しています.しかし,この仕組み上,インスタンスが突然中断(回収)される可能性があります.中断とは,AWSがスポットインスタンスを停止または終了することを指します.
中断通知
AWSはスポットインスタンスの中断を行う際に,インスタンスに「2分前の通知」を送付します.

構成

  • SpotFleet
    • スポットインスタンス起動のリクエストを作成します.
  • AWS FIS
    • スポットインスタンスの中断をシミュレートします.
    • ログをLog Groupに送信します.
  • Log Group
    • AWS FISでの実験ログを保持ます.
  • IAM
    • AWS FISが実験を行うにあたり必要な権限を付与します.

事前準備

スポットインスタンスを起動しておきます.
スポットインスタンスの起動方法については,こちらを参考にしてください.
また,起動時に,インスタンスのタグを設定しておいてください.スポットフリートリクエストで作成するとconfig.jsonは以下のようになります.

config.json
{
    "TargetCapacity": 1,
    "SpotPrice": "0.04",
    "IamFleetRole":"your_role",
    "LaunchSpecifications": [
        {
            "ImageId": "ami-023ff3d4ab11b2525",
            "KeyName": "your_key",
            "SecurityGroups": [
              { "GroupId":"your_sg"}
            ],
            "InstanceType": "t1.micro",
            "TagSpecifications":[
                {
                    "ResourceType":"instance",
                    "Tags":[
                        {
                            "Key":"Name",
                            "Value":"interruptMe"
                        }
                    ]
                }
            ],
        }
    ]
}

実験テンプレートの作成

  1. AWS FISのコンソールを開きます.

  2. ナビゲーションペインで,回復力のテスト>実験テンプレートを選択します.

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

  4. 説明と名前に,テンプレートの説明と名前を入力します.今回は,どちらもinterruption_testとします.

  5. 操作で,以下の作業を行います.

    • アクションの追加を選択します.
    • アクションに名前を入力します.今回はinterruptSpotInstanceとします.
    • アクションタイプで,aws:ec2:send-spot-instance-interruptionsを選択します.
    • ターゲットがデフォルト(SpotInstances-Target-1)で作成されます.後に修正するので,ここではデフォルトを選択します.
    • アクションパラメータ(Duration before interruption)には,2分(PT2M)を指定します.
    • 設定を保存します.

  6. ターゲットで,以下の作業を行います.

    • 先ほどデフォルトで作成されたターゲットを編集します.aws:ec2:spot-instanceをクリックすると編集画面がポップアップします.
    • デフォルト名を,よりわかりやすい名前に置き換えます.今回は,oneSpotInstanceとします.
    • リソースタイプが aws:ec2:spot-instance になっていることを確認します.
    • ターゲットメソッド に,リソースタグ、フィルター、パラメーターを選択します.
      - タグ
      - Key:Name
      - Value:interruptMe
      • フィルター
        • Pass:State.Name
        • Value:running
      • パラメータ
        • 選択モード:
        • リソースの数:1
    • 設定を保存します.


  7. サービスアクセスの設定は,実験テンプレート用の新しいロールを作成するにします.
    事前にFIS用のIAMロールを作成していなくても大丈夫です.

  8. [オプション設定]
    レポートをS3に配信したい方はこちらで設定を行なってください.

  9. 実験テンプレートを作成をクリックします.

実験を開始する

  1. 作成した実験テンプレートにチェックをつけて,実験を開始をクリックします.

  2. オプションでタグを追加し,実験を開始をクリックします.

これで,中断通知がタグ付けされたスポットインスタンスに送付され,2分後にインスタンスが中断されます.

最後に

AWS FISを用いて,スポットインスタンスの中断をシミュレーションする方法を紹介しました.
スポットフリートリクエストは,起動したインスタンスが中断されても,再度インスタンスの起動をリクエストするため,新しいインスタンスが立ち上がっていることが確認できると思います.

Discussion