🐻

ブルー/グリーンデプロイでALBRequestCountPerTargetをターゲット値にしたスケーリングをする【くま】

に公開

ブルー/グリーンデプロイタイプでは、ターゲット追跡スケーリングポリシーの ALBRequestCountPerTarget メトリクスはサポートされません。
引用: ターゲットメトリクスを使用して Amazon ECS サービスをスケールする - Amazon Elastic Container Service

残念ながらサポートされていなかったので、
カスタムメトリクスを作成して、ブルー/グリーンデプロイでもALBRequestCountPerTargetに応じたスケーリングをしました。

ブルー/グリーンデプロイでのALBRequestCountPerTarget

  • ブルー/グリーンデプロイでは、ALBに2つのターゲットグループを登録し、トラフィックの送信先を切り替えることで新しいバージョンをリリースします

  • ALBRequestCountPerTargetは、ターゲット単位のリクエスト数を表すメトリクスであり、利用時には 対象のターゲットグループを明示的に指定する必要がある

    ALBRequestCountPerTarget メトリクスを使用するには、ResourceLabel パラメータを指定して、メトリクスに関連付けられているロードバランサーターゲットグループを識別する必要があります。
    Amazon EC2 Auto Scaling のターゲットトラッキングスケーリングポリシー - Amazon EC2 Auto Scaling

  • ブルー/グリーンデプロイの場合に、ターゲットグループの切り替えの際に、メトリクスの参照先も切り替える必要がある。が、自動で切り替えてはくれない、、。

カスタムメトリクスでの対応

  • 2つのターゲットグループそれぞれのALBRequestCountPerTargetを足した値をカスタムメトリクスとして作成。その値を参照し、オートスケーリングする用設定。
aws cliでの設定
configForRequestCountTargetTracking=$(cat << EOS
{
  "TargetValue": 500,
  "CustomizedMetricSpecification": {
    "Metrics": [
      # 以下2つの合計
      {
        "Id": "expr1m1",
        "Expression": "m0 + m1",
        "Label": "request-count-per-target-sum",
        "ReturnData": true
      },
      # 1つ目のターゲットグループのRequestCountPerTarget
      {
        "Id": "m0",
        "MetricStat": {
          "Metric": {
            "Namespace": "AWS/ApplicationELB",
            "MetricName": "RequestCountPerTarget",
            "Dimensions": [
              {
                "Name": "TargetGroup",
                "Value": "${TARGET_GROUP_ARN_NAME_1}"
              }
            ]
          },
          "Stat": "Sum"
        },
        "ReturnData": false
      },
    # 2つ目のターゲットグループのRequestCountPerTarget
      {
        "Id": "m1",
        "MetricStat": {
          "Metric": {
            "Namespace": "AWS/ApplicationELB",
            "MetricName": "RequestCountPerTarget",
            "Dimensions": [
              {
                "Name": "TargetGroup",
                "Value": "${TARGET_GROUP_ARN_NAME_2}"
              }
            ]
          },
          "Stat": "Sum"
        },
        "ReturnData": false
      }
    ]
  },
  "ScaleInCooldown": ${REQUEST_SCALE_IN_COOLDOWN},
  "ScaleOutCooldown": ${REQUEST_SCALE_OUT_COOLDOWN}
}
EOS
)

aws application-autoscaling put-scaling-policy \
  --service-namespace ecs \
  --resource-id service/${ECS_CLUSTER_NAME}/${ECS_SERVICE_NAME} \
  --scalable-dimension ecs:service:DesiredCount \
  --policy-type TargetTrackingScaling \
  --policy-name "target-tracking-request" \
  --region "${AWS_REGION}" \
  --target-tracking-scaling-policy-configuration "${configForRequestCountTargetTracking}"

まとめ

  • カスタムメトリクスは便利。すごい。

参照

Discussion