GCEからのデータコピーあれこれ (Mac版)
皆さんこんにちは。知っている方はお久しぶりです。
インフラエンジニアからアプリケーションエンジニアに転生した0Delta(ぜろでるた)です。
GCE内で動くアプリを改修してほしいとの依頼を受け、いそいそとVMに入った直後に一つの疑問が浮かびました。
「どうやってデータをローカルへ引っ張ってくるんだ…?」
この記事はその時に調査した事をまとめた記事です。
目次
GCEからデータをコピーしたい時の手段
公式ドキュメントを見るとこう記載されています。(2019/5月現在)
Transfer from | To Linux instances | To Windows instances |
---|---|---|
Linux or macOS | ブラウザからのSSH gcloudコマンド SCP Cloud Storage |
Cloud Storage |
Windows | ブラウザからのSSH gcloudコマンド WinSCP Cloud Storage |
RDP Cloud Storage |
今回はMac版ですので、Macで使える方法を一つずつ紹介する他、
コレ以外の方法もありましたので順に紹介していこうと思います。
注意点として、操作端末から直接インスタンスにアクセスできることが前提となってます。
WANに接続されてないPCや、グローバルIPを持たないインスタンス等では利用することができませんのでご注意ください。
Tips : グローバルIPを持たない場合は?
Google Cloud Platform VPC か 踏み台インスタンス を使いましょう
詳細は本項では割愛します。詳しくは公式ドキュメントを参照してください。
手段その1 : gcloud compute scp
コマンド
$ gcloud compute scp インスタンス名:コピー元 コピー先
定番gcloud
コマンド。
基本的にファイル単位のコピーですが、--recurse
オプションでディレクトリもコピー可能です。
手段その2 : scp
コマンド
$ /usr/bin/scp -i /Users/user/.ssh/google_compute_engine user@インスタンスのグローバルIP:/home/user/test.txt /Users/user/Desktop/
こちらもおなじみscp
コマンド。ディレクトリコピーには-r
オプションが必要です。
scp
はgoogleのgの字も知らないコマンドですので、インスタンス名を指定することはできません。なのでgcloud compute instances list
なり何なりで外部IPを調べる必要がありますが……
実はgcloud compute scp --dry-run
を使うと一気に簡単になります。
$ gcloud compute scp --dry-run --zone=asia-northeast1-b --recurse test:/home/user/test.txt ~/Desktop/
/usr/bin/scp -r -i /Users/user/.ssh/google_compute_engine -o CheckHostIP=no -o HostKeyAlias=compute.3458021246149472209 -o IdentitiesOnly=yes -o StrictHostKeyChecking=yes -o UserKnownHostsFile=/Users/user/.ssh/google_compute_known_hosts user@35.187.198.241:/home/user/test.txt /Users/user/Desktop/
なんとそのまま使えるscpコマンドが出力されます。
インスタンスの外部IPもバッチリ記載されていますので、この出力をまるっとコピーして実行するだけです。簡単。
もしかしたらgcloud
コマンドは、このscpコマンドを作成するだけのプログラムであり転送部分はscpコマンドに丸投げしているのかもしれません。
手段その3 : rsync
コマンド
$ rsync -avn -e "ssh -i /Users/user/.ssh/google_compute_engine" インスタンスのグローバルIP:対象ファイルorディレクトリ 受信先ディレクトリ
インフラエンジニア達の強い味方rsync
。差分コピーも帯域制御も可能です。
直接実行は不可能ですが、それを補って余りある豊富なオプションが利用できます。
利用には、scp
コマンドを整形するのが一番手っ取り早いでしょう。
-i
オプション、-o
オプションとそれぞれの引数をまるっとコピー- グローバルIP含むコピー元とコピー先の指定もコピー(テキストファイルか複数コピーに対応した拡張機能を使いましょう)
rsync -av -e "ssh 1でコピーしたオプション軍" 2でコピーしたコピー元とコピー先
と組み上げて完成です
手段その4 :ブラウザからコピー
手順(長いので折りたたみ)
1. コンソールのVMインスタンスリストからSSHボタンをポチり
2. 出てきたウィンドウの右上にある歯車マークから、「UploadFile」を選択
3. ファイルの場所を絶対パスで指定すると
4. ブラウザの機能でダウンロードができる
コマンドに慣れている人にはちょっと手間ですが、やはりGUIであるのが最大の強みです。IT知識に乏しい相手に説明を行うのにこれほど大きなアドバンテージはありません。
しかし、ファイル転送速度は非常に遅いので注意。
設定ファイルのような数B-数KB程度のコピーであれば数秒とかからずダウンロードできますので、頭の片隅に覚えておいて損はないでしょう。
手段その5 : Cloud Storage を経由
#-- コピー元インスタンス内で --
$ gsutil mb gs://バケット名/適当なファイル名
$ gsutil cp コピー元 gs://バケット名/適当なファイル名
#-- コピー先PC内で --
$ gsutil cp gs://バケット名/適当なファイル名 コピー先
一回別サービスを経由する分手間ですが、どんなOSの組み合わせにも対応できる万能手法です。
ここではgsutil
を使った方法を紹介。
またNATを間に挟んでいたりグローバルIPを持っておらずとも、外向き通信が可能(WANに接続されている)ならファイル交換が可能という利点もあります。
速度比較してみる
せっかくなので速度を比較してみました。
うわっ…このデータコピー、遅すぎ…? といった悩みとは、コレでオサラバです。
前提
- Linux(CentOS7)インスタンス -> MacBook の下り速度
- 大きめの単体ファイルと、小さいファイル多数を内包するディレクトリのコピーを計測
- bashのtime関数を使って100回
gcloud
,scp
,rsync
の3パターン- 単体ファイルのみ、Webコンソールからのダウンロードも10回計測(手元の時計で頑張る)
結果
- 4MBのファイル単体をコピー
4MBx1 (単位:sec) gcloud scp rsync web console AVG 2.914 0.843 0.877 42.9 MAX 8.547 1.331 1.760 47 MIN 2.282 0.718 0.726 41 scpがトップ、rsyncが僅差で二位です。
webコンソールはかなり時間がかかっていますね。大きいファイルはコマンドでコピーする方が建設的のようです。
gcloudコマンドがscpより2秒ほど遅いという結果ですが。2秒で外部IPを取得できる人はなかなかいませんので、連続実行しない限りは実質最速かもしれません。 -
4KBのファイルが1024個入ったディレクトリをコピー
4Kx1024 (単位:sec) gcloud scp rsync web console AVG 16.589 13.599 1.166 – MAX 31.204 24.527 3.536 – MIN 13.005 11.267 0.810 – こちらはrsyncがダントツです。
これはrsyncが複数ファイルを並列してダウンロードする機能に長けている為だと思われます。
ディレクトリのコピーはrsyncで決まりですね。
環境
コピー元 | |
---|---|
ゾーン | asia-northeast-1 b |
マシンタイプ | n1-standard-1 (1 vCPU, 3.75 GB memory) |
OS | centos-7-c20190423 |
ディスク | 標準 10GB |
ネットワーク | プレミアム |
コピー先 | |
---|---|
マシン | MacBook Pro (13-inch, 2017) |
CPU / メモリ | Core i5 (2.3GHz) / 8GB |
OS | MacOS Mojave 10.14.4 |
ディスク | SSD 250GB |
ネットワーク | Wifi-5GHz (802.11ac) |
付録 : テストデータの作成
githubに上げてあります
まとめ
- 手軽さを求めるなら
gcloud compute scp
コマンド - 複雑な構造のデータ郡を送るなら
gcloud compute scp --dry-run
からのrsync
- マルチプラットフォームで使いたいなら
gsutil
あとがき
以上、GCPからデータをコピーする方法(Mac版)でした。
たかがデータコピー一つ ガンダムで押し返してやる! ここまで多彩な方法があったとは自分でも驚きました。 それぞれ独自の強みがありますので、上手く使い分けたいですね。
次はWindows版です。乞うご期待!