AWS-Systems-Manager

SSMセッションマネージャーでWinSCPを用いてEC2にファイルアップロードしてみた

はじめに

こんにちは、omkです。
今回はSSMセッションマネージャーでEC2に接続し、WindowsのマシンからSCPでファイルをアップロードします。
このときにCLIからアップロードするのではなく、WinSCPを用いてアップロードすることに挑戦します。

CLIで操作するよりもGUIの方が直感的で良い、GUIに慣れているという場合に本記事の内容が当てはまるかと思います。

セッションマネージャーでEC2に対してポートフォワーディングを行ってSCPの経路を作ることでこれを実現します。

セッションマネージャーとは

セッションマネージャーはセキュアにサーバに接続するためのサービスです。
例えばこれを用いることでセキュリティグループを開けずにSSHで接続できます。
今回のケースにおいてもSCPでファイルを転送するので通常はSSHと同じく22番ポートを開けることになりますが、セッションマネージャーを利用することでセキュリティグループを開けることなくファイルを転送出来ます。
もちろんSSHだけでなくRDPなど他のプロトコル(ポート)でも利用できます。

セッションマネージャーがどのようなサービスか、AWSコンパネやCLIからの接続に興味がある方はこちらをご覧ください。

導入

導入部分はおおよそ省略して記載します。セッションマネージャーの利用までの準備の詳細はこちらをご覧ください。
以降は都度、参考を案内します。

EC2準備

EC2を起動してセッションマネージャーが利用できる状態にします。

まずEC2インスタンスを起動します。
セッションマネージャーを利用するにはSSMエージェントをインストールする必要がありますが、「Amazon Linux2」のAMIを利用する場合、最初からSSMエージェントが入っているので今回はこれを用います。
その他のAMIからEC2を作成する場合はこちらが参考になります。

ネットワークはパブリックサブネットにパブリックIPを割り当てて最小限の準備で済むように配置します。
プライベートサブネットにインスタンスを置く場合はVPCエンドポイントの設置等が必要になりますのでご注意ください。

セキュリティグループに関しては通常であればSSHのポートを開ける必要がありますが、今回は開けずに進めます。(手動でエージェントをインストールする場合はログインして作業することになるので一時的に開ける必要があります)

次にセッションマネージャーを動かすためのIAMRoleを付与します。
IAMロールについてはこちらが参考になります。

これでEC2の準備は完了です。

SSM確認

SSMコンソールの「フリートマネージャー(旧マネージドインスタンス)」からエージェントがオンラインになっているインスタンスを確認することができます。
先ほど作成したインスタンスが一覧に含まれることをここで確認します。

次に、セッションマネージャでSSHできることを確認します。
コンソールから「セッションマネージャー」を選択して「セッションの開始」から作成したインスタンスを選択してサーバにログインします。

ここまでできていたらセッションマネージャーを利用することが出来る状態になっています。

WinSCPインストール

WinSCPをインストールします。
こちらからダウンロードします。
案内に沿ってインストールしてください。
インストール、使い方に関してはこちらの記事が参考になります。

AWSCLIインストール

AWSCLIをインストールします。
AWSCLIのインストールはこちらが参考になります。

CLIをインストールしたらクレデンシャルを付与します。
PowerShellかコマンドプロンプトで

> aws configure

と入力してIAMユーザーのアクセスキーやシークレットキー等を入力します。

これでAWSCLIのセットアップは完了です。

本題

AWSCLIでポートフォワーディング設定

では準備が整ったので本題に入ります。

AWSCLIからSSMセッションマネージャーでポートフォワーディングの設定を行い、それに沿ってSCPでファイルのアップロードを行います。

まず、ポートフォワードを設定します。
以下のコマンドを「コマンドプロンプト」もしくは「PowerShell」で入力し、ポートフォワードを行います。

> aws ssm start-session --target i-xxxxxxxx --document-name AWS-StartPortForwardingSession --parameters "portNumber=22,localPortNumber=6022"

--targetには接続するEC2のインスタンスIDを入力します。
--document-nameで指定している「AWS-StartPortForwardingSession」がポートフォワードを行う際の設定となります。
--parametersではポートを指定します。「localPortNumber」から接続先の「portNumber」のポートにフォワーディングします(ポートはご自由に)。

設定が行われると以下のように表示されます。

Starting session with SessionId: xxx-xxxxxxxxxx
Port 6022 opened for sessionId xxx-xxxxxxxxxx.

※2023年02月16日追記 出ないタイミングがあるっぽいです(出なくても大丈夫です)

手元の6022ポートが開けられていることがわかります。
これでポートフォワーディングの設定は完了です。

WinSCPから接続、ファイルアップロード

次にWinSCPから接続を行います。

WinSCPを起動し、「新しいセッション」から接続を開始します。
localhostの6022ポートがec2の22ポートにフォワーディングされているので、
プロトコルを「SCP」、
接続先を「localhost」、
ポートを「6022」、
ユーザーを「ec2-user」(AmazonLinux2なので)とします。

winscp0

「設定」の「SSH」「認証」からEC2の秘密鍵を指定します(鍵作成時のpem形式でなくppk形式なので注意)。

winscp1

「ログイン」を選択します。

winscp2

ログインできました。
「AWS-StartSSHSession」に慣れているとユーザーや鍵を指定してログインするのに違和感を覚えますが、今回はポートフォワードの口をセキュアに開けてくれているので、やっていることとしてはちょっとだけ違っているのでご愛嬌です。

接続が許可されると以下のように表示されます。

Connection accepted for session xxx-xxxxxxxxxxx.

試しにファイルを転送してみます。

winscp3

アップロードできました!

セッションマネージャーを切断するときは

> aws ssm terminate-session --session-id xxx-xxxxxxxxxx

のコマンドで切断できます。

まとめ

セッションマネージャーを用いてGUIのクライアントからSCPを使用できることを検証しました。
セッション自体はお決まりのコマンドを用意しておいて後は叩くだけなのでCLIの操作に慣れていないかたでも簡単に利用できますね(今回はGUIで操作する前提で行いましたがポートフォワードが行われた状態でCLIからでも転送できます)。

以上、お付き合いいただきありがとうございました。

他参考にさせていただいた記事

https://qiita.com/dnpds-nakaie/items/8792fe051d6d6ed4bb43
https://blog.serverworks.co.jp/tech/2019/09/11/ssm-portfowarding/
https://dev.classmethod.jp/articles/session-manager-launches-tunneling-support-for-ssh-and-scp/

返信を残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA