Besides AWS Management Console, there are number of ways to use AWS such as API calls (and programming languages such as Java, Php, Python, Ruby, .Net..) and AWS CLI.

AWS CLI are one of best ways if you want to start scripting AWS, as it is working in Linux shell and is really powerful tool.

For example, imagine you have AWS environment which is defined by tag "Environment". It can be anything else, such as instance "Name".

If you want to quickly list instances and their Security groups for particular environment, here is one-liner:

aws ec2 describe-instances --filter Name=tag:Environment,Values=ENVIRONMENT_NAME --query 'Reservations[*].Instances[*].{ID:InstanceId,SG:SecurityGroups,Tags:Tags}' --output text --profile profile_name

This will produce you nice output of your instances and their assigned Security groups. This can be filtered in multiple ways, but the best way is to select only first element without filters:

aws ec2 describe-instances --query 'Reservations[0].Instances[0] --output json

That way you will see which elements you have in your response, and based on that you can build filter.

This is VERY important feature which will do logical AND operation for those filters, so only values which are having ALL requirements will be in the output:

aws ec2 describe-instances --filters "Name=instance-state-name,Values=running" "Name=tag:Environment,Values=ENV_NAME" "Name=tag:Project,Values=PROJECT_NAME" --profile PROFILE_NAME --query Reservations[*].Instances[*].State

If you specify like this (all filters together), output will be produced if ANY of those filters is found:

aws ec2 describe-instances --filters "Name=instance-state-name,Values=running,Name=tag:Environment,Values=ENV_NAME,Name=tag:Project,Values=PROJECT_NAME" --profile PROFILE_NAME --query Reservations[*].Instances[*].State

If you want to query and output certain values from Tags, for example instance Name, along with other details, you go like this:

aws ec2 describe-instances --filters 'Name=tag:KEY,Values=VALUE' --query 'Reservations[].Instances[].[Tags[?Key==`Name`] | [0].Value,InstanceId,InstanceType]' --output table

Checking which Tags are present with instances:

aws ec2 describe-instances --filters 'Name=tag:Application,Values=App1' --query 'Reservations[].Instances[].[Tags[?Key==`Environment`] | [0].Value]' --output text --region eu-west-1 | sort | uniq

List multiple values from properties:

aws ec2 describe-instances --filters 'Name=tag:Environment,Values=VALUE' --query 'Reservations[].Instances[].[Placement.AvailabilityZone,Platform,InstanceType]' --output text --region us-east-1

Describe EBS Snapshots for certain month only:

$ aws ec2 describe-snapshots --query 'Snapshots[?StartTime >= `2019-06-01` && StartTime <= `2019-06-31`].{ID:SnapshotId,Time:StartTime}' --region REGION --owner-ids ACCOUNT_ID --output text

Describe AMIs for certain month only:

$ aws ec2 describe-images --query 'Images[?CreationDate >= `2019-06-01` && CreationDate <= `2019-06-31`].{ID:ImageId,Time:CreationDate}' --region REGION --filters "Name=owner-id,Values=ACCOUNT_ID" --output text

Describe snapshots with Snapshot ID, StartTime and Tag Name

:

$ ec2 describe-snapshots --query 'Snapshots[?StartTime >= `2019-01-01` && StartTime <= `2019-01-31`].{ID:SnapshotId,Time:StartTime,Name:Tags[?Key==`Name`].Value | [0]}' --region REGION --owner-ids ACCOUNT_ID --output text

Describe Health of each TargetGroup associated with certain LoadBalancer:

$ for j in $(for i in `aws elbv2 describe-target-groups --load-balancer-arn YOUR_LB_ARN --region YOUR_REGION --query TargetGroups[].TargetGroupArn`; do echo $i | awk -F"," '{print $1}' | grep -v "]" | grep -v "\[" | awk -F "\"" '{print $2}' | cat ; done); do aws elbv2 describe-target-health --target-group-arn $j --region eu-west-1 --query TargetHealthDescriptions[].TargetHealth ; echo $j; done

Also, you can configure your AWS CLI to work with profiles, so for example if you have different access keys for different environments, you can access them by using --profile (as shown above).

Enjoy!