-
-
Save yuki777/640cba3e0a68587c36165b8a87d25390 to your computer and use it in GitHub Desktop.
aws ecs login script version 1
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 characters
sssh is currently being maintained at pj8/sssh | |
https://github.com/pj8/sssh |
I fixed it a bit!
- Check profile argument, and use it.
- Separate the
regionParam()
andprofileParam()
#!/bin/bash
# Bash script to run ecs-exec on Amazon ECS Fargate containers.
#
# Usage: See --help.
#
# Installation: Download the script and `chmod u+x the script`. For example, in two-lines (!!! Always read contents of script before execution !!!):
# curl "https://gist.githubusercontent.com/leewc/e4c3a16551b06c2b0b4640fa5a3d9c00/raw/sssh" -o "sssh" | chmod u+x ./sssh
# ./sssh
#
# Credits to yuki777@ with modifications from leewc@
# Original: https://gist.github.com/yuki777/640cba3e0a68587c36165b8a87d25390/7158dfae99e7277d4f4614f81092a5dafaa16fed/
#
# Prerequisites (validated)
# - aws cli
# - session-manager-plugin
# - jq
set -eu
selectProfile(){
# profile parameter not supplied.
if [ -z ${profile+x} ]; then
# only works with AWS CLIv2.
select selected in `aws configure list-profiles`
do
break
done
echo $selected
else
echo $profile
fi
}
params(){
echo "$(profileParam) $(regionParam)"
}
profileParam() {
[[ $profile ]] &>/dev/null && echo "--profile $profile"
}
regionParam() {
[[ $region ]] &>/dev/null && echo "--region $region"
}
selectCluster(){
select selected in $(aws ecs list-clusters $(params)|jq -r ".clusterArns[]"|sort|cut -d "/" -f 2)
do
break
done
echo $selected
}
selectService(){
select selected in $(aws ecs list-services $(params) --cluster $cluster|jq -r ".serviceArns[]"|sort)
do
break
done
echo $selected
}
selectTask(){
select selected in $(aws ecs list-tasks $(params) --cluster $cluster --service-name $service --desired-status RUNNING |jq -r '.taskArns[]'|sort)
do
break
done
echo $selected
}
selectContainer(){
select selected in $(aws ecs describe-tasks $(params) --cluster $cluster --tasks $task | jq -r ".tasks[].containers[].name"|sort)
do
break
done
echo $selected
}
colorEcho(){
red='\033[0;31m'
green='\033[0;32m'
yellow='\033[0;33m'
reset='\033[0m'
if echo $@ | egrep -q "prd|prod|production"; then
color=$red
elif echo $@ | egrep -q "stg|stage|staging|beta|devo"; then
color=$yellow
else
color=$green
fi
echo -e "${color}$@${reset}"
}
echo_stderr() {
echo -e "$@" >&2
}
die() {
echo_stderr "$@"
exit 1
}
validatePrereq() {
command -v jq &>/dev/null || die "jq not installed on host. Please install jq. See https://stedolan.github.io/jq/download/"
command -v session-manager-plugin &>/dev/null || die "session-manager-plugin not installed. See https://docs.aws.amazon.com/systems-manager/latest/userguide/session-manager-working-with-install-plugin.html"
command -v aws &>/dev/null || die "AWS CLI not found, AWS CLI version 1.16.12 or later must be installed. See https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html"
# Checks if AWS CLI is outdated or not., v1 of AWS CLI pipes to std error, redirect
AWS_CLI_VERSION=$(aws --version 2>&1 | awk '{ print $1 }' | cut -d/ -f2)
echo_stderr "You have AWS CLI v$AWS_CLI_VERSION installed."
# Do a best effort check for v1 (so that it's at least 1.10 and up.
[[ $AWS_CLI_VERSION =~ ^1.1[0-9] || $AWS_CLI_VERSION =~ ^2 ]] &>/dev/null || die "AWS CLI version 1.16.12 or later must be installed to support ecs-exec, Run 'aws --version' to see what you have. See https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html"
}
function print_help() {
cat >&2 <<-END
This script simplifies the process of getting the required information to drop into an
interactive shell script on your container hosted on Fargate/ECS.
Example:
./sssh --region us-west-2
./sssh --profile default
Supported input parameters:
-r | --region : AWS Region to fetch the cluster, service, task
-p | --profile : AWS Profile for credentials and region.
-c | --command : Command to execute, defaults to '/bin/sh'/
The default command executed on the selected container is '/bin/sh'.
If a region is not provided, the script will attempt to use your region set in the profile.
If you want to execute a different command or shell, you can pass it in like so:
./sssh --command '/bin/bash'
You need active (unexpired) AWS credentials, otherwise, the script will crash.
Updates on https://gist.githubusercontent.com/leewc/e4c3a16551b06c2b0b4640fa5a3d9c00
END
}
main(){
command='/bin/sh'
while [[ "$#" -gt 0 ]]; do
case $1 in
-h|--help)
print_help
exit
;;
-r|--region)
shift
region="${1:?Region must be specified in --region }"
shift
;;
-p|--profile)
shift
profile="${1:?Profile must be specified in --profile}"
shift
;;
-c|--command)
shift
command="${1:?Command must be specified in --command}"
shift
;;
*)
die "Unknown param $1"
;;
esac
done
echo_stderr "Validating pre-requisites...."
validatePrereq
# spaces matter :)
if [[ $AWS_CLI_VERSION =~ ^2 ]] ; then
echo_stderr "Select AWS Profile."
profile=`selectProfile`
colorEcho profile: $profile
else echo_stderr "[INFO] AWS CLI is not v2, unable to select profile. --region or --profile must be set."
fi
echo_stderr
echo_stderr "Select cluster."
cluster=`selectCluster`
colorEcho cluster: $cluster
echo_stderr
echo_stderr "Select service."
service=`selectService`
colorEcho service: $service
echo_stderr
echo_stderr "Select task."
task=`selectTask`
colorEcho task: $task
echo_stderr
echo_stderr "Select container."
container=`selectContainer`
colorEcho container: $container
echo_stderr
echo_stderr "Executing command (you might have to upgrade your AWS CLI if this fails)"
cmd="aws ecs execute-command $(params) --cluster $cluster --container $container --task $task --interactive --command '$command'"
colorEcho $cmd
$cmd
}
# Execute main function and pass all params over
main $@
Hi yuki777, no problem, thank you for sharing the initial version and improving the script even more! I like what you did with it, I will edit my gist with your version (feel free to do the same with yours!). It is so much better than manually collecting the information just to run execute command.
I was not sure if --interactive --command '$command'"
would work given the single-quotes. Super cool it works! It looks good now.
This is an awesome script! Can you put Appache2.0 license on it please. Thank you!
Arigato for the comment.
I've updated it.
I'm glad this script is helping you.
:)
A new version that may be more useful integrated by peco
sssh
is currently being maintained at pj8/sssh
Starred, thank you for letting me know!
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
@leewc
Thank you for sharing.
It looks nice!
I was thinking I have to write more, You wrote it all.
:)