LoginSignup
1
2

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-09-18

背景

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
      ___|\___|___|
1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2