🔄

EC2とファイル送受信する方法 /AWS Systems Manager セッションマネージャーを使うけど鍵は使わずncで実現

2024/12/22に公開

EC2とファイル送受信する方法です。
AWS Systems Manager セッションマネージャーを使うけど鍵は使わずncで実現します。

なぜやるか

SCPでファイル転送する方法はよく紹介されているけど、SCPによるファイル転送を行うためにはSSH鍵を準備する必要がある。
鍵の作成が不要である所もAWS Systems Manager セッションマネージャー の利点だと思っているので、ファイル転送のためだけに鍵を準備するのは行いたくない。

SCPで行う場合はクラスメソッドの記事がわかりやすい

AWS Systems Manager セッションマネージャーでSSH・SCPできるようになりました
$ scp -i ~/path/to/key.pem foo.txt ec2-user@i-12345:~/
https://dev.classmethod.jp/articles/session-manager-launches-tunneling-support-for-ssh-and-scp/

どうやるか

次のgistで紹介されているncを使って実現します。

https://gist.github.com/lukeplausin/4b412d83fb1246b0bed6507b5083b3a7

手順

ほぼ同じ手順だけど、送信と受信の手順を以下に記載します。
手順ではテキストファイルを送受信しているが、tar.gzファイルなどのテキストファイル以外も送受信可能です。

送信(ローカルPCからEC2インスタンスへ)

 # ssmで送りつける先のEC2に接続する
 aws ssm start-session --target i-1234567890
 
 # EC2側でncのインストールを行う
 sudo yum install nc -y
 
 # 念のためホームディレクトリに移動してから
 # ncをLISTENモードで起動して1234ポートでリクエストを待つ
 # 届いたデータはoutput.txtに出力する
 sudo nc -l -p 1234 > ~/output.txt
  
 # 新しいローカルシェルを開いて、SSMを使ったポートフォワードを起動する
 # portNumberは前のncコマンドで指定した1234と合わせること
 aws ssm start-session --target i-1234567890 --document-name AWS-StartPortForwardingSession --parameters '{"portNumber":["1234"],"localPortNumber":["1234"]}'
 
 # また新しいローカルシェルを開いて、送りたいファイルのデータをncコマンドに流す
 nc -w 3 127.0.0.1 1234 < sendfile.txt
 
 # 最初のシェルに戻ってncコマンドをCtrl-cで止める
 # ホームディレクトリにoutput.txtができあがっている
 ls ~/

受信(EC2インスタンスからローカルPCへ)

 # ssmで送りつける先のEC2に接続する
 aws ssm start-session --target i-1234567890
 
 # EC2側でncのインストールを行う
 sudo yum install nc -y
 
 # sendfile.txt を送信する
 sudo nc -l -p 1234 < ~/sendfile.txt
  
 # 新しいローカルシェルを開いて、SSMを使ったポートフォワードを起動する
 # portNumberは前のncコマンドで指定した1234と合わせること
 aws ssm start-session --target i-1234567890 --document-name AWS-StartPortForwardingSession --parameters '{"portNumber":["1234"],"localPortNumber":["1234"]}'
 
 # また新しいローカルシェルを開いて、EC2から送られてきているデータを受信する
 nc -w 3 127.0.0.1 1234 > output.txt
 
 # 最初のシェルに戻ってncコマンドをCtrl-cで止める
 # ホームディレクトリにoutput.txtができあがっている
 ls ~/

Discussion