Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

  

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

環境

  • 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

 

gremito
Freelance Engineer: Unity / Android / Xamarin / CodeIgniter / FuelPHP / CakePHP / WordPress / Rails / AWS / MySQL / SQLite / Jenkins / Docker / Firebase / LINE Bot ...etc
unity-game-dev-guild
趣味・仕事問わずUnityでゲームを作っている開発者のみで構成されるオンラインコミュニティです。Unityでゲームを開発・運用するにあたって必要なあらゆる知見を共有することを目的とします。
https://unity-game-dev-guild.github.io/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした