Skip to content

Instantly share code, notes, and snippets.

@gbvanrenswoude
Last active July 24, 2023 12:01
Show Gist options
  • Save gbvanrenswoude/b2d7e7c8761bd47ce9ca3e04ec5c9463 to your computer and use it in GitHub Desktop.
Save gbvanrenswoude/b2d7e7c8761bd47ce9ca3e04ec5c9463 to your computer and use it in GitHub Desktop.
What is consuming IPs in my AWS Subnet?
#!/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