AWSCDKデプロイ時のEIP制限エラー解決「The maximum number of addresses has been reached」の対処法と沼った話

環境

  • AWSCDK v2 (Typescript)
  • AWS(ECS、Fargate、VPC、ALB、RDS、S3)
  • Docker

概要

AWSCDKを用いてECSにDockerごとデプロイしている時に以下のエラーが発生。

Resource handler returned message: “The maximum number of addresses has been reached."

 (Service: Ec2, Status Code: 400~~(長いので省略)

 

このエラーについてAWS公式では以下のように書いてます。

 

[Problem] (問題)

パブリック NAT ゲートウェイに Elastic IP アドレスを割り当てようとすると、次のエラーが発生します。

The maximum number of addresses has been reached.
原因

そのリージョンのアカウントの Elastic IP アドレスの数のクォータに到達している。

 

解決策

Elastic IP アドレスのクォータに達した場合は、別のリソースに関連付けられている Elastic IP アドレスを解除することができます。または、Service Quotas コンソールを使用してElastic IPS クォータの増加をリクエストすることもできます

引用:https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/nat-gateway-troubleshooting.html#nat-gateway-troubleshooting-limits

 

このエラーは大雑把に訳すと以下のような意味合いで、新しくEIP追加できなくなっている状況とのこと。

 

あんた、このリージョンで使えるElastic IP (EIP) アドレスの上限数に達したで。追加するのは無理だよ

 

※AWS Elastic IP(EIP)アドレスというのは、インターネットからアクセスできるような固定のパブリックIPアドレスをインスタンスに設定できるAWSサービスです。

 

対策・確認事項

EIP上限値を上げる

これが一番簡単な対策。

増やせるのであればEIPの上限値を更に増やしちゃえばいい。

が、増やせばもちろんお金はかかるので、安直に増やせないのが現実。

私もこの点は最終奥義として温存。

Qiita

新しいEC2インスタンスを作って、ElasticIPを割り当てようとしたところ、IP アドレスを割り当てようとしてエラー…

Elastic IP アドレスを 1 つのインスタンスから別のインスタンスに迅速に再マッピングして、インスタンスやソフト…

 

使ってなさそうなEIPを削除する

次に検討することとしては、「使ってないEIPがあれば削除」すること。

もしかしたら削除し忘れている使用してないEIPがそのまま残ってるかもなので、一旦消せそうなのがないか確認してみます。

上限数の確認

まずは使用できる上限数の確認。

基本的にデフォルトの上限数は5個で、私の確認時も上限5個のでした。

※サービスクォータの確認方法

GMOクラウドアカデミー

AWSサービスクォータ (Service Quotas) と呼ばれるデフォルトの上限値を調べる方法を解説します。…

 

現在のEIP確認

次にAWSコンソール上のEC2→EIPから確認、または以下のコマンドにて使用しているEIPを確認。

aws ec2 describe-addresses --region ap-northeast-1 (東京リージョンの場合)

ここで上限(ここでは5個)になってしまっていたらEIPを削除するしかないんですが、なんと、、

使用しているEIPは3つしかない!!!!

なんでやねん、、、上限5個やろ、、

また、現状削除して良さそうなEIPはなくこちらの対応もできず、、。

 

私の場合の解決策

現状は以下の状況で、EIP上限に達していないのに上限数エラーが出て困っている。

  • リージョン内のEIP数は3つ
  • リージョン内のEIP上限数は5つ

余裕があるのになぜ、、

もしかしてCDKデプロイ時EIPを3つ使おうとしていて、合計6個になるからEIP上限数エラーが出るのでは?

 

VPC作成時、AZの数だけEIPも作成される

上記の6個になる理論は正解でした。

VPC作成時にアベイラビリティゾーン(AZ)を指定しますが、NATゲートウェイを含むVPCを作成する場合はAZの個数分NATゲートウェイも作成されます。

 

NATゲートウェイはEIPが必要のため、AWSCDK内でNATゲートウェイを含むVPCを作成している場合は、EIPもその個数分自動的に作成されます。

つまり使用するAZが3つの場合、EIPも3つ作られるということ。

 

※AZを複数選択すると、AZ-aが落雷とかで使えなくなってもAZ-cが使えるからサービス止まらなくて安心だよねというメリットがあるやつ。

アベイラビリティーゾーン

AWS リージョンの冗長電源、ネットワーク、および接続を備えた個別のデータセンターです。複数の AZ を使用することで、単一のデータセンターと比較して、可用性、耐障害性、およびスケーラビリティに優れた本番稼働用アプリケーションおよびデータベースを操作することができるようになります。複数の AZ のサブネットで実行されているアプリケーションをパーティショニングすると、停電、落雷、竜巻、および地震などの問題から隔離され、保護されます。

引用:https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/create-vpc.html

 

 

これが沼だったんですが、AWSCDK内でVPCを作成する際、何の指定もしていないと「リージョン内のAZを最大3つまですべて使用する」方向になるみたいです。

そのため以下のような設定の場合、リージョン内のAZを3つ使い、EIPも3つ作られる設定になっていたと。

 

    //VPC設定

    const vpc = new Vpc(this, 'Vpc');

    //VPCにNameタグを付与

    Tags.of(vpc).add('Name', `hogehogevpc`);

 

具体的な解決策

この点の具体的な解決策としては、以下のように「使用するAZ数に制限かける」のが直接的な策になるかと思います。

私もこれでことなきを得ました。

(AZ2つでも十分な耐障害性を提供できると考えましたが、より高耐障害性を維持したい場合はAZ3つ使うままの選択の方がいいかもです。)

 

    //VPC設定

    const vpc = new Vpc(this, 'Vpc',{

      maxAzs:2 //ここ追加、AZを2つまで使用

    });

    //VPCにNameタグを付与

    Tags.of(vpc).add('Name', `hogehogevpc`);

 

その他: natGateways: 0を追加する手法

以下のようなこのエラーの回避策もあるみたい。

コーヒー飲みながら仕事したい

AWS CDK という、IaC が面白そうなので、今トライしています。とりあえずハンズオンからということで、有名な Wo…

NATゲートウェイ使わなくていい場合は、CDK内のVPC作成時に以下のようにNATゲートウェイ使わない設定にするやり方もいけるみたいです。

const vpc = new Vpc(this, 'Vpc',{
     natGateways: 0
   });