Skip to content

Instantly share code, notes, and snippets.

@yuki777
Last active June 30, 2023 06:00
Show Gist options
  • Star 6 You must be signed in to star a gist
  • Fork 3 You must be signed in to fork a gist
  • Save yuki777/640cba3e0a68587c36165b8a87d25390 to your computer and use it in GitHub Desktop.
Save yuki777/640cba3e0a68587c36165b8a87d25390 to your computer and use it in GitHub Desktop.
aws ecs login script version 1
sssh is currently being maintained at pj8/sssh
https://github.com/pj8/sssh
@leewc
Copy link

leewc commented Nov 5, 2021

Hi Yuki777, thanks for writing and sharing this! Found this from: https://qiita.com/yuki777/items/e7bcb80e32eca355ddac

I added some enhancements to help with the Fargate containers our team are using, in case you're interested: https://gist.github.com/leewc/e4c3a16551b06c2b0b4640fa5a3d9c00/

@yuki777
Copy link
Author

yuki777 commented Nov 5, 2021

@leewc

Thank you for sharing.
It looks nice!
I was thinking I have to write more, You wrote it all.
:)

@yuki777
Copy link
Author

yuki777 commented Nov 5, 2021

@leewc

I fixed it a bit!

  • Check profile argument, and use it.
  • Separate the regionParam() and profileParam()
script
#!/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 $@

@leewc
Copy link

leewc commented Nov 7, 2021

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.

@nickolay-kondratyev
Copy link

This is an awesome script! Can you put Appache2.0 license on it please. Thank you!

@yuki777
Copy link
Author

yuki777 commented Oct 26, 2022

@yuki777
Copy link
Author

yuki777 commented Oct 26, 2022

@nickolay-kondratyev

Arigato for the comment.
I've updated it.
I'm glad this script is helping you.

:)

@yuki777
Copy link
Author

yuki777 commented Jan 25, 2023

@leewc
@nickolay-kondratyev

A new version that may be more useful integrated by peco

@yuki777
Copy link
Author

yuki777 commented Jun 30, 2023

sssh is currently being maintained at pj8/sssh

@leewc
Copy link

leewc commented Jun 30, 2023

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