AWS SQS をキューサービスとして利用し、ワーカー処理は AWS ECS のコンテナで実行する際に、SQS のキューの数に応じてオートスケーリングさせたい場合の設定方法メモです。つまり、キューがいっぱい積まれたら ECS のタスクを増やすし、減って来たらタスクを終了させるということです。とても簡単に設定できます。

今回の設定方法は AWS サポートの方に親切にアドバイスいただきました。とても分かりやすいサポートで感謝しております。

ターゲット追跡スケーリングポリシーの設定

ECS のサービスではオートスケーリングの設定が可能ですが、今回利用するターゲット追跡スケーリングポリシーはコンソール画面からは設定ができません。aws CLI コマンドを利用します。

aws application-autoscaling put-scaling-policy \
  --policy-name <ポリシー名> \
  --service-namespace ecs \
  --resource-id service/<クラスタ名>/<サービス名> \
  --scalable-dimension ecs:service:DesiredCount \
  --policy-type TargetTrackingScaling \
  --target-tracking-scaling-policy-configuration file://target-tracking.json 

target-tracking.json の例です。今回は適当に TargetValue に 5 を指定しています。これは SQS のキュー数( ApproximateNumberOfMessagesVisible )が平均で 5 になるように調整してくれるという意味です。ここは状況や要件に応じて色々と調整する必要があります。

{
  "TargetValue": 5,
  "CustomizedMetricSpecification": {
    "MetricName": "ApproximateNumberOfMessagesVisible",
    "Namespace": "AWS/SQS",
    "Dimensions": [
      {
        "Name": "QueueName",
        "Value": "<SQS キュー名>"
      }
    ],
    "Statistic": "Average",
    "Unit": "Count"
  },
  "ScaleOutCooldown": 300,
  "ScaleInCooldown": 300,
  "DisableScaleIn": false
}

上記設定で実行をすると ECS のコンソール画面にも設定値が表示されます。

そして CloudWatch Alarm もスケールイン・スケールアウト両方のアラームが自動で作成されます。便利ですね。

ちなみに、自動作成されるアラームは 3 data points / 15 data points と設定されていて、これを手動で編集することは推奨されていないようです。

ターゲット追跡スケーリングポリシー用に サービスの Auto Scaling によって管理されている CloudWatch アラームを編集または削除しないでください。スケーリングポリシーを削除すると、サービスの Auto Scaling によって自動的にアラームが削除されます。