ローカルの Linux または macOS システムから ECS の Linux インスタンスにファイルを転送する場合、scp、sftp、およびrsyncはよく利用されるコマンドラインツールです。このガイドでは、これらのツールを使い分け、効率的かつ安全にファイルを転送するためのベストプラクティスを紹介します。
転送ツールの選択
まず、シナリオに応じて最適なツールを選択します。
scp: 単一ファイルの迅速な転送に適しています。構文がシンプルで、習得が容易です。sftp: FTP のようなインタラクティブセッションを提供し、ファイルの参照、削除、名前変更などのファイル管理が可能です。rsync: ディレクトリの同期、バックアップ、または多数の小さなファイルの転送に適しています。差分アルゴリズムにより、非常に効率的です。不安定なネットワーク: 大容量ファイルを転送する場合は、
rsyncまたはsftpのレジューム機能 (転送が中断した場合、通信を再開する機能)を使用することを推奨します。
以下の表で、技術的な詳細を比較します。
手順
前提条件
ファイルを転送する前に、以下を確認してください。
インスタンスのパブリック IP アドレスの取得
ローカルコンピューターからファイルを受信するには、インスタンスにパブリック帯域幅が有効なパブリック IP アドレスを割り当てる必要があります。有効にした後、ECS コンソールの[インスタンス] ページで対象インスタンスのパブリック IP アドレスを確認・記録します。後続のすべてのコマンドでは、この IP アドレスを使用します。
セキュリティグループルールの設定
これらのツールは、デフォルトでポート 22 を使用する SSH プロトコルを介してファイルを転送します。インスタンスのセキュリティグループで、ローカル IP アドレスからのこのポートでのインバウンド TCP トラフィックが許可されていることを確認してください。
アクション: 許可
プロトコルタイプ: カスタム TCP
ポート範囲: 22/22 (またはカスタム SSH ポート)
送信元: セキュリティのため、これをローカルのパブリック IP アドレスに設定することを推奨します。
ローカルターミナルで
curl ifconfig.meまたはcurl ip.sbを実行することで、ご自身の IP アドレスを確認できます。
インスタンスの内部ファイアウォールの確認
インスタンスのオペレーティングシステム内のファイアウォール (
firewalldやufwなど) も接続をブロックする可能性があります。インスタンスにログインし、ファイアウォールのステータスを確認します。
ファイアウォールがアクティブな場合は、SSH サービスまたはポート 22 が許可されていることを確認してください。特定のポートまたはサービスを開くには、お使いのオペレーティングシステムの関連ドキュメントをご参照ください。
scp を使用したファイル転送
SCP (Secure Copy Protocol) は、ローカルコンピューターとリモートホスト間でファイルやディレクトリをコピーするための簡単なコマンドです。
インスタンスへのファイル・ディレクトリのアップロード
ファイルまたはフォルダーをインスタンスにアップロードするには、ローカルターミナルから次のコマンドを実行します。コマンド実行後、パスワードの入力を求められます。
# インスタンスに単一のファイルをアップロードする
sudo scp <local_file_path> <instance_username>@<public_ip_address>:<remote_directory_path>
# ローカルディレクトリをインスタンスにアップロードする
sudo scp -r <local_directory_path> <instance_username>@<public_ip_address>:<remote_directory_path>例:
ローカルファイル /opt/test.txt を、パブリック IP アドレスが 1xx.xxx.xxx.121 のインスタンスの /home/ecs-user/ ディレクトリにアップロードするには、次のコマンドを実行します。
sudo scp /opt/test.txt ecs-user@1xx.xxx.xxx.121:/home/ecs-user/インスタンスからのファイル・ディレクトリのダウンロード
インスタンスからローカルコンピューターにファイルをダウンロードするには、ローカルターミナルから次のコマンドを実行します。コマンド実行後、パスワードの入力を求められます。
注:scpは、多数の小さなファイルを転送する際には非効率的です。ファイルを単一の圧縮ファイル (.tar.gzなど) にアーカイブしてから転送するか、代わりにrsyncを使用することを推奨します。
# ローカルコンピューターに単一のファイルをダウンロードする
sudo scp <instance_username>@<public_ip_address>:<remote_file_path> <local_directory_path>
# インスタンスからローカルコンピューターにディレクトリをダウンロードする
sudo scp -r <instance_username>@<public_ip_address>:<remote_directory_path> <local_directory_path>例:
パブリック IP アドレスが 1xx.xxx.xxx.121 のインスタンスからファイル /home/ecs-user/test.txt をローカルの /opt/ ディレクトリにダウンロードするには、次のコマンドを実行します。
sudo scp ecs-user@1xx.xxx.xxx.121:/home/ecs-user/test.txt /opt/sftp を使用したインタラクティブなファイル転送
SFTP (SSH File Transfer Protocol) は、リモートサーバーでの高度なファイル管理を行うためのインタラクティブセッションを開始します。
インスタンスへの接続
sftp 接続を確立するには、ローカルターミナルで次のコマンドを実行します。接続すると、ターミナルのプロンプトが sftp> に変わります。
sudo sftp <instance_username>@<public_ip_address>インスタンスへのファイル・ディレクトリ全体のアップロード
# 単一ファイルをアップロードする
sftp> put <local_file_path> <remote_directory_path>
# ディレクトリ全体をアップロードする
sftp> put -r <local_directory_path> <remote_directory_path>例:
ローカルファイル
/opt/test.txtをインスタンスの/home/ecs-user/ディレクトリにアップロードする場合:sftp> put /opt/test.txt /home/ecs-userローカルディレクトリ
/opt/test/をインスタンスの/home/ecs-user/ディレクトリにアップロードする場合:sftp> put -r /opt/test/ /home/ecs-user/
インスタンスからのファイル・ディレクトリ全体のダウンロード
# 単一ファイルをダウンロードする
sftp> get <remote_file_path> <local_directory_path>
# ディレクトリ全体をダウンロードする
sftp> get -r <remote_directory_path> <local_directory_path>例:
インスタンスからファイル
/home/ecs-user/test.txtをローカルの/optディレクトリにダウンロードする場合:sftp> get /home/ecs-user/test.txt /optインスタンスからディレクトリ
/home/ecs-user/test/をローカルの/optディレクトリにダウンロードする場合:sftp> get -r /home/ecs-user/test/ /opt
転送の再開
大容量ファイルの転送が中断された場合は、reput (アップロード) コマンドと reget (ダウンロード) コマンドを使用して、中断した箇所から転送を再開できます。
# アップロードを再開する
sftp> reput <local_file_path> <remote_file_path>
# ダウンロードを再開する
sftp> reget <remote_file_path> <local_file_path>注: SFTP のレジューム機能は、単一ファイルに対してのみ有効です。ディレクトリ全体の転送が中断された場合は、sftpセッションを終了し、rsyncを使用して効率的に同期することを推奨します。
セッションの切断
タスクが完了したら、quitまたは byeコマンドを使用して、sftpセッションを終了します。
rsync を使用したファイル・ディレクトリの同期
rsync は、大規模、増分、または反復的な転送タスクに最適です。
ツールのインストール
ローカルコンピューターと ECS インスタンスの両方に rsync がインストールされていることを確認します。
# CentOS / Alibaba Cloud Linux の場合
sudo yum install -y rsync
# Debian / Ubuntu の場合
sudo apt-get update && sudo apt-get install -y rsync一般的なオプション
rsync の標準的な使用方法には、多くの場合 -avz オプションが含まれます。
-a(アーカイブ): アーカイブモード。-rlptgoDと同等です。再帰的に同期し、権限やタイムスタンプなど、すべてのファイル属性を保持します。-v(詳細): 転送プロセスの詳細情報を表示します。-z(圧縮): 帯域幅を節約するために、転送中にデータを圧縮します。ただし、高帯域幅リンクでは、CPU の圧縮がボトルネックになる可能性があり、-zを省略した方が速い場合があります。
本番環境向けの一般的なオプション
ECS インスタンスへのファイル・ディレクトリのアップロードまたは同期
ファイルをインスタンスにアップロードするには、ローカルコンピューターから次のコマンドを実行します。コマンド実行後、パスワードの入力を求められます。
sudo rsync -avz -e ssh <local_path> <logon_username>@<public_ip_address>:<remote_path>例:
ファイル
/opt/test.txtを、パブリック IP アドレスが1xx.xxx.xxx.121のインスタンスの/home/ecs-userディレクトリにアップロードする場合:sudo rsync -avz -e ssh /opt/test.txt ecs-user@1xx.xxx.xxx.121:/home/ecs-userローカルディレクトリ
/opt/test/を、パブリック IP アドレスが1xx.xxx.xxx.121のインスタンスの/home/ecs-user/testディレクトリと同期する場合sudo rsync -avz -e ssh /opt/test/ ecs-user@1xx.xxx.xxx.121:/home/ecs-user/test
インスタンスからのファイル・ディレクトリのダウンロードまたは同期
インスタンスからローカルコンピューターにファイルをダウンロードするには、ローカルで次のコマンドを実行します。コマンド実行後、パスワードの入力を求められます。
sudo rsync -avz -e ssh <instance_username>@<public_ip_address>:<remote_path> <local_path>本番環境での適用
多数の小さなファイルの処理: まずアーカイブしてから転送
数千もの小さなファイルを含むディレクトリの転送は、ファイルごとの接続とメタデータのオーバーヘッドのため、どのツールを使っても非効率です。ベストプラクティスとして、まず転送元でディレクトリを単一のファイル (
.tar.gzなど) に圧縮します。次にそのファイルを転送し、転送先でファイルを解凍します。SSH 設定ファイルによるコマンドの簡素化
ローカルの
~/.ssh/configファイルで、ECS インスタンスのエイリアス (例:my-prod-server) を作成することで、接続および転送コマンドを簡略化できます。# ~/.ssh/config に以下を追加します Host my-prod-server HostName 118.178.x.x User ecs-user Port 22 IdentityFile ~/.ssh/id_rsa_aliyun ServerAliveInterval 60これにより、
scpコマンドとrsyncコマンドが簡素化されます。# 元のコマンド: sudo scp -i ~/.ssh/id_rsa_aliyun local.txt ecs-user@118.178.x.x:/remote/ # 新しいコマンド: sudo scp local.txt my-prod-server:/remote/ # 元のコマンド: sudo rsync -avz -e "ssh -i ~/.ssh/id_rsa_aliyun" local_dir/ ecs-user@118.178.x.x:/remote_dir/ # 新しいコマンド: sudo rsync -avz local_dir/ my-prod-server:/remote_dir/
よくある質問
特定のポートを使用してファイルを転送するにはどうすればよいですか?
scp:
scp -P <ポート番号> ...のように、-Pオプション (大文字) を使用します。sftp:
sftp -P <ポート番号> ...のように、-Pオプション (大文字) を使用します。rsync:
rsync -avz -e "ssh -p <ポート番号>" ...のように、-eオプションで SSH のポートを指定します。
キーペアを使用してインスタンスに接続するときに、秘密鍵ファイルを指定するにはどうすればよいですか?
scp: scp -i <秘密鍵ファイルのパス> ...のように、
-iオプションを使用します。sftp: sftp -oIdentityFile=<秘密鍵ファイルのパス> ...のように、
-oIdentityFileオプションを使用します。rsync:
rsync -e "ssh -i <秘密鍵ファイルのパス>" ...のように、-eオプションで SSH の秘密鍵を指定します。
関連情報
ECS インスタンスにアップロードした重要なファイルをバックアップするには、「スナップショットの作成」をご参照ください。
Windows インスタンスにファイルをアップロードする必要がある場合は、他のファイル転送方法を使用できます。詳細については、「ファイル転送方法の選択」をご参照ください。
Windows から Linux インスタンスにファイルを転送するには、WinSCP などのツールを使用します。詳細については、「WinSCP を使用して、オンプレミスの Windows コンピューターから Linux インスタンスにファイルをアップロードする」をご参照ください。