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:Namespecifies we're filtering by the "Name" tagValues=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
--regionflag - Limit returned fields using
--queryto reduce payload size - Use
--max-itemsand--next-tokenfor 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
--regionif needed