Amazon Web Services ブログ

EC2 フリート – 1 回のリクエストで、大量のオンデマンドおよびスポットインスタンスを管理する

EC2 スポットフリートは実に画期的です。EC2 インスタンスタイプからアベイラビリティーゾーンに至るスポットインスタンスのフリートを、容量を見つけたり料金を監視するためのカスタムコードなしに開始できるようになります。アプリケーションに意味のある単位で対象の容量 (フリートのサイズ) を設定し、スポットフリートを作成して、自分の代わりにフリートの管理を任せることができます。私たちのお客様はあらゆる種類のスポットフリートを作成しています。たとえば、ある金融サービスのお客様は 10 個の異なる EC2 インスタンスタイプで、モンテカルロのシミュレーションを実行しています。このお客様は日常的に大量の vCPU のリクエストを作成し、可能な限り安価に大容量のアクセスを提供するという作業をスポットフリートに任せています。

EC2 フリート
本日、私たちは EC2 フリートを使ったスポットフリートで、自分たちが開拓した「一度設定するだけであとはお任せ」のモデルを拡張し、一般でも利用できるようになりました。これはユーザーにフリートを作成する新しいビルディングブロックで、EC2 オンデマンド、リザーブド、スポットの各インスタンスの組み合わせを 1 度の API コールで構成したものです。皆さんの必要なもの、容量、インスタンスまわりのことを聞かせてください。私たちがまとめて面倒見ます。私たちは足場組み的なコードを書く必要なく、必要に応じてインスタンスを開始、管理、監視、およびスケールします。

ユーザーはインスタンス、vCPU、またはアプリケーション指向の単位を条件にフリートの容量を指定し、また、スポットインスタンスで処理すべき容量の程度を指定できます。アプリケーション指向の単位を使用することで、ユーザーはアプリケーションのニーズを直接マップする方法で、各 EC2 インスタンスタイプの関連する性能を指定できます。3 つの容量指定オプション (インスタンス、vCPU、アプリケーション指向単位) はいずれも重量値として知られています。

この機能を使ってフリートにインスタンスを容易に管理させる方法が多数見つかるはずです。また、チームの近い将来のロードマップもきっと皆さんのお役に立つと思います (これについてはすぐに詳しくお話しします)。

EC2 フリートの使用
ステートレスのウェブサービス、ビッグデータクラスターを実行しているのであれ、継続的な統合パイプラインを実行しているのであれ、この機能を活用できる方法は多数あります。今日は、ゲノムのプロセスに EC2 フリートをどのように使用できるかについて説明しますが、これはリスクの分析、ログのプロセス、イメージのレンダリングといったワークロードと似ています。最近の DNA シークエンサーは毎日数テラバイトの未加工データを生成する可能性があり、これを適宜意味のある情報へプロセスするには、大量の処理能力が必要になります。ここでは従属的な分析タスクを並行的に走らせることで、大量のデータを超高速で処理してくれるワーカーノード「グリッド」のデプロイ方法をご紹介します。

ゲノム解析プロジェクトでは、数百、ときには数千のサーバー上で新しいパイプラインを実験し、試すために、EC2 の提供する伸縮性を使用できます。EC2 を利用すれば、必要なときすぐに必要な量のコアにアクセスでき、お支払いいただくのは使用した分のみです。今日からは RunInstances API または Auto Scaling グループをグリッドのオンデマンドおよびリザーブドインスタンスポーションに使用する必要があります。最高のコストパフォーマンスを得るために、もしパワフルなセカンダリ分析にスポットインスタンスを追加するのであれば、異なるインスタンスタイプをもつスポットフリートか複数の Spot Auto Scaling グループを追加する必要もあります。最後に、複数の API と Auto Scaling グループでスケーリングの決定を自動化するには、グリッドの進捗とバックログに定期的にアクセスする Lambda 関数と、現在のスポット料金を書く必要があります。これにより、Auto Scaling グループとスポットフリートが適宜書き換えられます。

今後はこれらすべてを 1 つの EC2 フリートに置き換えられます。それにより、分析 1 件あたりわずか 1 ドルという料金で規模に合わせたゲノムの分析を行うことができます。私のグリッドではパイプラインの各ステップで 1 vCPU と 4 GiB のメモリが必要で、vCPU あたり 4 GiB のメモリを備えた M4 と M5 インスタンスが完璧です。重量値付きで M4 と M5 インスタンスを使用し、各インスタンスで vCPU の数に対応するフリートを作成します。

  • m4.16xlarge – 64 vCPUs, weight = 64
  • m5.24xlarge – 96 vCPUs, weight = 96

これは次のようなテンプレートで記述できます。

"Overrides": [
{
  "InstanceType": "m4.16xlarge",
  "WeightedCapacity": 64,
},
{
  "InstanceType": "m5.24xlarge",
  "WeightedCapacity": 96,
},
]

デフォルトでは、EC2 フリートはスポットインスタンスの現在の料金とオンデマンドインスタンスのパブリック料金を使用して、インスタンスタイプとアベイラビリティーゾーン (テンプレートにいずれも指定) の最もコスト効率の良い組み合わせを選択します (RI に一致するインスタンスを指定する場合は割引が適用されます)。デフォルトモードは単位あたり最低料金のインスタンスを取得することに重点を置いています。つまり、私のグリッドでは、フリートが vCPU あたり最低価格を提供するインスタンスを見つけてくれるのです。

