クラウドインテグレーション部の村上です。
パブリックIPアドレスを持たないEC2に、ローカルからファイルを転送したい場面ってありますよね。
今回は備忘も兼ねてその方法をまとめます。ファイル転送ツールはいくつかありますが今回はWinSCPとFileZillaをピックアップします。
- やること
- まとめ
- SCPでファイル転送
- WinSCPでファイル転送
- FileZillaでファイル転送
- AWS Systems Managerでファイル転送
- ※補足※ Permission denied対策(2021年3月26日追記)
やること
以下の図のように、プライベートサブネットにあるEC2にローカル端末からファイルを転送します。
- 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を開き、セッションの設定を行います。
次に[設定]をクリックして、踏み台EC2の設定をします。
最後に認証の設定をします。
[OK]をクリックし、ログインします。
あとは転送したいファイルをドラッグ&ドロップするだけです。
以上で終了です。
WinSCPにはSSHトンネルを経由して目的のサーバへ接続する機能がありますので、WinSCP単体でファイル転送が完結するところがメリットです。
警告が表示される場合
なお、はじめて接続するサーバの場合、以下のような警告が表示されるかと思います。
これは接続先のサーバの情報(公開鍵)がクライアント端末のレジストリエディタに記載されていないことに起因するものです(はじめて接続するので当然です)。
接続先のサーバを信頼する場合[はい]を押して接続します。
FileZillaでファイル転送
FileZillaもWinSCPのようなツールですが、Macでも使用可能です。
ただしWinSCPのようにSSHトンネルを経由してサーバへ接続する機能はありませんので、別途コマンドプロンプトを立ち上げてポートフォワードしておく必要があります。
OpenSSHクライアントを利用しますので冒頭で紹介した設定を行います。
- OpenSSHクライアント機能の追加
C:\%userprofile%\.ssh\config
にホストを登録
次にコマンドプロンプトで以下のようにポートフォワードしてプライベートなEC2に接続しておきます。
$ ssh -L 10022:localhost:22 private-ec2
ここまできたらFileZillaを起動します。[ファイル]→[サイトマネージャー]をクリックします。
サイトマネージャーで以下のように設定し、接続します。
あとはドラッグ&ドロップでファイルを転送します。
以上で終了です。
AWS Systems Managerでファイル転送
Systems Managerを使用してファイルを転送することも可能です。
ステップ 8: (オプション) Session Manager を通して SSH 接続を有効にする - AWS Systems Manager
ただし、EC2がマネージドインスタンスである必要があります。マネージドインスタンスになるための条件は以下を参照してください。
まず以下のページのとおり、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と表示されていることが分かります。
これでファイル転送ができるようになります。
今回は以上になります。ありがとうございました。