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" 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
--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