プライベートなEC2にファイルを転送したい~WinSCPとFileZilla~

記事タイトルとURLをコピーする

クラウドインテグレーション部の村上です。

パブリックIPアドレスを持たないEC2に、ローカルからファイルを転送したい場面ってありますよね。

今回は備忘も兼ねてその方法をまとめます。ファイル転送ツールはいくつかありますが今回はWinSCPとFileZillaをピックアップします。

やること

以下の図のように、プライベートサブネットにあるEC2にローカル端末からファイルを転送します。

f:id:swx-murakami:20210320084229p:plain

  • SCP
  • WinSCP
  • FileZilla
  • (おまけ)AWS Systems Manager

上記の方法でファイルを転送します。

まとめ

細かい手順は後述するとして、まずは簡単にまとめてみます。

方法 メリット デメリット
SCP ツールのインストールが不要 コマンドラインでの操作
WinSCP SSHトンネル経由でファイル転送が可能
GUIなので使いやすい
Windows端末のみ使用可能
FileZilla Macでも使える
GUIなので使いやすい
SSHトンネル経由でのファイル転送は非対応
AWS Systems Manager お手軽 マネージドインスタンスであることが必須

SCPでファイル転送

ファイル転送ツールは使わず、SCPコマンドで転送する方法です。

ただしOpenSSH クライアントが必要ですので、端末がWindowsでOpenSSH クライアントがない場合は追加する必要があります。OpenSSH クライアントの有無を以下のようにして確認します。

OpenSSH をインストールするには、[設定] を開始し、[アプリ] > [アプリと機能] > [オプション機能の管理] の順に選択します。 この一覧を確認して、OpenSSH クライアントが既にインストールされているかどうかを確認します。 https://docs.microsoft.com/ja-jp/windows-server/administration/openssh/openssh_install_firstuse

C:\%userprofile%\.ssh\configにホストを登録します。configファイルがなければ作成します。

#踏み台
Host bastion
  HostName 踏み台EC2のパブリックIP
  User ec2-user
  IdentityFile C:\踏み台EC2の秘密鍵.pem

#踏み台から接続するホスト
Host private-ec2
  HostName  private-ec2のプライベートIP
  User ec2-user
  IdentityFile C:\private-ec2の秘密鍵.pem
  ProxyCommand C:\Windows\System32\OpenSSH\ssh.exe -W %h:%p bastion

これでファイル転送の準備は完了です。コマンドプロンプトを開いて以下のようにファイルを転送します。ここではローカルにあるtest-file.txtをプライベートなEC2の/home/ec2-user/destinationdirに転送しました。

$ scp C:\path-to-file\test-file.txt private-ec2:/home/ec2-user/destinationdir
test-file.txt                                                                         100%    4     0.2KB/s   00:00

以上でSCPコマンドは終了です。

WinSCPでファイル転送

WinSCPは、Windows上で動くオープンソースでグラフィカルなFTP、FTPS、SFTPクライアントプログラムです。

WinSCPとは :: WinSCP

WinSCPを開き、セッションの設定を行います。

f:id:swx-murakami:20210320101215p:plain

次に[設定]をクリックして、踏み台EC2の設定をします。

f:id:swx-murakami:20210320101538p:plain

最後に認証の設定をします。

f:id:swx-murakami:20210320102622p:plain

[OK]をクリックし、ログインします。

あとは転送したいファイルをドラッグ&ドロップするだけです。

f:id:swx-murakami:20210320103046p:plain

以上で終了です。

WinSCPにはSSHトンネルを経由して目的のサーバへ接続する機能がありますので、WinSCP単体でファイル転送が完結するところがメリットです。

警告が表示される場合

なお、はじめて接続するサーバの場合、以下のような警告が表示されるかと思います。 f:id:swx-murakami:20210326224225p:plain

これは接続先のサーバの情報(公開鍵)がクライアント端末のレジストリエディタに記載されていないことに起因するものです(はじめて接続するので当然です)。

接続先のサーバを信頼する場合[はい]を押して接続します。

FileZillaでファイル転送

FileZillaもWinSCPのようなツールですが、Macでも使用可能です。

ただしWinSCPのようにSSHトンネルを経由してサーバへ接続する機能はありませんので、別途コマンドプロンプトを立ち上げてポートフォワードしておく必要があります。

OpenSSHクライアントを利用しますので冒頭で紹介した設定を行います。

  • OpenSSHクライアント機能の追加
  • C:\%userprofile%\.ssh\configにホストを登録

