« AWS Black Belt Tech Webinar 「Amazon SES」「Amazon Route 53」資料公開 | メイン | AWS初心者向けWebinar「.NET開発者のためのAWS超入門」の資料およびQA公開 »

Spot FleetでAmazon ECSクラスタを強力に

私の同僚のDrew DennisがSpot fleetでAmazon ECSを使う方法を紹介するゲスト投稿を送ってくれました。


オンデマンドのEC2インスタンスを使う利点はいくつかあります。しかし、多くのワークロード、例えば必要に応じて単純に起動し後続の同一処理で簡単に置き換える様なステートレスやタスクベースなシナリオでは、Spot fleetを使うことでより経済的に追加の計算資源を獲得することができます。加えてSpot fleetはリクエストされたターゲットキャパシティを保つために、終了させられたインスタンスを自動的に置き換えてくれます。

Amazon ECSは高いスケーラビリティとパフォーマンスを持つコンテナ管理サービスで、Dockerコンテナをサポートし、管理されたAmazon EC2インスタンスのクラスタ上で簡単にアプリケーションを実行することができます。ECSは既にEC2インスタンス上でのコンテナの配置やスケジュールを扱ってくれます。Spot fleetと組み合わせると、ECSはEC2のオンデマンド価格から大幅にコストを抑えることができます。

なぜSpot fleetなのか? 

Amazon EC2 SpotインスタンスはAmazon EC2の計算資源の余剰に対して入札して使います。通常オンデマンド価格に比べて割引の価格で利用することができるため、アプリケーションを実行するコストを大幅に削減することができます。Spot fleetでは複数のアベイラビリティゾーンやインスタンスタイプにまたがったSpotインスタンスの集合を1つのAPI呼び出しでリクエストすることができます。

Spot fleet APIはターゲットキャパシティと割当戦略を指定できます。利用可能な2つの割当戦略があり、”最低価格”と”多様性”です。最低価格戦略では、基本的に現在のSpot価格が最も低いインスタンスだけを使おうとしますが、多様性戦略では複数のSpot pool(アベイラビリティゾーン内で同種のタイプとOSのインスタンス群)にまたがって等分して使おうとするので、突然のSpot価格の上昇というリスクを軽減することができます。より詳しい情報はHow Spot Fleet Worksをご覧ください。

Spot fleetを使ってみる

Spot fleetのコンソールはhttps://console.aws.amazon.com/ec2spot/homeから利用できます。ここからSpot fleetのリクエストを作成し、IAM roleやbase64エンコードしたuser dataの作成も含めたリクエストに必要な全ての項目を設定することが簡単にできます。また、必要であればコンソールからリクエストのJSONをダウンロードすることができ、CLIベースでも使うことができます。

もしSpot fleetコンソールを使いたくなければ、Spot fleetリクエストのために必要な、インスタンスの入札/起動/停止といった権限を付与したIAM roleを作成する必要があります。注意点として、今回のシナリオではSpot fleetがECSクラスタに参加するためのroleを付けてインスタンスを起動できるために、iam:PassRoleアクションも必要となります。AWS SDKかAWS CLIがインストールされていることも確認してください。

この投稿では、みなさんはECSクラスタの作成、ECS Task Definitionの作成、そしてTask DefinitionからTaskやServiceを手動作成する手順については詳しいと想定しています。もしわからなければ、ECSのドキュメントをご覧下さい。

Spot fleetリクエストを作成する

Spot fleetリクエストを作成する前に、リクエストしようとするインスタンスタイプ、アベイラビリティゾーン、そして入札価格を知っておく必要があります。なおSpot fleetリクエストではインスタンスタイプ毎に異なる入札価格を使うこともできます。これらを決定したら、リクエストを始める準備が整います。下のスクリーンショットでは、c4.largeインスタンスでAmazon Linux ECS-optimized AMIを使ったfleetリクエストを作成しようとしています。リージョン毎のECS optimized AMIの最新のリストはLaunching an Amazon ECS Container Instanceトピックで見ることができます。

Spot-1

もし入札価格がインスタンスを起動しようとしている時点の最低価格を下回っていると、分かりやすく警告が出ていることがわかります。ここから、Spot価格の履歴やSpot入札アドバイザへアクセスして、過去の価格の変動をより理解することもできます。Nextを選んだ後、複数のゾーンに分散させたり、User dataを指定したり、以下にあるような他のリクエストのオプションを指定することができます。今回の例では、ECS container agentが接続するECSクラスタをuser dataで指定しています。

