-
-
Save amrynsky/9cbb7d5806813b76ca31 to your computer and use it in GitHub Desktop.
A handy collection of bash functions to make the aws cli a bit more usable
This file contains 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 characters
# 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