EC2のAutoscalingをいろいろ試す
いろいろ試してみましょう
nginxを入れたEC2をテンプレートにして試してみます
AZの分散
ASGを使用すると立ち上がる複数AZに分散してくれます。
2AZでキャパシティを2にしてみました。
describe-instancesで調べるとこの通り
$ aws ec2 describe-instances --filters "Name=tag:aws:autoscaling:groupName,Values=test-ubuntu-autoscaling" --query 'Reservations[*].Instances[*].[InstanceId,Placement.AvailabilityZone]' --output text
i-0ffc6697666900dad ap-northeast-1a
i-09ad35300980ee8f1 ap-northeast-1c
分散しています。
※ASGの名前はtest-ubuntu-autoscaling
としています
AZの分散②
キャパシティを4にしてみました
$ aws ec2 describe-instances --filters "Name=tag:aws:autoscaling:groupName,Values=test-ubuntu-autoscaling" --query 'Reservations[*].Instances[*].[InstanceId,Placement.AvailabilityZone]' --output text
i-0a614438b0a04d942 ap-northeast-1a
i-0ffc6697666900dad ap-northeast-1a
i-052cb639de5ca575e ap-northeast-1c
i-09ad35300980ee8f1 ap-northeast-1c
6にしてみました
$ aws ec2 describe-instances --filters "Name=tag:aws:autoscaling:groupName,Values=test-ubuntu-autoscaling" --query 'Reservations[*].Instances[*].[InstanceId,Placement.AvailabilityZone]' --output text
i-079559e0e7ac38444 ap-northeast-1a
i-0a614438b0a04d942 ap-northeast-1a
i-0ffc6697666900dad ap-northeast-1a
i-052cb639de5ca575e ap-northeast-1c
i-09ad35300980ee8f1 ap-northeast-1c
i-01cc8272534d9d139 ap-northeast-1c
分散されていますね
インスタンスの更新をする
2台NameタグがついていないEC2がありました。
$ aws ec2 describe-instances --filters "Name=tag:aws:autoscaling:groupName,Values=test-ubuntu-autoscaling" --query 'Reservations[*].Instances[*].[InstanceId,Placement.AvailabilityZone,Tags[?Key==`Name`].Value | [0]]' --output text
i-079559e0e7ac38444 ap-northeast-1a ASG-instance
i-0a614438b0a04d942 ap-northeast-1a ASG-instance
i-0ffc6697666900dad ap-northeast-1a None
i-052cb639de5ca575e ap-northeast-1c ASG-instance
i-09ad35300980ee8f1 ap-northeast-1c None
i-01cc8272534d9d139 ap-northeast-1c ASG-instance
2台は古いテンプレートで起動していたためでしょう。
インスタンスの更新を行い、最新のテンプレートを適用させます。
項目がたくさんあるので、いったん無視してデフォルトでいきましょう
インスタンスの更新をする②
ウォームアップという項目を見逃していますね。
インスタンスのウォームアップとは、新しいインスタンスの状態が InService に変更されてから、トラフィックを受信できるようになるまでの期間です。インスタンスの更新中、インスタンスがヘルスチェックに合格した場合、新しく起動されたインスタンスが正常であると判断した後、Amazon EC2 Auto Scaling はすぐに次のインスタンスの置き換えに進みません。ウォームアップ期間を待機してから、次のインスタンスの置き換えに進みます。これは、アプリケーションがトラフィックの処理を開始する前のアプリケーション自体の初期化に時間がかかるという場合に役立ちます。
デフォルトだと5分待つ設定になっていました。
検証にしては時間がかかりすぎなので30秒にしてみます。
更新中、更新後の結果はインスタンスの更新
タブから見れます
インスタンスの更新をする③
結果をみると
$ aws ec2 describe-instances --filters "Name=tag:aws:autoscaling:groupName,Values=test-ubuntu-autoscaling" --query 'Reservations[*].Instances[*].[InstanceId,Placement.AvailabilityZone,State.Name,Tags[?Key==`Name`].Value | [0]]' --output text
i-079559e0e7ac38444 ap-northeast-1a running ASG-instance
i-0a614438b0a04d942 ap-northeast-1a running ASG-instance
i-0ffc6697666900dad ap-northeast-1a terminated None
i-0f14c863bd23e7ca8 ap-northeast-1a running ASG-instance
i-08540434d5751e928 ap-northeast-1c running ASG-instance
i-052cb639de5ca575e ap-northeast-1c running ASG-instance
i-09ad35300980ee8f1 ap-northeast-1c terminated None
i-01cc8272534d9d139 ap-northeast-1c running ASG-instance
古いテンプレートを使用していたEC2が置き換わっています。
キャパシティを操作する(awscli)
コンソールからキャパシティを操作するのは手間です。
awscliで試しましょう
aws autoscaling update-auto-scaling-group \
--auto-scaling-group-name test-ubuntu-autoscaling \
--max-size 1 \
--min-size 1 \
--desired-capacity 1
runningのインスタンスだけ出力してみます。
$ aws ec2 describe-instances --filters "Name=tag:aws:autoscaling:groupName,Values=test-ubuntu-autoscaling" "Name=instance-state-name,Values=running" --query 'Reservations[*].Instances[*].[InstanceId]' --output text
i-08540434d5751e928
1台だけですね。
ASGのアクティビティの確認
アクティビティ
タブから過去の履歴が確認出来ます。
この内容をSNSから通知することも可能です
配分戦略(オンデマンド)
配分戦略というものがあります。
戦略によって出てくるインスタンスタイプが変わります。
オンデマンドの場合は以下の2つ
- lowest-price
- 最低価格のインスタンスタイプを自動でデプロイする
- prioritized
- 起動テンプレートに設定されている優先度の高いインスタンスが起動される
配分戦略(オンデマンド)②
インスタンスタイプ・優先度の選択を以下のようにしました。
上にいくほど優先されます、t3.largeが一番優先されるはず。
- t3.large
- t3.medium
- t3.small
lowest-price
だとt3.small
、prioritized
だとt3.large
が起動されるはずです。
配分戦略(オンデマンド)③
キャパシティは3とします。
lowest-priceの場合
$ aws ec2 describe-instances \
> --filters "Name=tag:aws:autoscaling:groupName,Values=test-ubuntu-autoscaling" \
> "Name=instance-state-name,Values=running" \
> --query 'Reservations[*].Instances[*].[InstanceId,InstanceType]' \
> --output text
i-0e451728e8b9c77fb t3.small
i-00721f88797c98db1 t3.small
i-08540434d5751e928 t3.small
※ここでキャパシティを0にし、再度3に戻しました。テンプレートに変更ないとインスタンスの更新されないからなあ
prioritizedの場合
$ aws ec2 describe-instances \
> --filters "Name=tag:aws:autoscaling:groupName,Values=test-ubuntu-autoscaling" \
> "Name=instance-state-name,Values=running" \
> --query 'Reservations[*].Instances[*].[InstanceId,InstanceType]' \
> --output text
i-0ede343858deef940 t3.large
i-06eec7e7a7c21ebbe t3.large
i-0bd2ff20e049e8386 t3.large
想定通りになってよかったです。
配分戦略(オンデマンド)④
prioritized
は属性ベースでインスタンスタイプを選択する場合使用不可です。
優先順位決めないため?
スポットインスタンスを使用する
スポットインスタンスを立てることも出来ます。
オンデマンドインスタンスとの割合を指定する形式です。
キャパシティを3として、いくつかのパターンを試してみます。
すべてスポットインスタンスにする
$ aws ec2 describe-instances \
> --filters "Name=tag:aws:autoscaling:groupName,Values=test-ubuntu-autoscaling" \
> "Name=instance-state-name,Values=running" \
> --query 'Reservations[*].Instances[*].[InstanceId,InstanceLifecycle]' \
> --output text
i-03c84989321fd3011 spot
i-0387dd1fec23d058a spot
i-0dffc5d5d279d5d9d spot
1:2の割合でオンデマンド・スポットインスタンスを立てる
$ aws ec2 describe-instances \
> --filters "Name=tag:aws:autoscaling:groupName,Values=test-ubuntu-autoscaling" \
> "Name=instance-state-name,Values=running" \
> --query 'Reservations[*].Instances[*].[InstanceId,InstanceLifecycle]' \
> --output text
i-0270b131f0a5b23f3 spot
i-001d9b02e5320c85b None
i-03355263ec5ecb9f2 spot
オンデマンドのベース起動数を1とし、1:1の割合でオンデマンド・スポットインスタンスを立てる
$ aws ec2 describe-instances \
> --filters "Name=tag:aws:autoscaling:groupName,Values=test-ubuntu-autoscaling" \
> "Name=instance-state-name,Values=running" \
> --query 'Reservations[*].Instances[*].[InstanceId,InstanceLifecycle]' \
> --output text
i-074e0f8ba98e4a756 None
i-06b00312857967ba3 None
i-006f611217a558d52 spot
ドキュメントはここ
オンデマンドベース容量を有効にすると、指定した数のオンデマンドインスタンスが確実に立ち上がります。
オプションで、開始時のオンデマンドインスタンスのベース数を指定することもできます。オンデマンドインスタンスのベースキャパシティを指定すると、Amazon EC2 Auto Scaling は、グループがスケールアウトする際にオンデマンドインスタンスのベースキャパシティが起動された後までは、スポットインスタンスの起動を待機します。