How to Filter AWS EC2 Instances by Name Pattern Using AWS CLI (dev-server-* Example)


3 views

When managing multiple EC2 instances, filtering by name patterns (like dev-server-*) becomes essential. Here's how to achieve this efficiently with AWS CLI:

The most precise method uses describe-instances with JMESPath filtering:

aws ec2 describe-instances \
  --filters "Name=tag:Name,Values=dev-server-*" \
  --query "Reservations[].Instances[].[InstanceId, Tags[?Key=='Name'].Value | [0]]" \
  --output table

Filter Mechanism: The --filters parameter matches instance tags where:

  • Name=tag:Name specifies we're filtering by the "Name" tag
  • Values=dev-server-* uses wildcard pattern matching

Output Formatting: The --query parameter extracts:

  • Instance ID
  • Name tag value (using JMESPath array projection)

For JSON output (better for scripting):

aws ec2 describe-instances \
  --filters "Name=tag:Name,Values=dev-server-*" \
  --query "Reservations[].Instances[]" \
  --output json

For CSV output:

aws ec2 describe-instances \
  --filters "Name=tag:Name,Values=dev-server-*" \
  --query "Reservations[].Instances[].[InstanceId,InstanceType,State.Name,Tags[?Key=='Name'].Value | [0]]" \
  --output csv

Combine name pattern with instance state:

aws ec2 describe-instances \
  --filters "Name=tag:Name,Values=dev-server-*" "Name=instance-state-name,Values=running" \
  --query "Reservations[].Instances[].[InstanceId, State.Name]"

Filter across multiple name patterns:

aws ec2 describe-instances \
  --filters "Name=tag:Name,Values=dev-server-*,prod-server-*" \
  --query "Reservations[].Instances[].[Tags[?Key=='Name'].Value | [0], InstanceId]"

For large AWS environments:

  • Always specify region with --region flag
  • Limit returned fields using --query to reduce payload size
  • Use --max-items and --next-token for pagination

When working with AWS infrastructure, you'll often need to find specific EC2 instances based on naming patterns. The AWS CLI provides powerful filtering capabilities, but searching by instance name requires understanding how AWS tags work.

What appears as the "Name" in the AWS Console is actually stored as a tag with the key Name. To search instances by name pattern, we need to filter based on this tag.

Here's the fundamental command to find all instances with names starting with "dev-server-":

aws ec2 describe-instances \
--filters "Name=tag:Name,Values=dev-server-*" \
--query "Reservations[].Instances[].[InstanceId, Tags[?Key=='Name'].Value | [0]]" \
--output text

For a more comprehensive view including instance state and other details:

aws ec2 describe-instances \
--filters "Name=tag:Name,Values=dev-server-*" \
--query "Reservations[].Instances[].[
    InstanceId,
    Tags[?Key=='Name'].Value | [0],
    State.Name,
    InstanceType,
    Placement.AvailabilityZone
]" \
--output table

If you have many instances, consider pagination:

aws ec2 describe-instances \
--filters "Name=tag:Name,Values=dev-server-*" \
--query "Reservations[].Instances[].[InstanceId, Tags[?Key=='Name'].Value | [0]]" \
--output text \
--max-items 100 \
--page-size 20

For complex filtering, JMESPath offers more flexibility:

aws ec2 describe-instances \
--query "Reservations[].Instances[?starts_with(Tags[?Key=='Name'].Value | [0], 'dev-server-')].[
    InstanceId,
    Tags[?Key=='Name'].Value | [0],
    PrivateIpAddress
]" \
--output table

For frequent use, add this to your shell profile:

function aws-find-instances() {
    aws ec2 describe-instances \
    --filters "Name=tag:Name,Values=$1*" \
    --query "Reservations[].Instances[].[
        InstanceId,
        Tags[?Key=='Name'].Value | [0],
        State.Name,
        PrivateIpAddress,
        PublicIpAddress
    ]" \
    --output table
}

Usage: aws-find-instances dev-server-

  • The wildcard (*) only works at the end of the pattern
  • Tag filters are case-sensitive
  • Ensure your IAM permissions include ec2:DescribeInstances
  • Consider region specification with --region if needed