Created
December 15, 2015 05:13
-
-
Save cbsmith/92c00bc13f86a8ce44de to your computer and use it in GitHub Desktop.
Revisions
-
cbsmith created this gist
Dec 15, 2015 .There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal 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 }