[AWS] ECSでスポットインスタンス混在クラスターを使うCFnテンプレート

はじめに

過去にECS環境を作成するためのCFnテンプレートを公開しました。
しかし、当時公開していたテンプレートではオンデマンドインスタンスのみを実行する設定になっていたため、ECSのメリットであるスポットインスタンスの活用のしやすさが活かせていません。

↓過去記事はこちら

[AWS]ECS環境を作成するCloudFormationのテンプレート

今回はECSでスポットインスタンス混在のクラスターを作成するCFnテンプレートを作成したので記事にしました。

テンプレート置き場

https://github.com/noname-work/aws-cloudformation/tree/master/ecs/ecs-on-ec2

AutoScalingの起動設定ではスポット混在できない


過去に作成したオンデマンドインスタンスのみを実行するテンプレートの場合は、[AWS::AutoScaling::LaunchConfiguration]を指定してAutoScalingの起動設定を作成しています。

オンデマンドインスタンスやリザーブドインスタンス(or SavingPlan)のみを使う場合はこれで良いのですが、スポットインスタンスを混在させたい場合はAutoScaling起動設定の利用ができません

EC2起動テンプレートを作成


AutoScalingグループからスポットインスタンス混在でインスタンスを起動したい場合には、AutoScaling起動設定ではなくEC2の起動テンプレート[AWS::EC2::LaunchTemplate]を定義します。

ちなみにインスタンスタイプを2種類設定できるようにしている理由は、1つのインスタンスタイプのみしか設定できない場合に、そのインスタンスタイプのスポットインスタンスが枯渇していると目標のインスタンス台数が確保できなくなってしまうためです。

EC2の起動テンプレート内ではInstanceType1しか指定していませんが、AutoScalingグループ内できちんと上書きしていますのでご安心を。

パラメータ

create-ecs-on-spot-ec2-cluster.ymlのパラメータ
ClusterName 作成予定のECSクラスター名を入力します。
InstanceType1 優先的に実行するインスタンスタイプを選択します。
InstanceType2 予備のインスタンスタイプを選択。
ECSSubnetIDs ECSインスタンスを立てるサブネットを選択します。
KeyName ECSインスタンスに接続するためのキーペアを選択します。
ImageId ECSに最適化されたAMIのIDを入力します。
ECSSecurityGroups ECSインスタンスにアタッチするセキュリティグループを選択します。
OnDemandInstancePercentage オンデマンドインスタンスの割合を設定します。
ScalingDesiredCapacity ECSインスタンスの希望数です。
ScalingMaxSize ECSインスタンスの最大数です。
ScalingMinSize ECSインスタンスの最小数です。

おわりに


スポットインスタンス混在のECSクラスターを作成するテンプレートを公開しました。

スポットインスタンスはコンテナオーケストレーションと非常に相性が良いため、活用することでコストを大きく下げることができます。

ホストインスタンス全体のキャパシティが余っていれば、万が一いくつかのスポットインスタンスが停止してしまう場合でもドレイニングによって必要なコンテナを別のホストインスタンスに避難させることができるため、必要なコンテナ数を担保することが可能です。

また、AutoScalingにより停止したスポットインスタンスの数だけ新しいインスタンスが補充されますので、きちんと設計されたECSクラスターであればスポットインスタンスの比率を高く採用していてもサービスダウンにつながりにくいです。

是非ともコストカットのための参考になれば幸いです。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)