List public IP addresses of EC2 instances

52,043

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

Share:
52,043
Bas Peeters
Author by

Bas Peeters

Updated on July 17, 2022

Comments

  • Bas Peeters
    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 to jq, or something else entirely?

  • Bas Peeters
    Bas Peeters almost 10 years
    Awesome. 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
    A Null Pointer over 8 years
    I 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
    A Null Pointer over 8 years
    Grep 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
    jaygooby over 7 years
    Wrap 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
    Bruno Bronosky over 6 years
    This is great! However, I suggest using wget -qO - instead of curl (even though I use curl 99.9% or the time in my scripts. The reason is that curl will output the content of the 404 page if the server doesn't have a public IP, and wget does not. So in bash it's simple to do public_ip="$(wget -qO - http://169.254.169.254/latest/meta-data/public-ipv4)" and get expected results. You can then test with if [[ -n $public_ip ]]; then echo "Public IP: $public_ip"; fi
  • Shahar Hamuzim Rajuan
    Shahar Hamuzim Rajuan about 6 years
    Is 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
    DuelistPlayer almost 5 years
    If you want the instances' KeyName to go with the public IP address, you can get it with --query "Reservations[*].Instances[*].[KeyName, PublicIpAddress]"