【小ネタ】1台のマネージドインスタンスを踏み台にして、多数のRasPiに選択メニューからsshするシェルを作ってみました

2020.09.17

1 はじめに

CX事業本部の平内(SIN)です。

Amazon Systems Manager のインスタンスがある場合、AWS-StartSSHSessionでsshすることが可能です。 また、sshコマンドには、-J でその先の端末に接続する機能があります。

この機能を利用すれば、下図のように1台のSSMのインスタンスを踏み台にしてLAN内の端末にsshすることが可能です。

作成したシェルを実行している様子です。

ssh2というコマンドを実行すると、接続先の一覧が選択できるようになっており、選択して目的の端末にsshします。

2 コマンド

この動作は、下記のコマンドを実行することで可能です。

$ ssh -J pi@mi-087c4fde5181b453d -o ProxyCommand="sh -c \"aws ssm start-session --target %h --document-name AWS-StartSSHSession --parameters \"portNumber=%p\" --p {profileName}\"" pi@{instance-id}

そして、接続先を選択できるようにしたものが、下記のシェルです。

#!/usr/bin/python3
import os
import inquirer
import subprocess

profile = 'developer'

hostList = {
    "raspi-001":"192.168.0.104",
    "raspi-002":"192.168.0.109",
    "raspi-003":"192.168.0.110",
    "raspi-004":"192.168.0.111",
    "raspi-005":"192.168.0.112",
}

targets=[]
for host in hostList:
    targets.append(host)

questions = [ 
    inquirer.List('host', 
       message="Where are you going?", 
       choices=targets
      ), 
] 
answers = inquirer.prompt(questions) 

ip = hostList[answers["host"]]
cmd = 'ssh -J pi@mi-087c4fde5181b453d -o ProxyCommand="sh -c \\"aws ssm start-session --target %h --document-name AWS-StartSSHSession --parameters \\"portNumber=%p\\" --p {}\\"" pi@{}'.format(profile,ip)
os.system(cmd)

実行権を付与して、パスの通ったところに置いておくと、何処から出利用可能です。

$ ls -la /usr/local/bin | grep ssh2
-rwxr-xr-x    1 hirauchi.shinichi  admin       768  9 17 14:06 ssh2

3 最後に

簡単ですが、SSMインスタンスを踏み台にしてSSHするシェルを書いてみました。

全部の端末にSSMエージェントを入れてしまえば、踏み台は必要ないのですが、今回は、1台だけしか無いと言う場合への適用例です。