【AWS】SSM Port ForwardingによるFTP,rsyncの並列転送
概要
AWS System Manager Sessions Manager Port Forwarding(以降SSM Port Forwarding)を使用して、FTPとrsyncで並列ファイル転送を行う方法を紹介します。
SSM Port Forwardingにより、ローカル端末とEC2間に確立されるSSM Session Manager Tunnelを使って、セキュアにファイル転送を行う事が可能となります。 しかし、SSM Port Forwardingの特性上、ポートが動的に変化するFTPパッシブモードや、複数ポートによる並列転送を行う場合、通信を確立するために工夫が必要となります。
本記事では、そのようなケースで必要となる設定上の工夫について説明します。
記載内容
- SSM Port Forwardingとは
- SSM Port Forwarding設定方法
- SSM Port ForwardingでFTP(pasv)を使うための工夫
- SSM Port Forwardingでrsyncを並列転送するための工夫
- Appendix 参考リンク
1.SSM Port Forwardingとは
SSM Port Forwardingは、ローカル端末とプライベートサブネットにデプロイされたインスタンス間にトンネルを安全に作成できる機能です。これにより、ローカル端末とEC2間で、SSH、RDP、FTP等の多様な通信が可能となります。 例えば、下記の様にプライベートサブネットにデプロイされたEC2へアクセスする際に、踏み台サーバが不要になります。
踏み台を使ったアクセス方法
SSM Port Forwardingアクセス方法
2.SSM Port Forwarding設定方法
SSM Port Forwardingを行うために必要な手順を説明します。
準備
①EC2とSSMとの間でHTTPS通信を行うためのVPCエンドポイントを作成します。
①-1.VPCとプライベートサブネットを作成します。
- VPCのenableDnsSupportとenableDnsHostnamesは有効にする
①-2.VPCエンドポイントにアタッチするセキュリティグループAを作成します。
- InboundでEC2からのHTTPS通信を許可
①-3.下記VPCエンドポイントを作成し、セキュリティグループAをアタッチします。
- "com.amazonaws.<リージョン>.ssm
- "com.amazonaws.<リージョン>.ssmmessages
- "com.amazonaws.<リージョン>.ec2
- "com.amazonaws.<リージョン>.ec2messages
②EC2でAWS SSMを利用する準備を行います。
- ②-1.セキュリティグループBを作成します。
- ②-2.EC2を作成し、セキュリティグループBをアタッチします。
- ②-3.SSMエージェントを導入します。(AWS提供のAMIを利用する場合は不要)
③以下のマネージドポリシーを付与したIAMロールを作成し、EC2にアタッチします。
- ポリシー: AmazonSSMManagedInstanceCore
Amazon EC2 の IAM ロール - Amazon Elastic Compute Cloud
④Client側にAWS CLIとSession Manager pluginをインストールします。
④-1.AWS CLIをインストールします。
の最新バージョンをインストールまたは更新するAWS CLI - AWS Command Line Interface④-2.Session Manager pluginをインストールします。
(オプション) AWS CLI 用の Session Manager プラグインをインストールする - AWS Systems Manager
接続
Clientのコマンドプロンプトで、"aws configure"コマンドで必要な設定をした後、以下のコマンドを発行し、EC2とのセッションを確立します。
※Client側のlocalPortNumber(任意)とEC2側のportNumber(sshなら22,RDPなら3389)でセッションが確立されます。
aws ssm start-session --target <instance-id> --document-name AWS-StartPortForwardingSession --parameters "portNumber=<port>,localPortNumber=<port>"
例:Tera TermでSSHをする場合は上述のコマンド実行時に"portNumber=22"を指定します。Tera Termの"TCPポート#(P):"には"localPortNumber"で指定した任意ポートを入力します。
3.SSM Port ForwardingでFTP(pasv)を使うための工夫
詳細は割愛しますが、FTPにはアクティブモードとパッシブ(pasv)モードの二つのモードがあり、パッシブ(pasv)モードは制御用に21番ポートを使用し、データ転送用のポートはランダムに設定されます。
一方、SSM Port Forwardingはサーバ側とクライアント側のポートを一つ一つ対応付けていくため、FTP(pasv)のようにランダムにポートを使用するプロトコルを使用する場合には、ランダムに使用される全てのポートで事前にトンネルを作成しておくといった工夫が必要になります。
ポイント
◆データコネクションで使用するポートを制限する。
◆aws ssm start-sessionコマンドで必要な数のデータコネクションを確立する。
アーキテクチャのイメージ
本記事で使用しているソフトウェア
- クライアント:Windows10 , FFFTP(ver2.00)
- サーバ:RHEL7.6 , vsftpd 3.0.2
※インストールやセットアップ方法は世の中にあふれていると思うので、割愛します。
FTP(pasv)の設定例
サーバ(vsftpd.conf)の設定
aws ssm start-sessionコマンドでポート指定する必要があるため、使用するデータ転送用ポートを制限します。- 設定ファイル例(抜粋)※データ転送用ポート範囲
pasv_min_port=40000 pasv_max_port=40003
並列度数分のセッションを張る
制御用ポートおよびデータ転送用として使用するポート数分のセッションを張ります。- コマンド実行例(制御用)
※portNumber,localPortNumberはお使いの環境に応じて変更してください。
aws ssm start-session --target <instance-id> --document-name AWS-StartPortForwardingSession --parameters "portNumber=21,localPortNumber=21"
- コマンド実行例(データ転送用)
※portNumber,localPortNumberはお使いの環境に応じて変更してください。
aws ssm start-session --target <instance-id> --document-name AWS-StartPortForwardingSession --parameters "portNumber=40000,localPortNumber=40000" aws ssm start-session --target <instance-id> --document-name AWS-StartPortForwardingSession --parameters "portNumber=40001,localPortNumber=40001" aws ssm start-session --target <instance-id> --document-name AWS-StartPortForwardingSession --parameters "portNumber=40002,localPortNumber=40002" aws ssm start-session --target <instance-id> --document-name AWS-StartPortForwardingSession --parameters "portNumber=40003,localPortNumber=40003"
- コマンド実行例(制御用)
クライアント(FFFTP)で並列実行
FFFTPは1プロセスで4セッションまで並列転送可能です。[特殊機能]タブ - [最大同時接続数]で指定。
※さらに並列度を上げる場合は、FFFTP自体を複数起動してください。
4.rsyncの設定方法
FTPと同様に、rsyncでもSSM Port Forwardingを用いた転送が可能です。
リモートでrsyncする場合、sshを使用するケースも多いですが、本投稿ではサーバのrsyncdに複数ポートを使用して並列転送を行う方法を紹介します。
ポイント
◆並列転送のために、rsyncdを複数異なるポートで起動する。その際、pidファイルの重複を避ける。
◆aws ssm start-sessionコマンドで必要な数のコネクションを確立する。
アーキテクチャのイメージ
本記事で使用しているソフトウェア
- クライアント:Windows10 , rsync 3.1.3 , cygwin 3.2.0
- サーバ:RHEL7.6 , rsync 3.1.2
※インストールやセットアップ方法は世の中にあふれていると思うので、割愛します。
rsyncで並列転送するための設定例
サーバの設定と起動
設定ファイル間でのプロセスIDファイルとログファイル名の重複を避けつつ、多重度数分の設定ファイルを作成します。- 設定ファイル例(抜粋)
※並列実行したい分だけファイルを複製してください。
設定ファイル1: rsync1.conf
pid file = /var/run/rsyncd1.pid log file = /var/log/rsyncd1.log [testrsync] path = /tmp
設定ファイル2 :rsync2.conf
pid file = /var/run/rsyncd2.pid log file = /var/log/rsyncd2.log [testrsync] path = /tmp
待ち受けポート番号をオプションとしたrsyncを、デーモンモードで並列実行します。
rsync --daemon --config=/etc/<設定ファイル> --port=10873 rsync --daemon --config=/etc/<設定ファイル> --port=10874
- 設定ファイル例(抜粋)
多重度数分のセッションを張る
- コマンド実行例
※並列実行したい分だけコマンドを実行してください。
aws ssm start-session --target <instance-id> --document-name AWS-StartPortForwardingSession --parameters "portNumber=10873,localPortNumber=10873" aws ssm start-session --target <instance-id> --document-name AWS-StartPortForwardingSession --parameters "portNumber=10874,localPortNumber=10874"
- コマンド実行例
クライアントでのrsync並列実行
- コマンド実行例
※並列実行したい分だけコマンドを実行してください。
rsync -av --progress --port=10873 --password-file=./rsyncd.passwd (※1) ./test1.txt (※2) rsync://rsync_user(※3)@localhost/testrsync (※4) rsync -av --progress --port=10874 --password-file=./rsyncd.passwd (※1) ./test2.txt (※2) rsync://rsync_user(※3)@localhost/testrsync (※4) ※1 サーバに作成したユーザのパスワードファイル ※2 転送するファイル ※3 サーバに作成したユーザ ※4 サーバの設定ファイルに記述したモジュール(転送ファイルは、サーバ設定ファイルの "path=" に格納されます)
- コマンド実行例
5.Appendix 参考リンク
- AWS Systems Manager エージェントの導入(Linux)
https://docs.aws.amazon.com/systems-manager/latest/userguide/sysman-install-ssm-agent.html - AWS Systems Manager エージェントの導入(Windows)
https://docs.aws.amazon.com/systems-manager/latest/userguide/sysman-install-ssm-win.html - System Manager CLI 拡張機能(Session Manager plugin)の導入
https://docs.aws.amazon.com/systems-manager/latest/userguide/session-manager-working-with-install-plugin.html - AWS Command Line Interface (CLI) の導入
https://aws.amazon.com/jp/cli/