こんにちは。AWS CLIが好きな福島です。
はじめに
AutoScalingは、負荷に応じてEC2をスケーリングすることが可能です。 また、スケーリングポリシーでスケーリングする基準を設定することができ、 デフォルトでは、以下のメトリクスを利用することができます。
①ASGAverageCPUUtilization—Auto Scaling グループの平均 CPU 使用率。
②ASGAverageNetworkIn—Auto Scaling グループがすべてのネットワークインターフェイスで受信したバイトの平均数。
③ASGAverageNetworkOut—Auto Scaling グループがすべてのネットワークインターフェイスで送信したバイトの平均数。
④ALBRequestCountPerTarget—Application Load Balancer ターゲットグループ内のターゲットごとに完了したリクエスト数。
◆ターゲット追跡スケーリングポリシー Amazon EC2 Auto Scaling https://docs.aws.amazon.com/ja_jp/autoscaling/ec2/userguide/as-scaling-target-tracking.html#available-metrics
例えば、ASGAverageCPUUtilizationを利用し、Auto Scaling グループの平均 CPU 使用率が70%となるように スケーリングする、とスケーリングポリシーを設定することが可能です。
ただ、中には上記以外のメトリクスをスケーリングの基準にしたい場合があるかと存じます。
ということで、今回はデフォルト以外のメトリクス(カスタムメトリクス)を使ったスケーリングポリシーの設定方法をブログに記載いたします。
注意点
注意点として、カスタムメトリクスを使いスケーリングポリシーを作成する場合、AWS CLIまたはSDKを使用する必要があります。 マネージメントコンソールからでは、デフォルトで利用できるメトリクスを使ったスケーリングポリシーの作成しかできません。
ターゲット追跡スケーリングポリシーでは、定義済みのメトリクスまたはカスタマイズされたメトリクスを使用できます。
~中略~
カスタマイズされたメトリクスを指定することで、他の使用可能な Amazon CloudWatch メトリクスまたは CloudWatch の独自のメトリクスを選択できます。 AWS CLIまたは SDK を使用して、カスタマイズされたメトリクスでターゲット追跡ポリシーを作成します。
Amazon EC2 Auto Scaling のターゲット追跡スケーリングポリシー - Amazon EC2 Auto Scaling (日本語)
カスタムメトリクスの設定
今回は、EC2のメモリ使用率を基にスケーリングできるようにいたします。
ということで、まずは、メモリ使用率を取得するためにCloudWatchメトリクスの設定を行います。 CloudWatchAgentの導入などは割愛しますが、設定は以下の通り行います。
設定ファイル:/opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.json
{ "metrics": { "append_dimensions": { "ImageId": "${aws:ImageId}", "InstanceId": "${aws:InstanceId}", "InstanceType": "${aws:InstanceType}", "AutoScalingGroupName": "${aws:AutoScalingGroupName}" }, "aggregation_dimensions": [["AutoScalingGroupName"]], "metrics_collected": { "mem": { "measurement": [ "mem_used_percent" ], "metrics_collection_interval": 60 } } } }
ポイントは、以下の2点です。
"AutoScalingGroupName": "${aws:AutoScalingGroupName}"
append_dimensionsの中に上記を設定することで、取得するメトリクスにAutoScalingという項目(dimensions)を追加することが可能です。 簡単に言うと、コンソールで以下の通り、表示することができるという訳です。
"aggregation_dimensions": "AutoScalingGroupName",
まず、aggregation_dimensionsについてですが、ドキュメントには以下の通り記載されています。
aggregation_dimensions – オプション.収集されたメトリクスが集計されるディメンションを指定します。 例えば、AutoScalingGroupName ディメンションでメトリクスをロールアップした場合、 各 Auto Scaling グループ内のすべてのインスタンスのメトリクスが集約され、全体として参照できるようになります。
CloudWatch エージェント設定ファイルを手動で作成または編集する - Amazon CloudWatch
今回は、「aggregation_dimensions」に「AutoScalingGroupName」と指定しているため、 AutoScalingGroupNameの値が同一のメトリクス値を集約します。
要は、AutoScaling内に存在する全EC2のメモリの平均を見れるメトリクスが作れる(以下のイメージ)という訳です。
カスタムメトリクスの設定が完了したら、AMIを取得し、起動テンプレートとAutoScalingグループを作成します。 ※詳細な手順は割愛します。
スケーリングポリシーの設定
カスタムメトリクスの設定が完了したら、スケーリングポリシーの設定を行います。 冒頭にも記載しましたが、AWS CLIまたはSDKを利用する必要があります。
設定ファイルの作成
まずは、以下の通り、ファイルを作成します。 以下は、testというAutoScaling内の全EC2の平均メモリ使用率が10%になるようにスケーリングする設定となります。
ファイル名:config.json
{ "TargetValue":10, "CustomizedMetricSpecification":{ "MetricName":"mem_used_percent", "Namespace":"CWAgent", "Dimensions":[ { "Name":"AutoScalingGroupName", "Value":"test" } ], "Statistic":"Average", "Unit":"Percent" } }
基本は、環境に合わせて、TargetValueおよびValueの値を変更するだけで使えるかと存じます。
スケーリングポリシーの設定
以下のCLIを実行すれば、スケーリングポリシーの設定が可能です。 今回は、
- ポリシー名(--policy-name):memory-10-target-tracking-scaling-policy
- AutoScalingグループ名(--auto-scaling-group-name):test
- ポリシータイプ(--policy-typ):ターゲット追跡スケーリング
としています。
aws autoscaling put-scaling-policy \ --policy-name memory-10-target-tracking-scaling-policy \ --auto-scaling-group-name test \ --policy-type TargetTrackingScaling \ --target-tracking-configuration file://config.json
これを実行すると、以下の通り、設定されます。
動作確認
今回はメモリの負荷を上げ、EC2がスケーリングされるか、確認します。 AutoScaling内のEC2にログインし、以下のコマンドを実行します。
/dev/null < $(yes)
複数実行したい場合は、以下のようにバックグラウンドで実行します。
/dev/null < $(yes) & /dev/null < $(yes) & /dev/null < $(yes) &
バックグラウンドの処理は、以下のコマンドで確認できます。
jobs
また、kiiコマンドの引数に%とjobsの結果で表示される番号を指定することで、処理を停止することができます。
kill %[番号]
今回試したところ、いい感じのグラフが取れたため、貼り付けておきます。 青色が集約したメトリクスとなり、オレンジと赤色がAutoScaling内に存在するEC2単位のメトリクスになります。
EC2(オレンジ色)に負荷をかけ続けていたところ、EC2(赤色)が起動し、 集約したメトリクス(青色)が半分になっていることが分かります。
終わりに
今回は、カスタムメトリクス(メモリ使用率)を使い、スケーリングポリシーを作成してみました。 どなたかのお役に立てれば幸いです。