AWS が保有する IP アドレスの個数を数えてみる

# はじめに
クラウド市場でトップを走る AWS が IP アドレスをどのくらい保有しているのか気になりました。
そこで、数えてみることにしました。

AWS では一部のサービスで使用されている IP アドレスを公開しています。
顧客が一般的にフィルタリングを実行したいサービスに限っているそうなので全量とはなりませんが、今回はここで公開されている IPv4 アドレスの数を数えてみます。

参考）AWS IP アドレスの範囲
https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/aws-ip-ranges.html
>注記
>ip-ranges.json で公開されているのは一部の AWS サービス IP アドレス範囲のみです。当社では、顧客が一般的に送信側フィルタリングを実行したいと考えているサービスの IP アドレス範囲を公開しています。


# 数える
IP アドレスは ip-ranges.json として公開されています。
まずは、ローカルに ip-ranges.json をダウンロードします。
```
$ wget https://ip-ranges.amazonaws.com/ip-ranges.json
```

次に JSON の形式を確認します。
サービスとリージョン単位で公開されているようです。
ip_prefix は CIDR 表記のようです。
```
{
  "syncToken": "0123456789",
  "createDate": "yyyy-mm-dd-hh-mm-ss",
  "prefixes": [
    {
      "ip_prefix": "cidr",
      "region": "region",
      "network_border_group": "network_border_group",
      "service": "subset"
    }
  ],
  "ipv6_prefixes": [
    {
      "ipv6_prefix": "cidr",
      "region": "region",
      "network_border_group": "network_border_group",
      "service": "subset"
    }
  ]  
}
```

上記を踏まえて、下記のようなコマンドで数えます。
ここではすべての IP アドレスが含まれている AMAZON をサービスとして指定し、公開されているすべてのサービスの IPv4 アドレスの数を数えています。
```
$ jq -r '.prefixes[] | select(.service=="AMAZON") | .ip_prefix' < ip-ranges.json |cut -d'/' -f2 |xargs -i bash -c 'echo "$((2**(32-{})))"' | awk '{ for (i=1; i<=NF; i++) { sum+=$i } } END { print sum }'
73800771
```

結果として、73800771 が返ってきました。(2023/12/25 時点)

IPv4 アドレスの全量が 2^32 = 4294967296 個で、プライベートアドレス分を抜いても 2^32 - (2^24 + 2^16 + 2^8) = 4278124294 個なので、全世界のIPv4 アドレスのうち 73800771/4278124294*100 = 1.725 % ほどを保有していることになります。
１社で世界の 1.7 % と考えるとものすごい大量に保有している印象です。しかも、公開されているサービスの分のみなので、さらに多く保有している可能性も考えるとすごいですね。

# 結果まとめ
リージョンごととサービスごとで抽出して結果を見てみます。
各集計で使っている hoge-list.txt はそれぞれリージョンとサービスを羅列したテキストファイルです。

## リージョンごと
リージョンごとにみると、アメリカだけで 45 % を占めていることがわかります。
東京リージョンは 5.6 % です。大阪も合わせれば 6 % と、大抵のサービスが日本国内で使用されると考えると結構多く感じます。
```
$ ALL_IPv4=73800771
$ while read region; do   jq -r '.prefixes[] | select(.service=="AMAZON") |select(.region=="'${region}'") | .ip_prefix' < ip-ranges.json |cut -d'/' -f2 |xargs -i bash -c 'echo "$((2**(32-{})))"' | awk '{ for (i=1; i<=NF; i++) { sum+=$i } } END { print "'${region}':", sum, "(", sum/'${ALL_IPv4}'*100 ,"%)" }'; done <region-list.txt
af-south-1: 414602 ( 0.561785 %)
ap-east-1: 676392 ( 0.916511 %)
ap-northeast-1: 4135171 ( 5.60315 %)
ap-northeast-2: 1411292 ( 1.9123 %)
ap-northeast-3: 347172 ( 0.470418 %)
ap-south-1: 2014787 ( 2.73004 %)
ap-south-2: 278694 ( 0.37763 %)
ap-southeast-1: 2438538 ( 3.30422 %)
ap-southeast-2: 1968850 ( 2.66779 %)
ap-southeast-3: 343948 ( 0.466049 %)
ap-southeast-4: 277510 ( 0.376026 %)
ca-central-1: 1088094 ( 1.47437 %)
cn-north-1: 652016 ( 0.883481 %)
cn-northwest-1: 418750 ( 0.567406 %)
eu-central-1: 4329807 ( 5.86689 %)
eu-central-2: 343808 ( 0.46586 %)
eu-north-1: 1075694 ( 1.45756 %)
eu-south-1: 543366 ( 0.736261 %)
eu-south-2: 473856 ( 0.642075 %)
eu-west-1: 5670741 ( 7.68385 %)
eu-west-2: 2073146 ( 2.80911 %)
eu-west-3: 941660 ( 1.27595 %)
me-central-1: 478341 ( 0.648152 %)
me-south-1: 413272 ( 0.559983 %)
sa-east-1: 913399 ( 1.23766 %)
us-east-1: 17859303 ( 24.1993 %)
us-east-2: 4512911 ( 6.11499 %)
us-gov-east-1: 409248 ( 0.554531 %)
us-gov-west-1: 604092 ( 0.818544 %)
us-west-1: 1550282 ( 2.10063 %)
us-west-2: 9780520 ( 13.2526 %)
GLOBAL: 3807168 ( 5.15871 %)
```

