SQSメッセージの数に応じてスポットインスタンス数を調整したい。
SQSの作成
SQSキューの作成
$ aws sqs create-queue --queue-name YOUR_QUEUE_NAME
{
"QueueUrl": "https://ap-northeast-1.queue.amazonaws.com/xxxxxxxxxxxx/YOUR_QUEUE_NAME"
}
CloudWatchAlarmの設定
CloudWatchコンソールからApproximateNumberOfMessagesVisible
メトリクスを選択。
アラームの閾値は0以上として設定し、メトリクス名をつけて作成。(YOUR_METRICS_NAME
とする。)
※ アラームの閾値はいくつで設定しても良いが、ここで設定した数値以下の値をAutoScalingのスケーリングポリシーで取得することはできない。
SpotFleetの設定
リクエストの作成
EC2コンソールのナビゲーションペインから「スポットリクエスト」を選択し、[スポットインスタンスのリクエスト]を選択。
※上記のリクエスト画面は最新版ではない。
※最新版では「ターゲット容量を維持する」にチェックを入れた上で合計ターゲット容量を0に設定する。(そうでないと0を設定できない。)
追加設定から「EBS最適化インスタンスを起動」や「インスタンスストアのアタッチ」が選択できる。
セキュリティグループやIAMインスタンスプロフィールを適当に設定する。
作成後、タブから「AutoScaling」を選択。
スケーリングポリシーを設定
ポリシートリガーにYOUR_METRICS_NAME
を指定し。
容量の変更から、段階的なインスタンス数を選択。
ここでYOUR_METRICS_NAME
に指定するキューメッセージするに基づくスケーリングのルールを指定できる。
(Option)インスタンスの終了2分前イベントを受け取る
CloudWatchEventsから以下を設定する。
イベントソースの設定
イベントパターンを選択し、サービス名EC2
、イベントタイプEC2 Spot Instance Interrupt Warning
を指定する。
ターゲットの設定
ここで、イベント取得時に起動したいlambdaやSNSを指定する。
なお、イベント発生時に受け取ることができるメッセージは以下。
{
"version": "0",
"id": "12345678-1234-1234-1234-123456789012",
"detail-type": "EC2 Spot Instance Interruption Warning",
"source": "aws.ec2",
"account": "xxxxxxxxxxxx",
"time": "yyyy-mm-ddThh:mm:ssZ",
"region": "ap-northeast-1",
"resources": [
"arn:aws:ec2:ap-northeast-1:xxxxxxxxxxxx:instance/i-1234567890abcdef0"
],
"detail": {
"instance-id": "i-1234567890abcdef0",
"instance-action": "action"
}
}
終了予定のインスタンスはdetail
内のinstance-id
。
テスト
AutoScalingのテスト
SQSキューにメッセージをエンキューする。
$ aws sqs send-message --queue-url https://sqs.ap-northeast-1.amazonaws.com/xxxxxxxxxxxx/YOUR_QUEUE_NAME --message-body "testMessage"
CloudWatchAlarmからApproximateNumberOfMessagesVisible
メトリクスを確認する。
しばらくしてEC2コンソールからスポットインスタンスの数を確認。適切にスケールしていれば成功。
(Option)通知のテスト
キューを取得・削除する。
$ aws sqs receive-message --queue-url https://sqs.ap-northeast-1.amazonaws.com/xxxxxxxxxxxx/YOUR_QUEUE_NAME
$ aws sqs delete-message --queue-url https://sqs.ap-northeast-1.amazonaws.com/xxxxxxxxxxxx/YOUR_QUEUE_NAME --receipt-handle "上記返り値のReceiptHandle"
数分後、メトリクスの値が変わり、インスタンスがスケールインする2分前にイベントが発生。ターゲットに指定したlambdaやSNSや発火する。
- 同時に2つのインスタンスが2分前イベントを発生させた場合でも2通のイベントを取得できることは確認済。