サブネットのIPアドレスは全部使えません。
IPアドレス先頭のネットワークアドレス、後尾のブロードキャストアドレスだけでなく、AWSで予約されたIPアドレスもあります。
本記事は
- 利用可能なIPアドレス数
- 参考として利用可能なIPアドレス残数をCLIで取得
などをご紹介します。
では早速!
利用可能なIPアドレス数
例えば、192.168.1.0/24で例を挙げます。
- 192.168.0.0:ネットワークアドレス
- 192.168.0.1:AWS予約(VPCルータ用)
- 192.168.0.2:AWS予約(DNS用)
- 192.168.0.3:AWS予約(将来予備)
- 192.168.0.4:ブロードキャストアドレス
以上の5個は使えません。なので、/24の場合、2^8 = 256のIPアドレス数ですが、実際には5を減算した値「251」になります。
大きめのサブネットであれば微々たるものですが、/28のように小さいサブネットは影響が大きいです。/28の場合、2^4 = 16のIPアドレス数ですが、実際使えるのは16-5=11になります。設計には気を付けたいものです。
(参考) CLIで現在のIPアドレス残数を算出
CLI(aws ec2)で現在のIPアドレス残数を算出可能です。
※現時点の消費数も加味したIPアドレス残数です。(例えば、定義上の利用可能数が10で利用中が2の場合は、8が返るようなコマンドです)
# 参考書式
aws ec2 describe-subnets --subnet-ids サブネットID
# 実行例
aws ec2 describe-subnets --subnet-ids subnet-1234567890
# 結果例
{
"Subnets": [
{
"AvailabilityZone": "ap-northeast-1a",
"AvailabilityZoneId": "apne1-az4",
"AvailableIpAddressCount": 33,
"CidrBlock": "192.168.1.0/24",
"DefaultForAz": false,
"MapPublicIpOnLaunch": false,
"MapCustomerOwnedIpOnLaunch": false,
"State": "available",
"SubnetId": "subnet-1234567890",
"VpcId": "vpc-1234567890abc",
"OwnerId": "1234567890",
"AssignIpv6AddressOnCreation": false,
"Ipv6CidrBlockAssociationSet": [],
"SubnetArn": "arn:aws:ec2:ap-northeast-1:1234567890:subnet/subnet-1234567890",
"EnableDns64": false,
"Ipv6Native": false,
"PrivateDnsNameOptionsOnLaunch": {
"HostnameType": "ip-name",
"EnableResourceNameDnsARecord": false,
"EnableResourceNameDnsAAAARecord": false
}
}
]
}
上記結果の「AvailableIpAddressCount」で残数を確認出来ます(ここでは残り33個利用出来るってことです)。
残数だけ表示したい場合は次の書式で実行します。
# 実行例(パイプを通して該当属性だけ表示)
aws ec2 describe-subnets --subnet-ids subnet-1234567890 | jq -r '.Subnets[].AvailableIpAddressCount'
# 環境変数に入れるならバッククォートで囲う。
ipnum=`aws ec2 describe-subnets --subnet-ids subnet-1234567890 | jq -r '.Subnets[].AvailableIpAddressCount'`
(参考) サブネットのIPアドレスは色々なところで消費される。
RDSやFSx、EFS等
サブネットのIPアドレスはEC2のプライベートIPアドレスだけでなく、色々な部分で消費されていきます。一部抜粋して書いておきます。
- RDS
- FSx
- EFS
- ELB(ALB)
※最低8個空きがないと作れない - VPCエンドポイント(インターフェイス型)
などなど、サブネットに括りつけて使うAWSサービスはほとんどサブネットのIPアドレスを消費すると思ったほうが良いです。
EC2サービスの「ネットワークインターフェイス」より具体的に消費中のIPアドレスは確認可能です。
CLIで利用中のIPアドレスを表示
利用しているIPアドレス数が少ない時はGUIからの確認でも十分に追いつきますが、数が多いと辛いです。
わざわざIPアドレスを確認する機会ってなんだ?
ホスト名じゃなくて、IPアドレス指定でアクセスしていたりとか?
aws cliの「describe-network-interfaces」を利用することで確認出来ます。
早速、cloudShellで確認してみます。
# 書式例(サブネットのIPアドレス一覧だけを表示)
aws ec2 describe-network-interfaces --filters Name=subnet-id,Values=サブネットID \
--query 'NetworkInterfaces[*].PrivateIpAddress' \
--output text
# 実行例
aws ec2 describe-network-interfaces --filters Name=subnet-id,Values=subnet-1234567890 \
--query 'NetworkInterfaces[*].PrivateIpAddress' \
--output text
192.168.0.2
192.168.0.4
192.168.0.3
:
# 実行例(インスタンスIDもセットで表示)
aws ec2 describe-network-interfaces --filters Name=subnet-id,Values=subnet-1234567890 \
--query 'NetworkInterfaces[*].[PrivateIpAddress, Attachment.InstanceId]' \
--output text
192.168.0.2 i-123456789a
192.168.0.4 i-1234567890
192.168.0.3 None
:
# 実行例(上記をIPアドレスでソート)
aws ec2 describe-network-interfaces --filters Name=subnet-id,Values=subnet-1234567890 \
--query 'sort_by(NetworkInterfaces, &PrivateIpAddress)[].[PrivateIpAddress, Attachment.InstanceId]' \
--output text
192.168.0.2 i-123456789a
192.168.0.3 None
192.168.0.4 i-1234567890
:
ついでに「query」引数を使って、結果をわかりやすくしています。
query引数は以下ページが参考になります。
まとめ
本記事ではAWSのサブネットで実際に使えるIPアドレスなどをご紹介しました。
- 予約域があるため「5」減算する。
(/24 = 256であれば実際に使えるのは251) - (参考) コマンドで現在のIPアドレス残数は取得可能。
- (参考) サブネットのIPアドレスは色々なところで消費される。
途中でサブネットのIPアドレスが枯渇することのないように余裕をもった設計を行いたいものです。
最後までご覧いただきありがとうございました!
コメント