Skip to content

Instantly share code, notes, and snippets.

@tbh639
Forked from gjyoung1974/aws_cli_cheat_sheet.txt
Created May 14, 2022 03:56
Show Gist options
  • Save tbh639/025ea9cb1501e9d9d127d050a701fe3c to your computer and use it in GitHub Desktop.
Save tbh639/025ea9cb1501e9d9d127d050a701fe3c to your computer and use it in GitHub Desktop.

Revisions

  1. @gjyoung1974 gjyoung1974 created this gist Mar 30, 2019.
    79 changes: 79 additions & 0 deletions aws_cli_cheat_sheet.txt
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,79 @@
    # Count total EBS based storage in AWS
    aws ec2 describe-volumes | jq "[.Volumes[].Size] | add"
    # Count total EBS storage with a tag filter
    aws ec2 describe-volumes --filters "Name=tag:Name,Values=CloudEndure Volume qjenc" | jq "[.Volumes[].Size] | add"
    # Describe instances concisely
    aws ec2 describe-instances | jq '[.Reservations | .[] | .Instances | .[] | {InstanceId: .InstanceId, State: .State, SubnetId: .SubnetId, VpcId: .VpcId, Name: (.Tags[]|select(.Key=="Name")|.Value)}]'
    # Wait until $instance_id is running and then immediately stop it again
    aws ec2 wait instance-running --instance-id $instance_id && aws ec2 stop-instances --instance-id $instance_id

    # Get 10th instance in the account
    aws ec2 describe-instances | jq '[.Reservations | .[] | .Instances | .[]] | .[10]'
    # List the private IP addresses of all instances
    aws ec2 describe-instances | jq '[.Reservations | .[] | .Instances | .[] | .PrivateIpAddress] | sort'
    # Do that, but only on non-terminated instances
    aws ec2 describe-instances | jq '[.Reservations | .[] | .Instances | .[] | select(.State.Name!="terminated") | {Name: (.Tags[]|select(.Key=="Name")|.Value), PrivateIp: .PrivateIpAddress}]'
    # JQ export to csv command / suffix
    export_csv_suffix='| map([.Name, .PrivateIp] | join(",")) | join("\n")'

    # Get all production instances
    instance_ids=$(aws ec2 describe-instances | jq '[.Reservations | .[] | .Instances | .[] | select(.State.Name!="terminated") | select((.Tags[]|select(.Key=="Environment")|.Value) =="prod") | {Name: (.Tags[]|select(.Key=="Name")|.Value), InstanceId: .InstanceId}]' | jq ".[] | .InstanceId")
    # Add a backup tag to those instances
    echo $instance_ids | sed "s/\"//g" | grep i- | parallel --delay 3 aws ec2 create-tags --resources {} --tags Key=Backup,Value=PolicyA

    # Attach multiple new ebs volumes to an instance
    instance_id="i-0d42888191f597bb8"
    volume_size="8"
    for x in {a..h}
    do
    volume_id=$(aws ec2 create-volume --size $volume_size --volume-type gp2 --availability-zone eu-west-1a | jq -r ".VolumeId")
    aws ec2 wait volume-available --volume-ids $volume_id
    aws ec2 attach-volume --volume-id $volume_id --instance-id $instance_id --device /dev/xvd$x
    done

    # Produce a summary of instances
    jq '[.Reservations | .[] | .Instances | .[] | select(.State.Name!="terminated") | {Name: (.Tags[]|select(.Key=="Name")|.Value), InstanceId: .InstanceId}]'

    # Check instances for ones which are missing required tags
    instances=$(cat "./scripts/prod-instances.json")
    required_tags='["Environment","Backup","Owner","AppName","Name"]'

    echo $instances | jq "[.Reservations | .[] | .Instances | .[] | select(.Tags | [.[] | .Key] | contains($required_tags) | not)]" | jq '
    [.[] | select(.State.Name!="terminated") | select(([.Tags | .[] | .Key]) | contains(["CloudEndure creation time"]) | not) | {
    InstanceId: .InstanceId,
    InstanceName: (.Tags | from_entries | .Name),
    MissingTags: (('$required_tags') - ([.Tags | .[] | .Key]))
    }]'

    # Get the 'Live & Tagged' instances
    instances=$(aws ec2 describe-instances)
    live=$(echo $instances | jq "[.Reservations | .[] | .Instances | .[] | select(.Tags | [.[] | .Key] | contains($required_tags))]")

    # Enable termination protection from a list of instances stored in $list
    echo $live | jq -r ".[] | .InstanceId" | while read id
    do
    echo "Enabling termination proection on machine: $id"
    aws ec2 modify-instance-attribute --disable-api-termination --instance-id $id
    done

    # Attach unused EBS Volumes to an instance
    instance_id="i-abcd1234"
    letters=({a..j})
    volumes=$(aws ec2 describe-volumes | jq -r ".Volumes[] | select(.State==\"available\") | .VolumeId")
    lc=1
    echo $volumes | while read id
    do
    echo "Attaching volume on: $id"
    aws ec2 attach-volume --instance-id $instance_id --volume-id $id --device /dev/sd${letters[++lc]}
    done

    # Detach and delete secondary volumes on a machine
    aws ec2 describe-instances --instance-ids $instance_id | jq -r ".Reservations[0].Instances[0].BlockDeviceMappings | .[] | select(.DeviceName != \"/dev/sda1\") | .Ebs.VolumeId" | while read volume_id
    do
    aws ec2 detach-volume --volume-id $volume_id && \
    aws ec2 wait volume-available --volume-ids $volume_id && \
    aws ec2 delete-volume --volume-id $volume_id
    done

    # Copy everything from an account into an OSX clipboard
    aws ec2 describe-volumes | jq "[.Volumes[] | select(.State==\"available\") | .VolumeId]" | pbcopy