Skip to content

Instantly share code, notes, and snippets.

@cbsmith
Created December 15, 2015 05:13
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save cbsmith/92c00bc13f86a8ce44de to your computer and use it in GitHub Desktop.
Save cbsmith/92c00bc13f86a8ce44de to your computer and use it in GitHub Desktop.
A handy collection of bash functions to make the aws cli a bit more usable
# 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
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment