List public IP addresses of EC2 instances
Solution 1
Directly from the aws cli:
aws ec2 describe-instances \
--query "Reservations[*].Instances[*].PublicIpAddress" \
--output=text
Solution 2
- Filter on running instances (you can drop that part if you don't need it)
- Query for each PublicIPaddress and the Name Tag, handling when Name isn't set
aws ec2 describe-instances \
--filter "Name=instance-state-name,Values=running" \
--query "Reservations[*].Instances[*].[PublicIpAddress, Tags[?Key=='Name'].Value|[0]]" \
--output text
Solution 3
The below command would list the IP addresses of all your running EC2 instances
aws ec2 describe-instances | grep PublicIpAddress | grep -o -P "\d+\.\d+\.\d+\.\d+" | grep -v '^10\.'
Hope that answers your query...
But this works without all the errors about access:
wget -qO- http://instance-data/latest/meta-data/public-ipv4/|grep .
Solution 4
You can use instance metadata so you can run the following command from the ec2 instance:
curl http://169.254.169.254/latest/meta-data/public-ipv4
and it will give you the public IP of the instance. If you want the private IP, you will run
curl http://169.254.169.254/latest/meta-data/local-ipv4
Solution 5
aws ec2 describe-instances --query "Reservations[].Instances[][PublicIpAddress]"
Refer: http://docs.aws.amazon.com/cli/latest/userguide/controlling-output.html
Bas Peeters
Updated on July 17, 2022Comments
-
Bas Peeters almost 2 years
I want to list the public IP addresses of my EC2 instances using Bash, separated by a delimiter (space or a new-line).
I tried to pipe the output to jq with
aws ec2 describe-instances | jq
, but can't seem to isolate just the IP addresses.Can this be done by
aws
alone, specifying arguments tojq
, or something else entirely? -
Bas Peeters almost 10 yearsAwesome. But this outputs three columns: one with IP's on every row and two with IP's only on some rows. I get a nice tab-separated list when I use
Reservations[*].Instances[*].PublicIpAddress[]
for the query argument instead. -
A Null Pointer over 8 yearsI just tried the same command today 10/23/15 and it works perfectly fine without any problems. What is the error that you see ?
-
A Null Pointer over 8 yearsGrep works differently on OSX which has the BSD version of grep vs GNU found mostly on other standard Linux distributions stackoverflow.com/questions/19413494/…
-
jaygooby over 7 yearsWrap your
PublicIpAddress
in square-brackets to ensure 1-per-line, as suggested here: github.com/aws/aws-cli/issues/914#issuecomment-56210312. This works for me--query 'Reservations[].Instances[].[PublicIpAddress]
-
Bruno Bronosky over 6 yearsThis is great! However, I suggest using
wget -qO -
instead ofcurl
(even though I use curl 99.9% or the time in my scripts. The reason is thatcurl
will output the content of the 404 page if the server doesn't have a public IP, andwget
does not. So in bash it's simple to dopublic_ip="$(wget -qO - http://169.254.169.254/latest/meta-data/public-ipv4)"
and get expected results. You can then test withif [[ -n $public_ip ]]; then echo "Public IP: $public_ip"; fi
-
Shahar Hamuzim Rajuan about 6 yearsIs there a way to filter using security group? I tried: "aws ec2 describe-instances --filters Name=vpc-id,Values={vpcid} Name=InstanceId,Values={securityGroupID} --output=text" . But I get nothing
-
DuelistPlayer almost 5 yearsIf you want the instances' KeyName to go with the public IP address, you can get it with
--query "Reservations[*].Instances[*].[KeyName, PublicIpAddress]"