AWS CLIのDockerコンテナでSSM StartSessionを使ったポートフォワードができなかった話
背景
昨日AWS CLIのDockerコンテナを使用して、SSMを使用したインスタンスへの接続方法を色々試していました。
あとscpとかもできるようになったらうれしいなーと思い少し検証を進めてたのですが、ちょっと厳しそうだったのであきらめた話です。
やりたかったこと
試したこと
上記で乗せた記事の環境です。(多少パスが違いますが) そこで以下コマンドを実行し、sshのポートフォワードのセッションが張られたコンテナが起動している状態です。
$ docker run --rm -p 6022:6022 -it -v /opt/docker/awscli/.aws:/root/.aws awscli ssm start-session --target "i-xxxxxxxxxxxxxxxxxxxxx" --document-name AWS-StartPortForwardingSession --parameters '{"portNumber":["22"],"localPortNumber":["6022"]}' Starting session with SessionId: readonly-xxxxxxxxxxxxxxxxxxx Port 6022 opened for sessionId readonly-xxxxxxxxxxxxxxxxxxx. Waiting for connections... Connection accepted for session [readonly-xxxxxxxxxxxxxxxxxxx]
$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 5cd67455349b awscli "/usr/local/bin/aws …" 12 minutes ago Up 12 minutes 0.0.0.0:6022->6022/tcp, :::6022->6022/tcp objective_kepler
ここでリモートフォワードが設定されていたら、コンテナ外(コンテナホスト)から対象のコンテナに対してsshすればインスタンスに接続できるのかなーと思ってましたが、だめでした。
$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 5cd67455349b awscli "/usr/local/bin/aws …" 17 minutes ago Up 17 minutes 0.0.0.0:6022->6022/tcp, :::6022->6022/tcp objective_kepler $ ssh -i <key> ec2-user@172.17.0.2 -p 6022 ssh: connect to host 172.17.0.2 port 6022: Connection refused
コンテナにアクセスして、net-toolsをインストールしてポートを確認してみると、ローカルに対してしかListenしてないようです。それではできないのもしょうがないですね。 ちなみにコンテナにsshをインストールして、localのポートを指定したらちゃんと接続できました。
bash-4.2# netstat -ant Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 127.0.0.1:6022 0.0.0.0:* LISTEN tcp 32 0 172.17.0.2:52612 52.119.219.52:443 CLOSE_WAIT tcp 0 0 172.17.0.2:58144 52.119.220.97:443 ESTABLISHED tcp 0 0 172.17.0.2:37508 18.65.125.52:443 TIME_WAIT
なので、もしSSMのStartSesionを使用してscpをどうしてもしたいのであればコンテナ作成時にコピーしたいファイル(orディレクトリ)をバインドマウントして、コンテナからscpする手順になるのかなーと思ってます。ただscpとかはなんとなくできたらラッキーくらいで検証していたので、いったん後回しにします。 同じ考えをした人の参考程度になれば幸いです。