LoginSignup
27
20

More than 5 years have passed since last update.

GCPのVMインスタンスでSFTP接続する方法

Last updated at Posted at 2018-09-05

  

ちょっと詰まったからやったことのまとめ

環境

  • MacBookPro 13
    • macOS High Sierra 10.13.3
    • 使ったFTPクライアントのアプリ
      • Cyberduck
    • Python 2.7.10 / 3.6.5
  • GCP VMインスタンス
    • Ubuntu 16.04.5 LTS (GNU/Linux 4.15.0-1018-gcp x86_64)

やること・やったこと

「GCPで作ったサーバーにFTP接続したい!!!」

前提として、VMインスタンスを作っている後の話しから始めます。
作り方については、下記リンク先の内容を参考にさせていただきましたm(_ _)m

 

Google Cloudの公式ページにある、インスタンスへのファイルの転送Linux ワークステーションまたは macOS ワークステーションのファイル ブラウザを使用したファイルの転送に書かれていることをそのままやるんですが、1点気づかぬ設定があったので、わかりやすいように各設定を細かく解説していきます。

①SSH認証鍵の設定

いつもの設定って感じですね。わからない人は公式の新しい SSH 認証鍵を作成するを見ながら、macとgcpで公開キーの設定をします。

②Ubuntuを一度確認

GCPの管理画面のVMインスタンスから「ブラウザ ウィンドウで開く」ってやつを選択するとブラウザ上でターミナル/コマンドプロンプトのようなコマンドラインツールが開きます。
マジか!?GCPスゲェー!!ってなったんですが触ってるとクソ重くって、一瞬で天と地が逆転したような評価になってしまったw
おそらくWebRTCみたいな感じだと思うんで、手元の環境からSSH接続して操作した方が良いです。

  

↓「ブラウザ ウィンドウで開く」
スクリーンショット 2018-09-04 22.21.24.png

↓VMインスタンスのコマンドラインツール
f8d73658-36a6-00c0-f9e3-e8fa89fffbdb.png

③Cyberduckの設定

どうも公式によるとLinux系のサーバーであればSFTP接続が普通にできるとのこと。
上記のドキュメントで解説されている

sftp://[USERNAME]@[IP_ADDRESS]/home/[USERNAME]
  • [USERNAME] は、そのインスタンスでのユーザー名です。
  • [IP_ADDRESS] は、インスタンスの IP アドレスです。

の内容を元にCyberduckに新規登録して見る。

スクリーンショット 2018-09-06 0.11.57.png

コマンドラインツール上を見るとわかる通り、grem_takuya0223という名前がユーザー名になっていたのでそのまま設定しました。
ちなみにgrem_takuya0223は、VMインスタンスを作る際にGCP側でメールアドレスを元に勝手に作られたユーザー名になっています。

④ログイン失敗

ずっとこの状態で何が悪いのかわからなくなりました。
これが原因でvsftpdとか入れて遠回りのことをやりましたが、「Connecting...」から帰ってこないなど、余計に混乱して、結局改めて設定を見直すことにしました笑汗

スクリーンショット 2018-09-06 0.16.36.png

vsftpd

⑤再設定

そもそも設定する内容として「公開キーの設定」「IPアドレス」「ユーザー名」の3つで、公開キーが間違えることはなかったので、となるとIPとユーザー名を見直すことに。
まず、IPアドレスで管理画面上には、「プライマリ内部 IP」と「外部 IP」の2つありますが、ここで内部IPを使うことありえないので設定はあっていることに。
では、あとはユーザー名で改めてインスタンスでのユーザー名を見ると「どこを指しているんだ?」とわからなくなりました笑

インスタンス内のユーザー名なのか
それともGCPのアカウント名なのか

先ほどGCPがメールアドレスから勝手にユーザー名を作ったと言いましたが、正確にはgrem.takuya0223@...でした。
なので、Cyberduckの設定上のユーザー名に設定していたgrem_takuya0223grem.takuya0223に変えてみたところ...正常に接続できましたwww

↓再設定
スクリーンショット 2018-09-05 23.33.01.png

↓SFTP接続成功
スクリーンショット 2018-09-06 0.33.41.png

まとめ

インスタンスでのユーザー名は、GCPのアカウントIDでした。
まぁ、メールアドレス内にドットが入っていない人には関係ない話だと思います^^;

  

追記: 2018/09

上記の設定から特定の開発環境で扱えるFTP/SFTPクライアントのツール作りを進めていたのですが、これまた知見が生まれたので追記します。

やはり問題は、メールアドレス(アカウント名)内にドットが入っているとハマってしまう内容になります。

paramiko

特定の開発環境で扱えるFTP/SFTPクライアントのツールを作っていると、何か問題が発生した時にどこで何が原因になっているのか把握しづらいため、一旦、Pythonを扱ってシンプルなコードでFTP/SFTPの機能を作って成功体験を得ようと考えました。

PythonでFTP/SFTPを実現するためには、paramikoというライブラリを扱うとできると調べてわかったので使ってみました。

GCPはSFTPでしか接続できない

最初のミスとしてわかったことが、GCPのVMインスタンスでは、SFTPでしか接続できないということが分かり、上記で解説している秘密鍵の~/.ssh/id_rsaを通信時に扱うようにしないといけないことが問題になっていました(マジ恥ずかしぃ...w)。

IOError: [Errno 13] Permission deniedでハマる

秘密鍵の設定していなかったことで出ていたと思ったIOErrorが、なぜかまだ出ていたので調べたところ、Paramiko Python: IOError: [Errno 13] Permission deniedというまんま同じ内容のstackoverflowの記事を見つけたので読んでみた。

そして、ホントに権限周りが問題ではないのかと再確認しました。

/home配下を確認すると

スクリーンショット 2018-09-23 15.22.51.png

名称未設定.png

上記で解説している問題の原因と同じで、今回は、GCP側が自動でドット付きのアカウント名ドットをハイフンにしたアカウント名/home配下に作られていることと、アカウントも別個に用意されていることが分かりました。

この内容が原因で、ソースコード側では/home/grem_takuya0223/xxxxx.xxxとアップロード先を指定していたため、権限はgrem_takuya0223であってサインインしたgrem.takuya0223ではないため、Permission deniedとされていたようです。

なので、アップロード先の設定を/home/grem.takuya0223/xxxxx.xxxとしたら上手くいきました笑

最後に

ファイルのアップロードだけですが、今回作ったSFTPのアップロードができるPythonコードをGitHubGistにアップしましたので、よかったらご参考にされてくださいー

なんでこんなに面倒なことになるんだろうか...w

 

27
20
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
27
20