ECSでスポットインスタンスの中断を自動でDraining出来るようになりました

ECSのアップデートでスポットインスタンスを利用したECSインスタンスが中断時に自動でDraining出来るようになりました!
2019.10.02

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

もこ@札幌オフィスです。

ECSのアップデートでスポットインスタンスを利用したECSインスタンスが中断時に自動でDraining出来るようになりました! Amazon ECS が ECS サービスを実行しているスポットインスタンスの自動ドレインをサポート

やってみた

ごく一般的なALB, ECS環境を作りました。(略)

接続環境は ALB → TargetGroup → EC2(Container) を想定しています。

Launch Templateを利用して数クリックでサクサクっとSpot Fleetを展開していきたいので、今回はLaunch Templateを使って行きます。

尚、環境構築はTerraformを利用しましたが、現時点で aws_spot_fleet_request を利用してLaunch Templateから起動することが出来なかったため、Spot Fleetの構築はマネジメントコンソールから行います。

EC2の設定

スポットインスタンスの中断時に自動でDrainingに変更するためにはECS_ENABLE_SPOT_INSTANCE_DRAINING=true/etc/ecs/ecs.config に記入する必要があります。

更新したユーザーデータの中身はこんな感じ。

インスタンスが起動するタイミングで設定します。

#!/bin/sh

echo ECS_CLUSTER=spot-ecs >> /etc/ecs/ecs.config
echo ECS_ENABLE_SPOT_INSTANCE_DRAINING=true >> /etc/ecs/ecs.config

Spot Fleetを作る

Launch Templateを利用して早速Spotインスタンスを作成します。

Spotの中断のテストを行いため、「ターゲット容量を維持する」にチェックを入れ、作成します。

Launch Templateが揃っていればマネジメントコンソールからでも数クリックでSpot Fleetを展開できて安全なSpot生活をすぐ始められるのは便利ですね!

数分待つとECSインスタンス一覧にEC2インスタンスが表示されます。

試しにNginxのコンテナを10個ほど起動するようにしました。 ターゲットグループはこんな感じ。

ALBのエンドポイントを叩いて正常にアクセスが出来るかを確認します。

Spot インスタンスを中断してみる

さて、本題です。

スポットリクエストから先ほど作成したSpot Fleetを選択し、ターゲット容量の変更からスポットインスタンスの中断のテストをしてみましょう。

スポットキャパシティーを1つ下げていきます!

ECSインスタンスが正常にDrainingになっているのを確認出来ます。

ターゲットグループもいい感じにコンテナを切り替えてくれています。

Spot FleetのイベントとECSのイベントはこんな感じで、 スポットインスタンスの中断をインスタンスに伝え、ECSがいい感じにコンテナをDrainingしているのを確認出来ます。

まとめ

Spot Fleet + オンデマンドインスタンス + ECSを利用することで安全に安く簡単にスポットインスタンス運用が可能になります!

正直簡単にできすぎてびっくりしています。

是非皆さんも用法・用量を守ってスポットインスタンスを正しく使ってみましょう!