Skip to content

Instantly share code, notes, and snippets.

@cbsmith
Created December 15, 2015 05:13
Show Gist options
  • Save cbsmith/92c00bc13f86a8ce44de to your computer and use it in GitHub Desktop.
Save cbsmith/92c00bc13f86a8ce44de to your computer and use it in GitHub Desktop.

Revisions

  1. cbsmith created this gist Dec 15, 2015.
    285 changes: 285 additions & 0 deletions awscli_functions.sh
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,285 @@
    # Usage: . awscli_functions.sh
    # Suggested: add to ~/.bashrc
    # This code lazily uses your default profile && region.
    # It wouldn't take much to add some logic for using ${PROFILE} and/or ${REGION} as some kind of override.
    # Lots more functions would be helpful, but I've been playing with ec2 & vpcs a lot lately, so...

    clusters()
    {
    local __resultvar=$1
    local __clusters=$(aws ecs list-clusters | jq -r '.clusterArns[]')

    if [ $? -ne 0 ] || [ -z "${__clusters}" ]
    then
    2>&1 echo "No clusters found"
    return 1
    fi

    if [[ "${__resultvar}" ]]
    then
    eval ${__resultvar}="'${__clusters}'"
    else
    echo "${__clusters}"
    fi
    }

    cluster_names()
    {
    local __resultvar=$1
    local __cluster_names=$(clusters | cut -d '/' -f 2- | sort)

    if [[ "${__resultvar}" ]]
    then
    eval ${__resultvar}="'${__cluster_names}'"
    else
    echo "${__cluster_names}"
    fi
    }

    tasks_for_cluster()
    {
    local cluster_name=$1
    local __resultvar=$2
    local __tasks=$(aws ecs list-tasks --cluster "${cluster_name}" | jq -r '.taskArns[]')

    if [[ "${__resultvar}" ]]
    then
    eval ${__resultvar}="'${__tasks}'"
    else
    echo "${__tasks}"
    fi
    }

    task_families_for_cluster()
    {
    local cluster_name=$1
    local __resultvar=$2
    local cluster_tasks
    tasks_for_cluster "${cluster_name}" cluster_tasks
    local __families=$(aws ecs describe-tasks --cluster "${cluster_name}" --tasks ${cluster_tasks} | jq '[.tasks[].taskDefinitionArn | capture("^arn:aws:ecs:[^:]+:[^:]+:task-definition/(?<family>[^:]+)(?:\\d+)?") | .family] | unique | .[]')

    if [[ "${__resultvar}" ]]
    then
    eval ${__resultvar}="'${__families}'"
    else
    echo "${__families}"
    fi
    }

    tasks_for_family()
    {
    local cluster_name=$1
    local family_name=$2
    local __resultvar=$3

    if [ -z "${family_name}" ]
    then
    2>&1 echo "Usage: tasks_for_family cluster_name family_name"
    return 1
    fi

    local __tasks=$(aws ecs list-tasks --cluster "${cluster_name}" --family "${family_name}" | jq -r '.taskArns[]')

    if [[ "${__resultvar}" ]]
    then
    eval ${__resultvar}="'${__tasks}'"
    else
    echo "${__tasks}"
    fi
    }

    cluster_containers()
    {
    local cluster=$1
    local __resultvar=$2
    local instances=$(aws ecs list-container-instances --cluster ${cluster} | jq -r '.containerInstanceArns[]')

    if [ "$?" -ne 0 ] | [ -z "${instances}" ]
    then
    2>&1 echo "Could not find instances for cluster ${cluster}"
    return 1
    fi

    local __instance_ids=$(aws ecs describe-container-instances --cluster ${cluster} --container-instances ${instances} | jq -r '.containerInstances[].ec2InstanceId')

    if [[ "${__resultvar}" ]]
    then
    eval ${__resultvar}="'${__instance_ids}'"
    else
    echo "${__instance_ids}"
    fi
    }

    cluster_ips()
    {
    local cluster=$1
    local __resultvar=$2
    local instance_ids
    cluster_containers ${cluster} instance_ids
    if [ "$?" -ne 0 ] | [ -z "${instance_ids}" ]
    then
    2>&1 echo "Failed to find instances for cluster ${cluster}"
    return 1
    fi

    local __ips=$(aws ec2 describe-instances --instance-ids ${instance_ids} | jq -r '.Reservations[].Instances[].PrivateIpAddress')

    if [[ "${__resultvar}" ]]
    then
    eval ${__resultvar}="'${__ips}'"
    else
    echo "${__ips}"
    fi
    }

    task_ips()
    {
    local cluster_name=$1
    local family_name=$2
    local __resultvar=$3
    local tasks
    tasks_for_family "${cluster_name}" "${family_name}" tasks

    if [ "$?" -ne 0 ] | [ -z "${tasks}" ]
    then
    2>&1 echo "Failed to find tasks for family ${family_name}"
    return 1
    fi

    local container_instances=$(aws ecs describe-tasks --cluster "${cluster_name}" --tasks ${tasks} | jq -r '.tasks[].containerInstanceArn')

    if [ "$?" -ne 0 ] | [ -z "${container_instances}" ]
    then
    2>&1 echo "Failed to find container instances"
    return 2
    fi

    local instance_ids=$(aws ecs describe-container-instances --cluster "${cluster_name}" --container-instances ${container_instances} | jq -r '.containerInstances[].ec2InstanceId')

    if [ "$?" -ne 0 ] | [ -z "${instance_ids}" ]
    then
    2>&1 echo "Failed to find instance ids"
    return 3
    fi

    local __ips=$(aws ec2 describe-instances --instance-ids ${instance_ids} | jq -r '.Reservations[].Instances[].PrivateIpAddress')

    if [[ "${__resultvar}" ]]
    then
    eval ${__resultvar}="'${__ips}'"
    else
    echo "${__ips}"
    fi
    }

    deregister_cluster()
    {
    local cluster_name=$1
    local __resultvar=$2
    local arns=$(aws ecs list-container-instances --cluster "${cluster_name}" | jq -r '.containerInstanceArns[]')
    if [ "$?" -ne 0 ] || [ -z "${arns}" ]
    then
    2>&1 echo "Failed to find cluster."
    return $?
    else
    disconnected_arns=$(aws ecs describe-container-instances --cluster "${cluster_name}" --container-instances ${arns} | jq -r '.containerInstances | map(select(.agentConnected | not))[].containerInstanceArn')
    let fails=0
    for arn in ${disconnected_arns}
    do
    aws ecs deregister-container-instance --cluster "${cluster_name}" --container-instance "${arn}" >> /dev/null 2>&1
    if [ "$?" -ne 0 ]
    then
    2>&1 echo "Failed to deregister ${arn}"
    ((fails++))
    fi
    done
    return ${fails}
    fi
    }

    subnet()
    {
    local subnet_name=$1
    local __resultvar=$2
    local __subnet
    if aws ec2 describe-subnets --subnet-ids "${subnet_name}" > /dev/null 2>&1
    then
    __subnet=${subnet_name}
    else
    __subnet=$(aws ec2 describe-subnets --filters Name=tag:Name,Values=${subnet_name} | jq -r '.Subnets[].SubnetId')
    fi

    #wow does bash suck for defining functions
    if [[ "${__resultvar}" ]]
    then
    eval ${__resultvar}="'${__subnet}'"
    else
    echo "${__subnet}"
    fi
    }

    list_subnets()
    {
    local vpc_id=$1
    local __resultvar=$2
    vpc ${vpc_id} vpc_id
    local __subnets=$(aws ec2 describe-subnets --filter Name=vpc-id,Values=${vpc_id} | jq -cr '.Subnets | map({"SubnetId": .SubnetId, "AvailabilityZone": .AvailabilityZone, "Name": (if has("Tags") then (.Tags | map(select(.Key == "Name")) | if (. | length) > 0 then .[0].Value else "" end) else "" end) }) | sort_by(.AvailabilityZone) | .[]')

    #wow does bash suck for defining functions
    if [[ "${__resultvar}" ]]
    then
    eval ${__resultvar}="'${__subnets}'"
    else
    echo "${__subnets}"
    fi
    }

    vpcs()
    {
    local __resultvar=$1
    local __vpcs=$(aws ec2 describe-vpcs | jq -r '.Vpcs[].VpcId')

    #wow does bash suck for defining functions
    if [[ "${__resultvar}" ]]
    then
    eval ${__resultvar}="'${__vpcs}'"
    else
    echo "${__vpcs}"
    fi
    }

    # for when you want something more descriptive
    list_vpcs()
    {
    local __resultvar=$1
    local __vpcs=$(aws ec2 describe-vpcs | jq -cr '.Vpcs | map({"VpcId": .VpcId, "Name": (if has("Tags") then (.Tags | map(select(.Key == "Name")) | if (. | length) > 0 then .[0].Value else "" end) else "" end) }) | .[]')

    #wow does bash suck for defining functions
    if [[ "${__resultvar}" ]]
    then
    eval ${__resultvar}="'${__vpcs}'"
    else
    echo "${__vpcs}"
    fi
    }

    vpc()
    {
    local vpc_name=$1
    local __resultvar=$2
    local __vpc
    if aws ec2 describe-vpcs --vpc-ids "${vpc_name}" > /dev/null 2>&1
    then
    __vpc=${vpc_name}
    else
    __vpc=$(aws ec2 describe-vpcs --filters Name=tag:Name,Values=${vpc_name} | jq -r '.Vpcs[].VpcId')
    fi

    #wow does bash suck for defining functions
    if [[ "${__resultvar}" ]]
    then
    eval ${__resultvar}="'${__vpc}'"
    else
    echo "${__vpc}"
    fi
    }