Open14

EC2のAutoscalingをいろいろ試す

not75743not75743

AZの分散

ASGを使用すると立ち上がる複数AZに分散してくれます。
https://docs.aws.amazon.com/ja_jp/autoscaling/ec2/userguide/auto-scaling-benefits.html#arch-AutoScalingMultiAZ

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としています

not75743not75743

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

分散されていますね

not75743not75743

インスタンスの更新をする

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台は古いテンプレートで起動していたためでしょう。
インスタンスの更新を行い、最新のテンプレートを適用させます。
項目がたくさんあるので、いったん無視してデフォルトでいきましょう

not75743not75743

インスタンスの更新をする②

ウォームアップという項目を見逃していますね。

インスタンスのウォームアップとは、新しいインスタンスの状態が InService に変更されてから、トラフィックを受信できるようになるまでの期間です。インスタンスの更新中、インスタンスがヘルスチェックに合格した場合、新しく起動されたインスタンスが正常であると判断した後、Amazon EC2 Auto Scaling はすぐに次のインスタンスの置き換えに進みません。ウォームアップ期間を待機してから、次のインスタンスの置き換えに進みます。これは、アプリケーションがトラフィックの処理を開始する前のアプリケーション自体の初期化に時間がかかるという場合に役立ちます。

デフォルトだと5分待つ設定になっていました。
検証にしては時間がかかりすぎなので30秒にしてみます。
更新中、更新後の結果はインスタンスの更新タブから見れます

not75743not75743

インスタンスの更新をする③

結果をみると

$ 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が置き換わっています。

https://docs.aws.amazon.com/ja_jp/autoscaling/ec2/userguide/asg-instance-refresh.html

not75743not75743

キャパシティを操作する(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台だけですね。

not75743not75743

配分戦略(オンデマンド)

配分戦略というものがあります。
戦略によって出てくるインスタンスタイプが変わります。
オンデマンドの場合は以下の2つ

  • lowest-price
    • 最低価格のインスタンスタイプを自動でデプロイする
  • prioritized
    • 起動テンプレートに設定されている優先度の高いインスタンスが起動される

https://docs.aws.amazon.com/ja_jp/autoscaling/ec2/userguide/ec2-auto-scaling-mixed-instances-groups.html

not75743not75743

配分戦略(オンデマンド)②

インスタンスタイプ・優先度の選択を以下のようにしました。
上にいくほど優先されます、t3.largeが一番優先されるはず。

  • t3.large
  • t3.medium
  • t3.small

lowest-priceだとt3.smallprioritizedだとt3.largeが起動されるはずです。

not75743not75743

配分戦略(オンデマンド)③

キャパシティは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

想定通りになってよかったです。

not75743not75743

配分戦略(オンデマンド)④

prioritizedは属性ベースでインスタンスタイプを選択する場合使用不可です。
優先順位決めないため?

not75743not75743

スポットインスタンスを使用する

スポットインスタンスを立てることも出来ます。
オンデマンドインスタンスとの割合を指定する形式です。
キャパシティを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
not75743not75743

ドキュメントはここ
https://docs.aws.amazon.com/ja_jp/autoscaling/ec2/userguide/ec2-auto-scaling-mixed-instances-groups.html

オンデマンドベース容量を有効にすると、指定した数のオンデマンドインスタンスが確実に立ち上がります。

オプションで、開始時のオンデマンドインスタンスのベース数を指定することもできます。オンデマンドインスタンスのベースキャパシティを指定すると、Amazon EC2 Auto Scaling は、グループがスケールアウトする際にオンデマンドインスタンスのベースキャパシティが起動された後までは、スポットインスタンスの起動を待機します。