[小ネタ] WinSCPをAWS Systems Managerセッションマネージャーと組み合わせて利用する

2022.09.14

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

しばたです。

以前Windows環境においてAWS Systems Managerセッションマネージャーを使ってSSHとSCPを行う記事を書きました。

上記記事ではOpenSSHクライアント(ssh.exe, scp.exe)をAWS Systems Managerと連携させていますが私は普段WinSCPもそれなりに使います。

本記事ではAWS Systems ManagerとWinSCPを組み合わせて使う方法を紹介します。

検証環境

今回は私の開発用PC(64bit版 Windows 10 Pro Ver.21H1)からPrivateサブネットにあるAmazon Linux 2 EC2にSSMを使い接続するシナリオとしています。
開発用PCには以下のツールをインストール済みです。

  • 最新のAWS CLI (Ver.2.7.30)
    • AWS環境へ接続可能な初期設定済み
  • 最新のSession Manager Plugin (Ver.1.2.339.0)
  • 最新のWinSCP (Ver.5.21.3)

また、EC2側は以下の設定としています。

  • 東京リージョンにVPC環境を用意
  • AMIは最新のものを使用 (ami-0b069de314c9ab4c4 : amzn2-ami-hvm-2.0.20220805.0-x86_64-gp2)
  • キーペアはec25519のpem形式の鍵を使用
    • WinSCPで使う際は要変換
  • SSMを利用可能にするための所定のIAMロールをアタッチ済み + インターネットアクセスを確保

最初に採った方法

私は最初「SSMではポートフォーワードができるからそれとWinSCPを組み合わせ使えば良いかな?」と思い、以下の様な感じでPowerShellコンソールからaws ssm start-sessionコマンドを使ってポートフォーワードのセッションを実行、

# PowerShellコンソールからポートフォワード(22 → 22000)を実行
$PROFILE_NAME = 'your_profile'
$INSTANCE_ID = 'i-123456789012'  
aws ssm start-session --target $INSTANCE_ID `
  --document-name AWS-StartPortForwardingSession `
  --parameters '{\"portNumber\":[\"22\"],\"localPortNumber\":[\"22000\"]}' `
  --profile $PROFILE_NAME

この状態でlocalhost:22000へ接続することでWinSCPとSSMを連動させました。

(PowerShellコンソールでポートフォーワードしたうえでlocalhost:22000へ接続)

結果としてはこれで問題なく対象EC2インスタンスに接続しファイルの送受信が出来る様になります。

ただ、正直なところ少しめんどうくさいです。

公式の方法

もう少しスマートに連携させる方法は無いかと調べてみたところ公式サイトに普通に連携方法が記載されていました。

WinSCPではプロキシ設定の設定において独自のコマンドを「ローカルプロキシコマンド」として設定することが可能であり、要はOpenSSHのProxyCommandと同様の対応が可能となります。

まずはWinSCPの新しい接続情報を作成し、ホスト名にインスタンスID、ポート番号を22にした上で「設定」ボタンから高度なサイト設定に移動します。

高度なサイト設定の「接続→プロキシ」を選びプロキシ形式を「ローカル」にするとプロキシコマンドを設定可能になるので以下の様にaws ssm start-sessionコマンドを指定してやります。

# --region 指定は必要に応じて行ってください
aws ssm start-session --target %host --document-name AWS-StartSSHSession --parameters "portNumber=%port" --profile "your_profile"

上記のうち%hostは接続先(インスタンスID)、%portは接続ポートに変換されます。
--profileパラメーターの値は利用するAWSプロファイル名を記載してください。

あとは鍵認証の設定などを環境に応じて行い接続してやればOKです。

(秘密鍵は.ppk形式に要変換)

これでよりスマートにEC2インスタンスに接続することができました。

ちなみにデバッグログを確認するとこんな感じでプロキシコマンドを実行の上当該EC2インスタンスに接続しているのが分かります。

・・・前略・・・

. 2022-09-14 13:53:44.024 Session name: ec2-user@i-0f843b8666d04dc15 (Ad-Hoc site)
. 2022-09-14 13:53:44.024 Host name: i-0f843b8666d04dc15 (Port: 22)
. 2022-09-14 13:53:44.024 User name: ec2-user (Password: No, Key file: Yes, Passphrase: No)
. 2022-09-14 13:53:44.024 Tunnel: No
. 2022-09-14 13:53:44.024 Transfer Protocol: SCP
. 2022-09-14 13:53:44.024 Ping type: Off, Ping interval: 30 sec; Timeout: 15 sec
. 2022-09-14 13:53:44.024 Disable Nagle: No
. 2022-09-14 13:53:44.024 Proxy: Cmd
. 2022-09-14 13:53:44.024 HostName: proxy (Port: 80); Username: ; Passwd: No
. 2022-09-14 13:53:44.024 Local command: aws ssm start-session --target %host --document-name AWS-StartSSHSession --parameters "portNumber=%port" --profile "xxxxxxxx"

・・・中略・・・

. 2022-09-14 13:53:44.115 Starting local proxy command: aws ssm start-session --target i-0f843b8666d04dc15 --document-name AWS-StartSSHSession --parameters \"portNumber=22\" --profile \"xxxxxxxx\"
. 2022-09-14 13:53:44.123 We claim version: SSH-2.0-WinSCP_release_5.21.3
. 2022-09-14 13:53:44.123 Connected to i-0f843b8666d04dc15
. 2022-09-14 13:53:45.549 Waiting for the server to continue with the initialization
. 2022-09-14 13:53:45.844 Waiting for the server to continue with the initialization
. 2022-09-14 13:53:45.844 Remote version: SSH-2.0-OpenSSH_7.4
. 2022-09-14 13:53:45.844 Using SSH protocol version 2
. 2022-09-14 13:53:45.874 Waiting for the server to continue with the initialization
. 2022-09-14 13:53:45.874 Waiting for the server to continue with the initialization
. 2022-09-14 13:53:45.875 Doing ECDH key exchange with curve Curve25519 and hash SHA-256

・・・後略・・・

最後に

簡単ですが以上となります。
まずはちゃんと公式サイトを調べようというオチでした。