これからは EC2 フリートが、私が承認すると定義したインスタンスタイプのみを踏まえて、最低料金のオプションを選択してくれます。また、オンデマンドまたはリザーブドインスタンスの容量を使用して、いくつの vCPU を開始したいか、スポットインスタンスの容量を使用していくつの vCPU を開始するか指定できるようになります。

"TargetCapacitySpecification": {
	"TotalTargetCapacity": 2880,
	"OnDemandTargetCapacity": 960,
	"SpotTargetCapacity": 1920,
	"DefaultTargetCapacityType": "Spot"
}

上記のコードでは合計で 2880 vCPU を使用、そのうち 960 vCPU はオンデマンドを、1920 vCPU はスポットを使用するように指定されています。m5.24xlarge では vCPU あたりのオンデマンド料金が m4.16xlarge の vCPU あたりのオンデマンド料金より安価であるため EC2 フリートは 960 vCPU を実行するために 10 個の m5.24xlarge インスタンスを開始します。現在のスポット料金をベースに (繰り返しますが、vCPU ベースの料金)、EC2 フリートは 30 個の m4.16xlarge インスタンスか、20 個の m5.24xlarges を開始して、いずれの場合も 1920 vCPU を実行します。

これをまとめて私のフリートを説明するファイルを 1 つ (fl1.json) 作りました。

    "LaunchTemplateConfigs": [
        {
            "LaunchTemplateSpecification": {
                "LaunchTemplateId": "lt-0e8c754449b27161c",
                "Version": "1"
            }
        "Overrides": [
        {
          "InstanceType": "m4.16xlarge",
          "WeightedCapacity": 64,
        },
        {
          "InstanceType": "m5.24xlarge",
          "WeightedCapacity": 96,
        },
      ]
        }
    ],
    "TargetCapacitySpecification": {
        "TotalTargetCapacity": 2880,
        "OnDemandTargetCapacity": 960,
        "SpotTargetCapacity": 1920,
        "DefaultTargetCapacityType": "Spot"
    }
}

これでコマンド 1 つで自分のフリートを開始できます。

$ aws ec2 create-fleet --cli-input-json file://home/ec2-user/fl1.json
{
    "FleetId":"fleet-838cf4e5-fded-4f68-acb5-8c47ee1b248a"
}

フリート全体は数秒で作成され、10 個の m5.24xlarge オンデマンドインスタンスと 30 個の m4.16xlarge スポットインスタンスを使用して構築されました。これは、スポットの料金が、m4.16xlarge は 1.5¢/vCPU で、m5.24xlarge は 1.6¢/vCPU であるためです。

ここで、私のグリッドがバックログを超高速に処理し、追加のスポットインスタンスが不要になったとしましょう。そこで、私のフリートの仕様で対象の容量を変更し、サイズを次のように変更できます。

{         
    "TotalTargetCapacity": 960,
}

960 はリクエストしたオンデマンド vCPU の量に等しかったため、フリートを記述するときには、オンデマンド容量を使用して全容量が提供されたことがわかります。

"TargetCapacitySpecification": {
	"TotalTargetCapacity": 960,
	"OnDemandTargetCapacity": 960,
	"SpotTargetCapacity": 0,
	"DefaultTargetCapacityType": "Spot"
}

フリートが必要なくなれば、これを削除して、下記に示すようにインスタンスを終了できます。

$ aws ec2 delete-fleets --fleet-id fleet-838cf4e5-fded-4f68-acb5-8c47ee1b248a \
  --terminate-instances   
{
    "UnsuccessfulFleetDletetions": [],
    "SuccessfulFleetDeletions": [
        {
            "CurrentFleetState": "deleted_terminating",
            "PreviousFleetState": "active",
            "FleetId": "fleet-838cf4e5-fded-4f68-acb5-8c47ee1b248a"
        }
    ]
}

前述したように、RI の割引は EC2 フリートが RI に一致するときに適用されるため、RI のお客様が他の手段で EC2 フリートの恩恵を受けられるか不思議に思われているかもしれません。たとえば、M4 インスタンス用に独自の RI を持っているとしましょう。私の EC2 フリートでは m5.24xlarge を削除し、m4.10xlargem4.16xlarge を指定するとします。 次に、EC2 フリートがグリッドを作成するとき、そのサイズ全体で私の指定した M4 と AZ の容量を素早く検索し、私の RI の割引がこの試用に自動的に適用されます。

準備中
将来的に EC2 フリートと EC2 Auto Scaling グループを接続する予定です。これにより、インスタンスとスポット、リザーブド、オンデマンドを混在させた単独のフリートを作成できるようになります。一方、ヘルスチェックやライフサイクルフックなど、EC2 Auto Scaling 機能を活用することもできます。また、この統合により、フリートの管理に EC2 Auto Scaling を構築し、使用する Amazon ECS、Amazon EKS、AWS Batch などのサービスに EC2 フリートの機能を活用できるようになります。

今すぐ利用可能
今日からすべてのパブリック AWS リージョンで、EC2 フリートを作成し、活用できます。

Jeff;