Last active
July 24, 2023 12:01
-
-
Save gbvanrenswoude/b2d7e7c8761bd47ce9ca3e04ec5c9463 to your computer and use it in GitHub Desktop.
What is consuming IPs in my AWS Subnet?
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/sh | |
export AWS_PAGER="" | |
subnetId=$1 | |
if [ -z "$subnetId" ] | |
then | |
echo "No subnet ID provided. Please provide a subnet ID as an argument." | |
exit 1 | |
fi | |
echo "This checks what things are using IPs in a subnet: $subnetId" | |
subnetInfo=$(aws ec2 describe-subnets --subnet-ids $subnetId --query 'Subnets[0].CidrBlock' --output text) | |
subnetMask=${subnetInfo#*/} | |
subnetIpCount=$((2**(32-subnetMask) - 2 - 3)) # -5 accounts for reserved IPs in AWS subnets | |
echo "Subnet CIDR block: $subnetInfo" | |
echo "Number of available IPs based on mask size: $subnetIpCount" | |
echo "Calculating total IPs used by instances, RDS, ELBs, and Lambdas" | |
instanceIds=$(aws ec2 describe-instances --filters "Name=subnet-id,Values=$subnetId" --query "Reservations[].Instances[].InstanceId" --output text) | |
totalIPs=0 | |
for instanceId in $instanceIds | |
do | |
echo "Checking instance $instanceId" | |
aws ec2 describe-network-interfaces --filters "Name=attachment.instance-id,Values=$instanceId" --query 'NetworkInterfaces[*].PrivateIpAddresses[*].PrivateIpAddress' | |
instanceIPs=$(aws ec2 describe-network-interfaces --filters "Name=attachment.instance-id,Values=$instanceId" --query 'NetworkInterfaces[*].PrivateIpAddresses[*].PrivateIpAddress' --output text | xargs) | |
IFS=' ' read -ra ADDR <<< "$instanceIPs" | |
instanceIPCount=${#ADDR[@]} | |
totalIPs=$((totalIPs + instanceIPCount)) | |
done | |
echo "Total IPs used by instances: $totalIPs" | |
echo "RDS" | |
rdsIPCount=$(aws rds describe-db-instances --query 'DBInstances[*].[DBInstanceIdentifier, DBSubnetGroup.Subnets[*].SubnetIdentifier]' --output text | grep -c $subnetId) | |
totalIPs=$((totalIPs + rdsIPCount)) | |
echo "Total IPs used by instances and RDS: $totalIPs" | |
echo "Elastic Load Balancers" | |
elbIPCount=$(aws elbv2 describe-load-balancers --query 'LoadBalancers[*].AvailabilityZones[*].SubnetId' --output text | grep -c $subnetId) | |
totalIPs=$((totalIPs + elbIPCount)) | |
echo "Total IPs used by instances, RDS, and ELBs: $totalIPs" | |
echo "Lambdas" | |
lambdaIPCount=0 | |
for functionName in $(aws lambda list-functions --query 'Functions[*].[FunctionName]' --output text) | |
do | |
echo "Checking function $functionName" | |
functionSubnetCount=$(aws lambda get-function-configuration --function-name $functionName --query 'VpcConfig.SubnetIds' --output text | grep -c $subnetId) | |
lambdaIPCount=$((lambdaIPCount + functionSubnetCount)) | |
done | |
totalIPs=$((totalIPs + lambdaIPCount)) | |
echo "Total IPs used by instances, RDS, ELBs, and Lambdas: $totalIPs" | |
remainingIPs=$((subnetIpCount - totalIPs)) | |
echo "Expected remaining IPs based on CIDR mask size and IPs in use: $remainingIPs" |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment