Originally published May 21, 2018 @ 10:18 pm
The installation and configuration process for AWS CLI is fairly simple. The package itself is installed with pip
(yum -y install python-pip
):
pip install awscli --upgrade --user
Selecting what you need from the output can be accomplished via awscli
filters and queries; using the excellent jq
JSON processor; or just using awk
, sed
, and whatever other standard shell tools you like. My preference is to keep awscli
queries simple and do most of the formatting in the shell.
The first time you run awscli
you will be prompted to provide your API credentials. You would need to supply the AWS Access Key ID, the AWS Secret Access Key, and the default region the can be modified from command line along with other variables.
You can obtain this info by logging into your AWS account, clicking on your username in the upper right-hand corner ➡ My Security Credentials ➡ Users ➡ Select your username ➡ Security Credentials ➡ Create access key.
In the examples below I used a variety of methods for massaging the output. Not because this was the most efficient way of doing things, but just to illustrate the available options.
List running instances
aws ec2 describe-instances --filters Name=instance-state-name,Values=running --query 'Reservations[].Instances[].[InstanceId]'
List all instances in a table format
aws ec2 describe-instances --query 'Reservations[].Instances[].[Placement.AvailabilityZone, State.Name, InstanceId,InstanceType,Platform,Tags.Value,State.Code,Tags.Values]' --output table
See if any running instances have scheduled events
for i in $(aws ec2 describe-instances --filters Name=instance-state-name,Values=running --query 'Reservations[].Instances[].[InstanceId]'); do if [ $(aws ec2 describe-instance-status --instance-id ${i} 2>/dev/null | grep -c ^EVENTS) -eq 1 ]; then aws ec2 describe-instance-status --instance-id ${i} --output=json | jq -r '.InstanceStatuses[].Events[] | join(",")' | awk -v var="${i}," '{print var$0}' | (echo "Instance,Description,Code,Start,End" && cat) | column -s',' -t; fi; done
List stopped instances and reason why
aws ec2 describe-instances --filters Name=instance-state-name,Values=stopped --output json | jq -r .Reservations[].Instances[].StateReason.Message
List AWS Dashboard users
aws iam list-users --output table
List EBS volumes for a specific instance
i=<InstanceId>; aws ec2 describe-instances --filter Name="instance-id",Values="${i}" --output json | jq -r '.Reservations[].Instances[] | "\(.InstanceId) \(.Tags[].Value) \(.BlockDeviceMappings[].DeviceName) \(.BlockDeviceMappings[].Ebs.VolumeId)"'
List EBS volumes for all instances
for i in $(aws ec2 describe-instances --filters Name=instance-state-name,Values=running --query 'Reservations[].Instances[].[InstanceId]'); do aws ec2 describe-instances --filter Name="instance-id",Values="${i}" --output json | jq -r '.Reservations[].Instances[] | "\(.InstanceId) \(.Tags[].Value) \(.BlockDeviceMappings[].DeviceName) \(.BlockDeviceMappings[].Ebs.VolumeId)"'; done
List snapshots of volumes for a specific instance
i=<InstanceId>; for j in $(aws ec2 describe-instances --filter Name="instance-id",Values="${i}" --output text | grep ^EBS | awk '{print $NF}'); do aws ec2 describe-snapshots --filter "Name=volume-id,Values=${j}" --query 'Snapshots[*].SnapshotId' --output text; done
Describe snapshots of volumes for a specific instance
i="<InstanceId>"; for j in $(aws ec2 describe-instances --filter Name="instance-id",Values="${i}" --output text | grep ^EBS | awk '{print $NF}'); do aws ec2 describe-snapshots --filter "Name=volume-id,Values=${j}" --output text; done
Generate snapshot report for all running instances
for i in $(aws ec2 describe-instances --filters Name=instance-state-name,Values=running --query 'Reservations[].Instances[].[InstanceId]'); do aws ec2 describe-instances --filter Name="instance-id",Values="${i}" --output json | jq -r '.Reservations[].Instances[] | "\(.InstanceId) \(.Tags[].Value) \(.BlockDeviceMappings[].DeviceName) \(.BlockDeviceMappings[].Ebs.VolumeId)"'; for j in $(aws ec2 describe-instances --filter Name="instance-id",Values="${i}" --output text | grep ^EBS | awk '{print $NF}'); do aws ec2 describe-snapshots --filter "Name=volume-id,Values=${j}" --output text; done; echo "------------"; done
Make a screenshot of the instance’s terminal and email it
i=<instance_id>; e=<your_email>; d=$(date +'%Y-%m-%d_%H%M%S'); s="Screenshot of ${i} at ${d}"; f="${i}_screenshot_${d}.jpg"; aws ec2 get-console-screenshot --wake-up --instance-id ${i} | base64 --decode 2>/dev/null > ${f}; echo "${s}" | mailx -s "${s}" -a "${f}" ${e}
Experienced Unix/Linux System Administrator with 20-year background in Systems Analysis, Problem Resolution and Engineering Application Support in a large distributed Unix and Windows server environment. Strong problem determination skills. Good knowledge of networking, remote diagnostic techniques, firewalls and network security. Extensive experience with engineering application and database servers, high-availability systems, high-performance computing clusters, and process automation.