LoginSignup
0
0

More than 3 years have passed since last update.

SQSメッセージ数に応じてSpotFleetでインスタンスをAutoScalingする。

Last updated at Posted at 2020-01-25

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コンソールのナビゲーションペインから「スポットリクエスト」を選択し、[スポットインスタンスのリクエスト]を選択。
image.png

※上記のリクエスト画面は最新版ではない。
※最新版では「ターゲット容量を維持する」にチェックを入れた上で合計ターゲット容量を0に設定する。(そうでないと0を設定できない。)

追加設定から「EBS最適化インスタンスを起動」や「インスタンスストアのアタッチ」が選択できる。
セキュリティグループやIAMインスタンスプロフィールを適当に設定する。

作成後、タブから「AutoScaling」を選択。

image.png

スケーリングポリシーを設定

ポリシートリガーに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通のイベントを取得できることは確認済。
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0