Spot-2

他にSpot fleetリクエストで考えられる例として、複数のインスタンスタイプを1つのアベイラビリティゾーンで入れ、それぞれ入札価格を調整するというものがあります。割当戦略は引き続き多様性を使い、これによって2つのインスタンスpoolから等しく起動してくれます。これを先ほどの例と組み合わせることも簡単で、複数のアベイラビリティゾーンと複数のインスタンスタイプを組み合わせることで、Spotインスタンスの終了のリスクをより軽減することができます。

ECS TaskとServiceをSpot fleet上で稼働させる

インスタンスがECSクラスタに参加したら、TaskやServiceをその上に起動することができますが、最初のTask Definitionの作成も必要です。より詳しい情報はDocker basics walkthroughをご覧ください。Task Definitionを作成した後で、Taskを手動で実行したり、ロングランニングプロセスとしてSerivceを実行できます。

ECS Serviceの場合、もしSpot priceによってインスタンスが1つ終了した時には、ECSが自動的に実行中だったコンテナをクラスタ内の他のEC2インスタンスに再割当てしてくれて、十分なリソースがある限り、必要とされているTaskの数を維持してくれます。

もしリソースが無かったら、数分のうちにSpot fleetリクエストによって新しいインスタンスに置き換えられます。新しいインスタンスは最初のSpot fleetリクエストの設定に従って起動するので、クラスタに参加し、必要とされる量を満たすために足りないコンテナが実行されます。

まとめると、Spot fleetは効率良く経済的にインスタンスをECSクラスタに追加する手段を提供します。Spot fleetリクエストは複数のインスタンスタイプやアベイラビリティゾーンに分散し、常にターゲットのインスタンス数を維持してくれるので、ステートレスなコンテナを実行するのにとても良い環境であり、ECSクラスタに安価なキャパシティを提供してくれます。

Auto ScalingとSpot fleetリクエスト

Auto ScalingはAWSのワークロードに応じてEC2のキャパシティを自動的に追加したり削減したりする素晴らしい機能です。ECSはAuto Scaling上でのクラスタもサポートしていますし、こういったシナリオを助けるためのCloudWatchメトリクスも提供しています。より詳しい情報は、Tutorial: Scaling Container Instances with CloudWatch Alarmsをご覧ください。Auto ScalingとSpot fleetを組み合わせることで、固定のキャパシティとオンデマンドの変動キャパシティを低コストで運用することができます。

今のところ、Spot fleetリクエストはSpotインスタンスリクエストの様にAuto Scalingポリシーと直接の連携はできません。しかし、Spot fleetAPIにはModifySpotFleetRequestと呼ばれる、リクエストのターゲットキャパシティを変更することができるAPIがあります。Dynamic Scaling with EC2 Spot Fleetのブログ投稿では、CloudWatchメトリクスを使ってLambda functionを呼び出し、Spot fleetのターゲットキャパシティを変更するというシナリオを例として紹介しています。ModifySpotFleetRequestはfleetリクエストをチューニングするためだけでなく、過剰なリソースを最小化するためにも使いやすく、コストを下げることができます。

まとめ

Amazon ECSは信頼ある状態管理と柔軟なコンテナスケジューリングのために、EC2インスタンスのクラスタを管理してくれます。Dockerコンテナは、柔軟でポータブルなアプリケーションのデプロイを提供し、ECSと組み合わせるとシンプルで効率の良い、大小様々なインスタンスとコンテナのfleet管理の手段を提供してくれます。

Spot fleetとECSを組み合わせることで、既存のクラスタに低コストなオプションを提供したり、新規のクラスタの作成までも可能となります。もちろん、昔のSpotインスタンスリクエストでも可能でしたが、Spot fleetはインスタンスタイプやアベイラビリティゾーンにまたがって(複数の割当戦略や価格で)リクエストすることができるので、クラスタの計算資源の可用性向上とトータルコスト削減によってECSの戦略をさらに高めることができます。

原文: https://aws.amazon.com/blogs/compute/powering-your-amazon-ecs-clusters-with-spot-fleet/ (翻訳: SA岩永)

コメント

Twitter, Facebook

このブログの最新情報はTwitterFacebookでもお知らせしています。お気軽にフォローください。

2018年4 月

1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30