Androidはワンツーパンチ 三歩進んで二歩下がる

プログラミングやどうでもいい話

【4】GCP(GCE)のVMインスタンスにファイルを転送する(Cyberduck, scpコマンド)

これはHerokuからGCP無料枠にRailsアプリを引越ししたときにやったことシリーズの【3】の続きです。
GCE に 作成した VM インスタンスに Docker などのインストールをし、設定を行ったところです。
今回はソースコードや設定ファイルなどを転送する方法について書いてみたいと思います。

1. 公式サイト

2. 目標

3. 注意点

4. 参考サイト様

本当に参考になりました。ありがとうございます!

5. ファイル転送方法の種類

GCE のインスタンスにファイルを転送する方法としては次の項目が代表的なものとして挙げられます。
CIなどを使用しているケースはここでは扱いません。

私は Github からソースコードを pull しています。
.gitignore に入っているような.envmaster.keyファイルなどは Cyberduck を使って転送しています。
今の所これで事足りています。

当エントリでは Cyberduck と scp コマンドを使う方法について触れてみたいと思います。

6. Cyberduck(Mac)を使う

前提としてCyberduck 公式サイトからダウンロードしてインストールされているとします。
私の PC が Macbook なので Mac 前提で説明いたします。

起動後、左上の「新規作成」ボタンをクリックします。

f:id:sakura_bird1:20190308004327p:plain:w400

ダイアログの転送方法のリストから、
「SFTP(SSH による暗号化 FTP)」を選択します。

以下の項目を入力し、「接続」ボタンをクリックします。

項目 入力内容
サーバ GCE のインスタンスの外部 IP アドレス
ポート 22 番を塞いだ代わりに開けたポート番号※このシリーズ【2】参照
ユーザー名 SSH 接続する時のユーザー名
SSH Private Key ~/.ssh/[SSH ログインの時に使う認証鍵の名前]

f:id:sakura_bird1:20190308005834p:plain:w400

接続できるとユーザーのディレクトリが表示されます。

f:id:sakura_bird1:20190308021409p:plain:w400

デフォルトだと隠しファイルは表示されないので、
「表示」→「不可視ファイルを表示」と
「環境設定」→「ブラウザ」→「'.'で始まるファイルを表示」にチェックしておくとよいです。

これでファイル転送したり、ディレクトリを作ったり出来るようになりました。
ファイルを転送する場合、画面の上の方の「アクション」ボタンを押して
「アップロード」を選択するとできます。

7. Linux の scp コマンドを使う

ローカルのファイルをリモートにコピーする時はこのような書式になります。

scp ファイル名 接続先:パス名

次の例のように実行できます。
ここで使っているオプションは次の通りです。
・ -i は秘密鍵ファイル
・ -P はポート番号
・ -r はディレクトリ内のデータを再帰的にコピーする

$scp -i ~/.ssh/google_compute_engine -P 40022 test.txt sakura@[GCEの外部IPアドレス]:./

カレントディレクトリのtest.txtを sakura ユーザーのディレクトリの直下にコピーしています。

$scp -i ~/.ssh/google_compute_engine -P 40022 -r test sakura@[GCEの外部IPアドレス]:./

カレントディレクトリのtestディレクトリと配下のデータを sakura ユーザーのディレクトリの直下にコピーしています。

8. ファイル転送のパーミッション

Cyberduck でも scp コマンドでも、何もしないとファイルを転送する時は SSH 接続したユーザーのディレクトリ配下にしか転送出来ません。
他のディレクトリに転送しようとするとパーミッションエラー(Permission denied)になるからです。

自分一人でサーバーを使っている分にはディレクトリのパーミッションを 777 に変更してしまうのが手っ取り早いやり方だと思います。

$sudo chmod -R 777 /home/test

複数の人が使っている場合は(絶対に運用ルールを決めるべきですが)
777 にするよりは、一時的に root 権限でログインし、ファイルをユーザーディレクトリ → コピー先にコピーする
という方法のほうがいいかなあという気がします。

今回はこれで終わりです。
次回はサーバー上でDockerコンテナを動かしてみたいと思います。

9. 関連リンク