[AWS] SubnetでIPアドレスが枯渇した場合のEC2 ASG挙動について
目的
EC2 Auto Scaling Groupを利用時に、あるSubnetでIPアドレスが枯渇する可能性があるとき、それをどのように監視、検知できるかを知りたいと考えていました。そのため、まずはIPアドレスが枯渇したとき、どのような挙動となるのかを調査しました。
最小のSubnetの作成
最小のSubnetは/28です。このとき利用可能なIPアドレスの数は、AWS上ではこのうち、5つのIPアドレスが予約されており、11個がユーザ利用可能なIPアドレスとなります。AWS Management Console上でSubnetを見ると、利用可能なIPアドレスの数がわかります。作成直後のIPを利用していない状態では11個が利用可能となっています。
Subnetの利用可能なIPアドレス数が表示される
ENI作成時のSubnet IP枯渇
ここから、まずはIPを枯渇させるため、ENIを12個作ろうとしてみます。CLIでENIを作ることができるのでCloudShellで実行していきます。(aws ec2 create-network-interface)
12個目で失敗しました。そのときのエラーは下記になります。IPアドレスが不足していることがメッセージで出力されていますね。
[cloudshell-user@ip-10-130-60-215 ~]$ aws ec2 create-network-interface --subnet-id subnet-04b071924b103f6c5 --description "my network interface" --groups sg-0377e82ddc4094200
An error occurred (InsufficientFreeAddressesInSubnet) when calling the CreateNetworkInterface operation: The specified subnet does not have enough free addresses to satisfy the request.
EC2作成時のSubnet IP枯渇
さて、今度はEC2インスタンス作成を単体で失敗させてみます。今回はManagment Console上で起動します。
Management Console上でのEC2インスタンス作成がIPアドレス枯渇で失敗した場合
エラーがThere are not enough free addresses in subnet 'subnet-04b071924b103f6c5' to satisfy the requested number of instances.
となっていて、ENIの作成でエラーではなく、RunInstancesをしようとした上で、要求されたEC2インスタンスの数を満たすために必要なIPアドレスが足らないと言っています。事前チェックをしているのかな。
Auto Scaling時のSubnet IP枯渇
では、次はEC2 Auto Scalingの挙動について確認してみます。
単一Subnetで起動する場合
まずは、単一Subnetで、1つだけIPアドレスを利用可能にして、Desiredを2でインスタンス作成を失敗させてみます。この場合のエラーは、EC2インスタンスの場合と同様です。
ある一つのSubnet上でAuto Scaling GroupによるEC2インスタンス作成がIPアドレス枯渇で失敗した場合
CloudTrailで見ると、RunaInstancesをしようとして、失敗していることがわかります。
複数Subnetで起動する設定にし、一つが枯渇、一つがIPが空いている場合
最後に、EC2 Auto Scaling Groupに対して、AZの異なる複数Subnetを設定した場合、どのようにSubnetを選択するのかどうかを確認したいと思います。
今、利用可能なIPアドレスの数は下記のような状況になっています。
Subnet | AZ | 利用可能なIPアドレス数 |
---|---|---|
private-subnet | us-west-2b | 1 |
private-subnet-02 | us-west-2c | 11 |
AZの異なる複数Subnetへの配置設定として、Auto Scaling Groupには、Availability Zone distributionという設定があります。
まずは、この設定をBalanced only
に設定します。
private-subnet
とprivate-subnet-02
は別AZなため、これによって、バランスするようにAuto Scaling Groupが動くはずです。前回同様、まずはDesiredが2のままで2つのサブネットを用意すると、それぞれに1つずつ、EC2インスタンスが立ち上がります。
ここで、Desiredを4にするとどうなるでしょうか。この場合、下記の通り、インスタンス作成に失敗し続け、インスタンス数は3のままです。private-subnet-02
の方はIPアドレスが空いていますが、Availability Zone distribution
の設定がBalanced only
としているので、バランスが強制されているようです。
では、Availability Zone distributionをBalanced best effort
に変更してみます。
Activityを見てみると、us-west-2c
に立ち上げた上で、Failedのメッセージとして、バランスができなかったけど、Desiredの4にするために偏らせた状態となっている旨のメッセージがFailedとして出ています。
IPアドレスを空けると自動的にバランスするのか確認しますと、ちゃんとしてくれていることが確認できました。
バランスができなかった場合の失敗通知
通常、EC2 Auto Scalingのインスタンス起動失敗は、下記の通り通知が可能です。
Availability Zone distributionをBalanced best effort
にしたとき、バランスできなかったけど、別AZでEC2インスタンスが起動成功し、必要な分のインスタンス数が立ち上げられている場合はどうなるのでしょうか。
下記の通り、この場合でも、起動失敗で通知ができました。というか挙動的には、何度も何度もバランスをさせようとしてRunInstances
を実行してその度にエラーを通知することになるようで、大量のメールが飛んで来てしまいました。。。
もしも、このようなケースを許容したいような場合には、通知の仕方は少し特殊にしないといけないかもしれないですね。
まとめ
EC2 Auto Scaling GroupでSubnetのIPアドレス枯渇時の挙動を確認しました。また、通常の起動失敗時と同様に通知をできることが確認できました。ただ、一方で、どのAZにデプロイされるかをそこまで気にしないような場合、検知・通知の仕方は多少工夫が必要そうです。
Discussion