本日も乙

ただの自己満足な備忘録。

pecoとEC2 APIを使って踏み台経由のSSHログインを楽にする

ほんのちょっとしたbashコマンドですが、社内で評判が良かったので。

おそらくみんなが抱えているであろう悩み

  • Auto Scalingや作り直しなどでEC2インスタンスがコロコロ入れ替わるのでホスト名を覚えきれない・うろ覚え
  • EC2インスタンスにSSHログインしようとしてもホスト名が思い出せないので毎回マネジメントコンソールでNameタグかプライベートIPアドレスを調べる *1

こんな感じにします。

VPC内のEC2インスタンス一覧を表示して選択したものにSSHログインできるようにしてみます。

https://contents.blog.jicoman.info/2018/04/ec2-ssh.gif

解決手順

踏み台サーバとなるEC2インスタンスのIAMロールは ec2:DescribeInstances の権限が必要なので付与させます。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "ec2:DescribeInstances",
            "Resource": "*"
        }
    ]
}

以下は踏み台サーバにログイン後に作業します。

peco をインストールします。pecoとはインタラクティブにフィルタをかけることができるコマンドラインツールです。自分でビルドしてインストールもできますが、今回はリリースページからバイナリをダウンロードして /usr/local/bin/peco として配置しておきます。

$ wget https://github.com/peco/peco/releases/download/v0.5.3/peco_linux_amd64.tar.gz
$ tar zxf peco_linux_amd64.tar.gz  && rm -f peco_linux_amd64.tar.gz
$ sudo chown root:root peco_linux_amd64/peco && sudo mv peco_linux_amd64/peco /usr/local/bin/
$ rm -rf peco_linux_amd64
$ peco --version
peco version v0.5.3 (built with go1.10)

aws cliを使うのでインストールしていなければ入れておきましょう。

$ curl "https://bootstrap.pypa.io/get-pip.py" -o "get-pip.py"
$ sudo python get-pip.py
$ sudo /usr/local/bin/pip install awscli
$ aws --version
aws-cli/1.15.4 Python/2.7.5 Linux/3.10.0-693.11.6.el7.x86_64 botocore/1.10.4

jqも使うので入れておきます。

$ sudo yum install jq

/etc/bashrc に次のような関数を追記します。

function ec2-ssh() {
  local user="ec2-user"
  local host=$(aws ec2 describe-instances --region ap-northeast-1 --output json --filters "Name=instance-state-code,Values=16" | jq -r '.Reservations[].Instances[] | [.Tags[] | select(.Key == "Name").Value][] + "\t" +  .InstanceType + "\t" + .PrivateIpAddress + "\t" + .Platform' | awk '{if ($4 != "windows") printf "%-45s %-15s %-10s\n",$1,$2,$3}' | sort | /usr/local/bin/peco | awk '{print $3}')
  ssh "$user@$host"
}

ログインを試す

踏み台サーバにログイン後、ec2-ssh と打ちましょう。 ログイン可能(=起動している)Linuxサーバの一覧がでてきます。 インクリメンタルサーチで単語を入力するとマッチしたEC2インスタンスが絞り込まれていきますので、SSHしたいホストをEnterで選択すると接続に入ります。 絞り込みは完全一致ではなくて、単語レベルで可能です。スペースを入れることでAND検索ができます。

最後に

ちょっとした工夫で開発者が使いやすくなるので日頃からどんどん工夫していくようにしていきたいですね。

*1:NameタグをRoute53のPrivate DNSに登録しているので、Nameタグに書かれているホスト名でSSHログインできるように仕組みをいれています