## サービスごと
サービスで見てみると圧倒的に EC2 が多く、全体の8割を占めていました。
EC2 はインスタンスごとにグローバル IP が割り当てられると考えると、これだけ多いのも分かる気がします。
```
$ ALL_IPv4=73800771
$ while read service; do   jq -r '.prefixes[] | select(.service=="'${service}'") | .ip_prefix' < ip-ranges.json |cut -d'/' -f2 |xargs -i bash -c 'echo "$((2**(32-{})))"' | awk '{ for (i=1; i<=NF; i++) { sum+=$i } } END { print "'${service}':", sum, "(", sum/'${ALL_IPv4}'*100 ,"%)" }'; done <service-list.txt
AMAZON: 73800771 ( 100 %)
AMAZON_APPFLOW: 192 ( 0.00026016 %)
AMAZON_CONNECT: 8816 ( 0.0119457 %)
API_GATEWAY: 88608 ( 0.120064 %)
CHIME_MEETINGS: 16384 ( 0.0222003 %)
CHIME_VOICECONNECTOR: 5888 ( 0.00797824 %)
CLOUD9: 1600 ( 0.002168 %)
CLOUDFRONT: 3451844 ( 4.67725 %)
CLOUDFRONT_ORIGIN_FACING: 291840 ( 0.395443 %)
CODEBUILD: 536 ( 0.00072628 %)
DYNAMODB: 30464 ( 0.0412787 %)
EBS: 316 ( 0.00042818 %)
EC2: 59532397 ( 80.6664 %)
EC2_INSTANCE_CONNECT: 228 ( 0.00030894 %)
GLOBALACCELERATOR: 300288 ( 0.40689 %)
KINESIS_VIDEO_STREAMS: 62 ( 8.401e-05 %)
MEDIA_PACKAGE_V2: 288 ( 0.00039024 %)
ROUTE53: 6912 ( 0.00936576 %)
ROUTE53_HEALTHCHECKS: 18176 ( 0.0246285 %)
ROUTE53_HEALTHCHECKS_PUBLISHING: 9472 ( 0.0128346 %)
ROUTE53_RESOLVER: 42607 ( 0.0577325 %)
S3: 572960 ( 0.77636 %)
WORKSPACES_GATEWAYS: 41472 ( 0.0561945 %)
```

## 東京リージョンでサービスごと
せっかくなので、東京リージョンに絞ってサービスごとにみてみます。
EC2 が圧倒的に多い傾向は変わらずです。グローバルサービスが東京リージョンでは含まれない分、割合も少し多くなっている気がします。
CLOUDFRONT の割合が全リージョンの結果と比べて少ないのは、エッジロケーションはリージョンとしては用意されていない地域にも存在しているので、全体の結果はそういった地域の IP アドレスが含まれているのかもしれません。
```
$ ALL_IPv4=4135171
$ while read service; do   jq -r '.prefixes[] |select(.region=="ap-northeast-1")| select(.service=="'${service}'") | .ip_prefix' < ip-ranges.json |cut -d'/' -f2 |xargs -i bash -c 'echo "$((2**(32-{})))"' | awk '{ for (i=1; i<=NF; i++) { sum+=$i } } END { print "'${service}':", sum, "(", sum/'${ALL_IPv4}'*100 ,"%)" }'; done <service-list.txt
AMAZON: 4135171 ( 100 %)
AMAZON_APPFLOW: 12 ( 0.000290194 %)
AMAZON_CONNECT: 64 ( 0.0015477 %)
API_GATEWAY: 3040 ( 0.0735157 %)
CHIME_MEETINGS:  ( 0 %)
CHIME_VOICECONNECTOR: 256 ( 0.0061908 %)
CLOUD9: 64 ( 0.0015477 %)
CLOUDFRONT: 384 ( 0.00928619 %)
CLOUDFRONT_ORIGIN_FACING:  ( 0 %)
CODEBUILD: 16 ( 0.000386925 %)
DYNAMODB: 1024 ( 0.0247632 %)
EBS: 12 ( 0.000290194 %)
EC2: 3573640 ( 86.4206 %)
EC2_INSTANCE_CONNECT: 8 ( 0.000193462 %)
GLOBALACCELERATOR: 768 ( 0.0185724 %)
KINESIS_VIDEO_STREAMS: 12 ( 0.000290194 %)
MEDIA_PACKAGE_V2: 16 ( 0.000386925 %)
ROUTE53:  ( 0 %)
ROUTE53_HEALTHCHECKS: 128 ( 0.0030954 %)
ROUTE53_HEALTHCHECKS_PUBLISHING: 256 ( 0.0061908 %)
ROUTE53_RESOLVER: 3304 ( 0.0799 %)
S3: 14112 ( 0.341268 %)
WORKSPACES_GATEWAYS: 2048 ( 0.0495264 %)
```

# おわりに
世界の 1.7 % の IPv4 アドレスを保有していると考えると、改めて AWS の規模に驚きました。
今回は IPv4 アドレスのみを確認しましたが、IPv6 アドレスも気になります。IPv6 アドレスは現時点ではサービスによっては対応しているという状況のようです。
定期的に集計してみると、どんどんアドレスの数が増えていくのを観察できるかもしれないですね。