ssh-over-ssm で Session Manager を通して EC2 インスタンスに SSH 接続する
awsSession Manager は単体でもコマンドを実行したりポートフォワーディングすることができるが –document-name AWS-StartSSHSession を渡すことで SSH接続 することもできる。 このドキュメントの中身は AWS-StartPortForwardingSession と同じく sessionType Port となっており、SSM Agent は対象のポートと TCP コネクションを確立する。
これにより scp でファイルをコピーしたり DB クライアントのような SSH ポートフォワーディングを行うツールを使うことができる。
通常のSSH接続と比べてポートを公開したり踏み台を用意する必要がなかったり IAM による権限管理を行えるという利点があるが、公開鍵をインスタンスに置いておく必要があることには変わりがない。 何か良い方法がないかと探していたら ssh-over-ssm というスクリプトを見つけた。 これは生成した鍵を Run Command で配置してから start-session するというもの。
$ git clone --depth=1 https://github.com/elpy1/ssh-over-ssm.git
$ cp ssh-over-ssm/ssh-ssm.sh ~/.ssh/
$ vi ~/.ssh/config
Match Host i-*
User ec2-user
ProxyCommand ~/.ssh/ssh-ssm.sh %h %r
IdentityFile ~/.ssh/ssm-ssh-tmp
StrictHostKeyChecking no
BatchMode yes
$ ssh i-xxxxxxxxxxxxxxxxx
接続元の IP アドレスを絞った Role で実行したところ Run Command が Access Denied になってしまったので外した。
ssh コマンド以外から呼ばれる場合は少し手を入れる必要があった。
ssh-over-ssm を ProxyCommand に設定して libssh の ssh_connect() するとタイムアウトしてしまう原因と解決法 - sambaiz-net