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

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

この記事は[ConoHa Advent Calendar](https://qiita.com/advent-calendar/2018/conoha) 14日目の記事です。13日目はProg24さんの[ConoHaのリモートデスクトップ触ってみた](https://blog.prog24.com/2018/12/conoha%E3%81%AE%E3%83%AA%E3%83%A2%E3%83%BC%E3%83%88%E3%83%87%E3%82%B9%E3%82%AF%E3%83%88%E3%83%83%E3%83%97/)でした。

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

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">ConoHa WINGのWebサーバー周辺のアーキテクチャについて書こうと思います。 / ConoHa Advent Calendar 14日目に参加しました <a href="https://twitter.com/hashtag/Qiita?src=hash&amp;ref_src=twsrc%5Etfw">#Qiita</a> <a href="https://t.co/MHmQa9eii5">https://t.co/MHmQa9eii5</a></p>&mdash; Hironobu Saito (@hironobu_s) <a href="https://twitter.com/hironobu_s/status/1059789075769548801?ref_src=twsrc%5Etfw">2018年11月6日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


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

-----

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

* [ConoHa オブジェクトストレージ](https://www.conoha.jp/objectstorage/)

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

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

* [ConoHa APIドキュメント](https://www.conoha.jp/docs/)

そんなある日、AWS方面から[AWS Transter for SFTP](https://aws.amazon.com/jp/blogs/news/new-aws-transfer-for-sftp-fully-managed-sftp-service-for-amazon-s3/)が発表されました。[Amazon S3](https://aws.amazon.com/jp/s3/)にSFTPで接続できるサービスですね。

個人的に、これはなかなか良いアイデアだと思いました。APIやCLIツールを使わなくても、開発現場でよく使われている[WinSCP](https://ja.osdn.net/projects/winscp/)や[Filezilal](https://filezilla-project.org)のようなGUIアプリから、オブジェクトストレージの操作ができるようになるからです。

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

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

* [hironobu-s/swift-sftp - 
SFTP server for OpenStack Swift Object Storage](https://github.com/hironobu-s/swift-sftp)

## swift-sftp

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

ちなみに**swift**はOpenStackのオブジェクトストレージである[Swift](https://www.openstack.org/software/releases/queens/components/swift)から取っています。(ConoHaは[OpenStackをベースにしたサービスです](https://www.conoha.jp/vps/function/openstack/))
 
では早速、VPS使ってSFTPサーバーを立てて、WinSCPやFilezillaから接続してみましょう。

### APIユーザーを作成する

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

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

<img width="742" alt="ConoHaコントロールパネル2.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/44152/2ca6fcd8-95af-81f9-5497-e285eb2e7d9b.jpeg">

### VPSを立てる

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

<img width="787" alt="ConoHaコントロールパネル1.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/44152/8bf600d6-5ebb-5266-7b19-9db0b4c8c58e.jpeg">

### インストールと設定

> swift-sftpの[インストールと設定](https://github.com/hironobu-s/swift-sftp/blob/master/README-jp.md#%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)も合わせてご覧ください

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

```bash
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情報のページにあった値を入力します。(各項目の説明は[こちら](https://github.com/hironobu-s/swift-sftp/blob/master/misc/swift-sftp.conf))

```toml
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デフォルトでポートが通るので必要ないです)

```shell
$ firewall-cmd --add-port=10022/tcp --zone=public --permanent
$ firewall-cmd --reload
$ firewall-cmd --list-port
10022/tcp
```

### サーバーの起動

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

```shell
$ ./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クライアントから接続する

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

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

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

<img width="706" alt="Site_Manager.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/44152/7a5b3e29-1c99-d887-ac16-33c812bd6921.jpeg">

接続できましたか？ これで通常の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 の料金 – アマゾン ウェブ サービス](https://aws.amazon.com/jp/sftp/pricing/)

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

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

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

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