次にコマンドプロンプトで以下のようにポートフォワードしてプライベートなEC2に接続しておきます。

$ ssh -L 10022:localhost:22 private-ec2

ここまできたらFileZillaを起動します。[ファイル]→[サイトマネージャー]をクリックします。

サイトマネージャーで以下のように設定し、接続します。 f:id:swx-murakami:20210320113032p:plain

あとはドラッグ&ドロップでファイルを転送します。 f:id:swx-murakami:20210320113439p:plain

以上で終了です。

AWS Systems Managerでファイル転送

Systems Managerを使用してファイルを転送することも可能です。

ステップ 8: (オプション) Session Manager を通して SSH 接続を有効にする - AWS Systems Manager

ただし、EC2がマネージドインスタンスである必要があります。マネージドインスタンスになるための条件は以下を参照してください。

aws.amazon.com

まず以下のページのとおり、AWS CLI 用の Session Manager plugin をインストールします。

(オプション) AWS CLI 用の Session Manager plugin をインストールする - AWS Systems Manager

次に、C:\%userprofile%\.ssh\configに以下の設定を追加します。

# SSH over Session Manager
host i-* mi-*
    ProxyCommand C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe "aws ssm start-session --target %h --document-name AWS-StartSSHSession --parameters portNumber=%p"

ここまでこればファイルを転送できます。

$ scp -i C:\Users\user\Documents\additional-task.pem C:\Users\user\Documents\temp\test-file.txt ec2-user@i-0a97095cf3369b089:/home/ec2-user/destinationdir
test-file.txt                                                                         100%    4     0.1KB/s   00:00
$ ssh private-ec2 ls destinationdir
test-file.txt

確かにファイルが転送できていますね。

目的のEC2がマネージドインスタンスになっていて、コマンドでの転送でも構わないという場合はAWS Systems Managerを使った方が早そうです。

※補足※ Permission denied対策(2021年3月26日追記)

ここまではec2-userで接続し、/home/ec2-user配下のディレクトリにファイルを転送していました。

この場合パーミッション的に問題ないのでファイル転送できるのですが、例えば/var/www/htmlにファイルを転送する場合、そのままだとPermission deniedのエラーになります。

本記事ではこれを解決するため以下の設定をします。

  • ec2-userの所属グループを変更する
  • htmlディレクトリの所有グループにも書き込み権限を付与する

ec2-userの所属グループを変更する

例えば、htmlディレクトリが以下のように所有者・所有グループともにapacheに設定されていたとします。

[ec2-user@ip-10-123-20-252 ~]$ ls -l /var/www
drwxr-xr-x. 2 apache apache 24 Mar 26 22:25 html

ec2-userの所属グループを見てみると、以下のようにapacheグループには所属していません。

[ec2-user@ip-10-123-20-252 ~]$ groups ec2-user
ec2-user : ec2-user adm systemd-journal

そこでapacheグループにも所属するように設定します。

[ec2-user@ip-10-123-20-252 ~]$ sudo usermod -aG apache ec2-user
[ec2-user@ip-10-123-20-252 ~]$ groups ec2-user
ec2-user : ec2-user adm systemd-journal apache

これでec2-userはapacheグループに所属できました。

htmlディレクトリの所有グループにも書き込み権限を付与する

しかしec2-userをapacheグループに所属させただけでは不十分です。

もう一度htmlディレクトリのパーミッションを確認すると、所有者には書き込み・読み取り・実行権限(rwx)、その他には読み取り・実行権限(r-x)が付与されていることが確認できます。

[ec2-user@ip-10-123-20-252 ~]$ ls -l /var/www
drwxr-xr-x. 2 apache apache 24 Mar 26 22:25 html

ec2-userはapacheグループに所属しているので、書き込み権限が不足しています。

そこでhtmlディレクトリの所有グループにも書き込み権限を付与します。

[ec2-user@ip-10-123-20-252 ~]$ ls -l /var/www
drwxrwxr-x. 2 apache apache 24 Mar 26 22:25 html

所有グループの権限に書き込み権限が加わり、rwxと表示されていることが分かります。

これでファイル転送ができるようになります。

f:id:swx-murakami:20210326235440p:plain
WinSCPの場合

f:id:swx-murakami:20210327073358p:plain
FileZillaの場合

今回は以上になります。ありがとうございました。

村上博哉 (執筆記事の一覧)

2020年4月入社。機械学習が好きです。記事へのご意見など:hiroya.murakami@serverworks.co.jp