ちょっと詰まったからやったことのまとめ
環境
- 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接続して操作した方が良いです。
③Cyberduckの設定
どうも公式によるとLinux系のサーバーであればSFTP接続が普通にできるとのこと。
上記のドキュメントで解説されている
sftp://[USERNAME]@[IP_ADDRESS]/home/[USERNAME]
- [USERNAME] は、そのインスタンスでのユーザー名です。
- [IP_ADDRESS] は、インスタンスの IP アドレスです。
の内容を元にCyberduckに新規登録して見る。
コマンドラインツール上を見るとわかる通り、grem_takuya0223
という名前がユーザー名になっていたのでそのまま設定しました。
ちなみにgrem_takuya0223
は、VMインスタンスを作る際にGCP側でメールアドレスを元に勝手に作られたユーザー名になっています。
④ログイン失敗
ずっとこの状態で何が悪いのかわからなくなりました。
これが原因でvsftpdとか入れて遠回りのことをやりましたが、「Connecting...」から帰ってこないなど、余計に混乱して、結局改めて設定を見直すことにしました笑汗
vsftpd
⑤再設定
そもそも設定する内容として「公開キーの設定」「IPアドレス」「ユーザー名」の3つで、公開キーが間違えることはなかったので、となるとIPとユーザー名を見直すことに。
まず、IPアドレスで管理画面上には、「プライマリ内部 IP」と「外部 IP」の2つありますが、ここで内部IPを使うことありえないので設定はあっていることに。
では、あとはユーザー名で改めてインスタンスでのユーザー名
を見ると「どこを指しているんだ?」とわからなくなりました笑
インスタンス内のユーザー名なのか
それともGCPのアカウント名なのか
先ほどGCPがメールアドレスから勝手にユーザー名を作ったと言いましたが、正確にはgrem.takuya0223@...
でした。
なので、Cyberduckの設定上のユーザー名に設定していたgrem_takuya0223
をgrem.takuya0223
に変えてみたところ...正常に接続できましたwww
まとめ
インスタンスでのユーザー名
は、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
配下を確認すると
上記で解説している問題の原因と同じで、今回は、GCP側が自動でドット付きのアカウント名
とドットをハイフンにしたアカウント名
が/home
配下に作られていることと、アカウントも別個に用意されていることが分かりました。
この内容が原因で、ソースコード側では/home/grem_takuya0223/xxxxx.xxx
とアップロード先を指定していたため、権限はgrem_takuya0223
であってサインインしたgrem.takuya0223
ではないため、Permission denied
とされていたようです。
なので、アップロード先の設定を/home/grem.takuya0223/xxxxx.xxx
としたら上手くいきました笑
最後に
ファイルのアップロードだけですが、今回作ったSFTPのアップロードができるPythonコードをGitHubGistにアップしましたので、よかったらご参考にされてくださいー
なんでこんなに面倒なことになるんだろうか...w