Edited at
ConoHaDay 14

SFTPでConoHaオブジェクトストレージを使う

こんにちは、ひろのぶです。

この記事はConoHa Advent Calendar 14日目の記事です。13日目はProg24さんのConoHaのリモートデスクトップ触ってみたでした。

さて、今年はConoHa WINGの話を書く予定だったのですが...

いろいろあって、このネタは「GMOホスコン大忘年会 - ホスティングサービスの2018年振り返りとこれから」というイベントで話すことになってしまいました。(聞きたい方はぜひイベントへ!)


と言うわけで、今年はConoHa オブジェクトストレージの話です。

容量単価が安く、REST APIを使って操作すると言う特徴があるストレージサービスです。アクセスの頻度が低いデータや、サイズの大きなファイルを置くのに適しているわけです。実は、オブジェクトストレージは単独で契約できるので、VPSご利用の方だけでなく、ConoHa WINGをご利用の方もご利用いただけたりもします。

オブジェクトストレージはConoHaのサービス開始当初から存在する古株のコンポーネントで、利用者数もそれなりに多いです。しかし、APIを叩けないと何もできないという技術的な敷居の高さから、VPSやレンタルサーバーほど気軽に使ってもらえない、一方でそんな現実もありました。

そんなある日、AWS方面からAWS Transter for SFTPが発表されました。Amazon S3にSFTPで接続できるサービスですね。

個人的に、これはなかなか良いアイデアだと思いました。APIやCLIツールを使わなくても、開発現場でよく使われているWinSCPFilezilalのようなGUIアプリから、オブジェクトストレージの操作ができるようになるからです。

これはオブジェクトストレージの敷居を下げることができるのでは?

ということで、同じようなことを実現するConoHaオブジェクトストレージ用のSFTPサーバーを書いてみたのでご紹介したいと思います。(ソースなどは下記のGitHubにあります)


swift-sftp

swift-sftpはVPSにインストールすることでSFTPサーバーとして動作し、SFTPクライアント(WinSCPやFilezilla)からファイルのアップロード&ダウンロードを行うと、それをそのままオブジェクトストレージに反映します。

ちなみにswiftはOpenStackのオブジェクトストレージであるSwiftから取っています。(ConoHaはOpenStackをベースにしたサービスです)

では早速、VPS使ってSFTPサーバーを立てて、WinSCPやFilezillaから接続してみましょう。


APIユーザーを作成する

まず、一度もAPIを使ったことない方のみ、メニューの「API」からAPIユーザーを作成してください。

このAPI情報のページに表示されている「テナント情報」と「エンドポイント」は、あとでswift-sftpの設定をするときに必要になります。


VPSを立てる

スペックは必要ないので512MBプランで十分です。VPSを作るときに、下記のキャプチャのようにSSH Keyを含めるようにしましょう。swift-sftpで公開鍵認証を使うときにauthorized_keysファイルを共有できるので、一手間減らすことができます。


インストールと設定


swift-sftpのインストールと設定も合わせてご覧ください


VPSにSSHでログインします。そして、swift-sftpのアーカイブをダウンロードして展開します。

wget https://github.com/hironobu-s/swift-sftp/releases/download/v1.1.3/swift-sftp-1.1.3-linux.amd64.tgz

tar xf swift-sftp-1.1.3-linux.amd64.tgz
cd swift-sftp-1.1.3

次に、設定ファイルswift-sftp.confを変更します。ConoHaの場合は以下のようになります。os_で始まるパラメータには、先ほどのAPI情報のページにあった値を入力します。(各項目の説明はこちら)

container = "swiftsftp"

create_container = true
bind_address = "0.0.0.0:10022"
server_key = "server.key"
authorized_keys = "~/.ssh/authorized_keys"
password_file = ""
swift_timeout = 180

os_identity_endpoint = "[Identity ServiceのエンドポイントURL]"
os_user_id = ""
os_username = "[APIユーザー名]"
os_password = "[APIパスワード]"
os_domain_id = ""
os_domain_name = ""
os_tenant_id = ""
os_tenant_name = "[テナント名]"

