EC2 インスタンス名の一部からインスタンスに SSH over Session Manager でサクッと接続する


背景

EC2 インスタンス名の一部からインスタンス情報を瞬時に出す に記載した記事は単純に インスタンスの情報を返すだけだったが、そのまま接続もしてしまいたいなということで、スクリプトを少しカスタマイズしました。

前提

利用方法(準備)

以下のようなコマンドを実行します

$ cat <<'CONFIG' >> ~/.$(basename $SHELL)rc
function guess-connect() {
    function help() {
         cat <<EOT >&2
guess-ssm-connect <guess> <profile>

    <guess> ec2 インスタンスの tag:Name の文字列の一部を指定します
    <profile> aws-cli で指定するプロファイルがある場合は指定します (任意)

ex.
    1. guess-ssm-connect melon prod
    2. guess-ssm-connect panda
EOT
    }

    function sshconnect() {
        id=$(echo $1 | jq -r .id | head -1)
        ssh $id
    }

    if [ $# -eq 0 ]; then
        echo 引数は1つ以上指定してください >&2
        help
        return 1;
    fi

    GUESS=$1
    PROFILE=default
    if [ $# -ge 2 ]; then
        PROFILE="$2"
    fi

    declare -a instances

    i=1
    for instance in $(aws --profile $PROFILE \
        ec2 describe-instances \
        --filter "Name=tag:Name,Values=*$GUESS*" \
        --query 'Reservations[].Instances[].{id:InstanceId,name:Tags[?Key==`Name`].Value|[0]}' \
        | jq -Mc '. | sort_by(.name)| .[] | {"id":.id,"name":.name}')
        do
            instances[$i]=$instance
            let i++
        done

    if [ $i -eq 1 ]; then
        echo 接続するインスタンスはありません
        return 1
    fi

    if [ $i -eq 2 ]; then
        echo ${instances[1]} に接続します
        sshconnect ${instances[1]}
        return $?
    fi

    for ((i = 1; i <= ${#instances[@]}; i++)) {
        echo "ID $i) $(echo ${instances[i]}| jq -r .name)"
    }

    if [[ "$SHELL" =~ /zsh$ ]]; then
        read "REPLY?どのインスタンスに接続するか ID を入力してください(1 ~ $(expr $i - 1)): "
    else
        read -p "どのインスタンスに接続するか ID を入力してください(1 ~ $(expr $i - 1)): " REPLY
    fi

    echo "${instances[$REPLY]} に接続します"
    sshconnect ${instances[$REPLY]}
}
CONFIG

# SHELL をリロード
$ exec $SHELL -l

これで準備ができました。

接続してみる

接続先がヒットしない場合

[urabe@mac48 ~]$ guess-connect hoge    
接続するインスタンスはありません
[urabe@mac48 ~]$ echo $?
1
[urabe@mac48 ~]$ 

接続先が1つヒットした場合

[urabe@mac48 ~]$ guess-connect reda  
{"id":"i-03*****","name":"redash"} に接続します
Welcome to Ubuntu 18.04.1 LTS (GNU/Linux 4.15.0-1045-aws x86_64)

接続先が複数ヒットした場合

[urabe@mac48 ~]$ guess-connect web
ID 1) production-web
ID 2) stage-web
どのインスタンスに接続するか ID を入力してください(1 ~ 2): 1
{"id":"i-06*****","name":"production-web"} に接続します
Last login: Thu Sep 17 17:49:22 2020 from localhost

       __|  __|_  )
       _|  (     /   Amazon Linux AMI
      ___|\___|___|