最近はsshではなくsession-manager-plguinを使い、Session Manager経由でインスタンス上で操作を行っています.
ただsession-manager-pluginを使って接続する時はインスタンスIDを毎回指定するのが面倒だったので、
インスタンスIDの代わりにインスタンス名を選択すれば良くなるラッパースクリプトを作りました.
何故、Session Managerを使うの?
そもそも何故、Session Managerを使うの?と疑問に思う方もいるので
Session Managerとsshを比べた時のPros/Consを書いておきます.
Pros
- (AWS上に)証跡を残すことができる
- インスタンスへ接続するための鍵管理をしなくてよい
- インスタンスへの接続制限をIAMポリシーで定義できる
- ssh用のインバウンド通信を許可しなくてよい
- どうしてもssh使いたい場合はSession Manager経由でsshも可能
Cons
- sshを利用するコマンドが愚直には使えない(scp)
- ブラウザ版を使っているとレスポンスが悪いときがある
- 接続後にログインシェルを起動しないとコマンド履歴が残らない
- インスタンス自身が外部と通信できるようにしなければならない(Public IPの割当やNat Gateway)
と個人的には感じています.
そのため、「開発をする想定でなければ事足りる」という判断で、Session Managerを使っています.
IAMとは別に接続用の鍵を管理するのはできればやりたくないです. ※1
ssm-session
このように事前にインスタンスIDを控えておく必要があるため、接続することになった時にリズムが崩れてしまいます.
私は開発でもオペレーションでもリズムを重視しているので、これは看過できません.
というわけでこれのラッパースクリプトを書きました.
シンプルなラッパースクリプトなので難しいことはしていません.
- インスタンス一覧を取得
- 取得した情報からインスタンス名とインスタンスIDのみを切り出す
- 2で切り出した情報をfzfで1つ選択する
- 選択したインスタンスにaws ssm start-sessionを行う
といった一連の操作をパイプで繋げるだけの簡単なスクリプトになっています.
使い方としては
ssm-session start
を実行すれば起動しているインスタンス一覧が出てくるのは、接続したいインスタンスを選択すれば後は接続してくれます.
大分お手軽になりました.
さいごに
今の所SSMの中でもSession Managerしか使っていないため、Documentを実行する時がきたら、名前やコマンドを見直すかもしれません.
また引数でインスタンスIDを受け取ったり、インスタンス名とインスタンスID以外の情報を出せるようにするかもしれません.
※1 EC2 Instance Connectでも十分ですが、ユースケースに応じて選択すればよいと思います.