ECS の AutoScaling を設定するスクリプト
前提
AWS CLI がインストールされている
jq がインストールされている
スケーリングポリシー名は ecs-service-scaling を使う
スケーリングポリシー・タイプは TargetTrackingScalingを使う
概要
config.json に設定を記述する
ecs-autoscaling スクリプトで json を読取る
AWS CLI でスケーリングポリシーをサービスに適用する
ポリシーは policy.json に記述する
スケーリングポリシー設定
AutoScaling のポリシーを設定する
code:policy.json
{
"TargetValue": 60.0,
"PredefinedMetricSpecification": {
"PredefinedMetricType": "ECSServiceAverageCPUUtilization"
}
}
ターゲット設定
対象のサービスとそのキャパシティの範囲を設定する
code:config.json
{
"cluster": "example-cluster",
"service": "web",
"min_capacity": 2,
"max_capacity": 10
}
スクリプト
show は現在設定を標準出力に出力する
apply で設定ファイルの内容をサービスに適用する
code:bin/ecs-autoscaling(bash)
set -eu -o pipefail
ProgName=$(basename $0)
sub_help() {
echo "Usage: $ProgName <subcommand>"
echo ""
echo "Subcommands:"
echo " show"
echo " apply"
echo ""
echo "Example:"
echo " $ProgName show target"
echo " $ProgName show policy"
echo " $ProgName apply <path>"
echo ""
exit 1
}
sub_show() {
Type=${1:-""}
case $Type in
target)
aws application-autoscaling describe-scalable-targets --service-namespace ecs
;;
policy)
aws application-autoscaling describe-scaling-policies --service-namespace ecs
;;
*)
echo "Usage: $ProgName show {target|policy}"
echo ""
;;
esac
}
as_policy_name="ecs-service-scaling"
sub_apply() {
set -x
path=${1:-""}
echo "path is required"
exit 1
fi
cluster=$(jq -r '.cluster' $path/config.json)
service=$(jq -r '.service' $path/config.json)
min_capacity=$(jq -r '.min_capacity' $path/config.json)
max_capacity=$(jq -r '.max_capacity' $path/config.json)
aws application-autoscaling register-scalable-target \
--service-namespace ecs \
--resource-id service/$cluster/$service \
--scalable-dimension ecs:service:DesiredCount \
--min-capacity $min_capacity \
--max-capacity $max_capacity
aws application-autoscaling put-scaling-policy \
--service-namespace ecs \
--resource-id service/$cluster/$service \
--scalable-dimension ecs:service:DesiredCount \
--policy-name $as_policy_name \
--policy-type TargetTrackingScaling \
--target-tracking-scaling-policy-configuration file://$path/policy.json
}
subcommand=${1:-""}
case $subcommand in
"" | "-h" | "--help" | "help")
sub_help
;;
*)
shift
sub_${subcommand} $@
echo "Error: '$subcommand' is not a known subcommand." >&2
echo " Run '$ProgName --help' for a list of known subcommands." >&2
exit 1
fi
;;
esac
GitHub Actions での使い方の例
設定ファイル ( config.json, policy.json ) の格納場所が以下のようになっていると仮定する
code:_
ecs-autoscaling/
dev/
web/
batch/
stg/
web/
batch/
prd/
web/
batch/
code:deply.yml
- name: Apply AutoScaling policy
run: |
bin/ecs-autoscaling apply ecs-autoscaling/${{ matrix.env }}/${{ matrix.service }}
bin/ecs-autoscaling show target
bin/ecs-autoscaling show policy