authorized_keysはswift-sftpにログインするユーザーのSSH公開鍵のリストです。"~/.ssh/authorized_keys"を指定しているので、VPSにSSHログインできるユーザーはswift-sftpでもログインできるようになります。


ポートの開放

CentOSなどデフォルトで10022/tcpが通らない場合は、設定を変更して解放します。以下はfirewalldの場合のやり方です。(Ubuntuデフォルトでポートが通るので必要ないです)

$ firewall-cmd --add-port=10022/tcp --zone=public --permanent

$ firewall-cmd --reload
$ firewall-cmd --list-port
10022/tcp


サーバーの起動

swift-sftpコマンドに-fオプションで設定ファイル名を渡して実行します。

$ ./swift-sftp server -f swift-sftp.conf

2018-01-01 00:00:00 [-] Starting SFTP server
2018-01-01 00:00:00 [-] Use container 'https://object-storage.tyo1.conoha.io/v1/[TENANT_ID]/[CONTAINER_NAME]
2018-01-01 00:00:00 [-] Listen: 0.0.0.0:10022


SFTPクライアントから接続する

では接続してみましょう。接続情報は以下のようになります。

username:    任意

hostname: VPSのIPアドレス
port: 10022
private-key: VPSログインに使っている秘密鍵ファイル

FileZillaの場合は以下のようになります。

接続できましたか? これで通常のSFTPを扱うようにファイルのアップロード、ダウンロードが行えるようになりました!


今後

現在、swift-sftpにはオブジェクトストレージ(HTTPS)とSFTPのプロトコルの違いにより、下記の制約事項があります。


  1. パーミッションの変更(chmod)はできません

  2. ディレクトリはサポートしていません

  3. SFTPクライアントからアップロードしたオブジェクトは、一度swift-sftpが動いているサーバーにアップロードされ、その後オブジェクトストレージにアップロードされます。そのためアップロードには通常の2倍の時間が必要になります

1はオブジェクトストレージが非サポートで無理。2はオブジェクトストレージが擬似的に(?)サポートしてるのでなんとか。3はSFTPクライアントがランダムライトしてくるのをバッファリングしながらHTTP PUTに載せれば改善できるかも。


おわりに

経験上、WinSCPやFileZillaといったツールは、Web制作やアプリ開発の現場ではまだまだよく使われていると思いますし、エンジニアでない人でもなじみのある人は多いでしょう。(私の勤め先では、デザイナーやマーケッターの人でも使っています)

swift-sftpを使うと、普段使っているツールはそのままに、オブジェクトストレージをより簡単に手軽に扱うことができるようになります。

「WinSCP/FileZillaが使えるなら、まぁちょっと試してみようかな?」と思った方はぜひ気軽に試してみてください。


ちなみに...

AWS Transfer for SFTPを使うと、以下の料金がかかります。



  • SFTP エンドポイントがプロビジョニングされている時間: 1 時間あたり 0.30 USD

  • SFTP でのデータのアップロードとダウンロード: 0.04 USD/転送されたデータ 1 ギガバイト (GB)

AWS Transfer for SFTP の料金 – アマゾン ウェブ サービス


これはつまり、SFTPのエンドポイントを一ヶ月立ち上げっぱなしにすると 216USD (約24,500円) 必要で、さらにデータ転送料金もかかるということです。(S3はアップロード側のデータ転送料は無料ですが、SFTP経由だと課金対象です)

これだけあれば VPS 16GBプラン(13,010円/月) と オブジェクトストレージ100GB(700円/月) を借りて、さらにこのはフルジップパーカー(6,200円)を買ってもお釣りがもらえてしまいます(!!!)

「立ち上げっぱではなくオンデマンドで使いなさいよ」と言うAWSからのメッセージなのかもしれませんが...

なお、swift-sftpは無料で使えますし、ConoHaオブジェクトストレージはデータ転送料無料です。