クラウド同上

GCEからのデータコピーあれこれ (Mac版)

Author
0Delta
Lv:1 Exp:549

インフラエンジニアからWebエンジニアに転生した人。
GCPについては初心者です。

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コマンドを整形するのが一番手っ取り早いでしょう。

  1. -iオプション、-oオプションとそれぞれの引数をまるっとコピー
  2. グローバルIP含むコピー元とコピー先の指定もコピー(テキストファイルか複数コピーに対応した拡張機能を使いましょう)
  3. 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のファイル単体をコピー
    bench_result_big.svg

    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個入ったディレクトリをコピー
    bench_result_many.svg

    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版です。乞うご期待!

次の記事を読み込んでいます
次の記事を読み込んでいます
次の記事を読み込んでいます
次の記事を読み込んでいます