こんにちは、ひろのぶです。
この記事はConoHa Advent Calendar 14日目の記事です。13日目はProg24さんのConoHaのリモートデスクトップ触ってみたでした。
さて、今年はConoHa WINGの話を書く予定だったのですが...
ConoHa WINGのWebサーバー周辺のアーキテクチャについて書こうと思います。 / ConoHa Advent Calendar 14日目に参加しました #Qiita https://t.co/MHmQa9eii5
— Hironobu Saito (@hironobu_s) 2018年11月6日
いろいろあって、このネタは「GMOホスコン大忘年会 - ホスティングサービスの2018年振り返りとこれから」というイベントで話すことになってしまいました。(聞きたい方はぜひイベントへ!)
と言うわけで、今年はConoHa オブジェクトストレージの話です。
容量単価が安く、REST APIを使って操作すると言う特徴があるストレージサービスです。アクセスの頻度が低いデータや、サイズの大きなファイルを置くのに適しているわけです。実は、オブジェクトストレージは単独で契約できるので、VPSご利用の方だけでなく、ConoHa WINGをご利用の方もご利用いただけたりもします。
オブジェクトストレージはConoHaのサービス開始当初から存在する古株のコンポーネントで、利用者数もそれなりに多いです。しかし、APIを叩けないと何もできないという技術的な敷居の高さから、VPSやレンタルサーバーほど気軽に使ってもらえない、一方でそんな現実もありました。
そんなある日、AWS方面からAWS Transter for SFTPが発表されました。Amazon S3にSFTPで接続できるサービスですね。
個人的に、これはなかなか良いアイデアだと思いました。APIやCLIツールを使わなくても、開発現場でよく使われているWinSCPやFilezilalのような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のプロトコルの違いにより、下記の制約事項があります。
- パーミッションの変更(chmod)はできません
- ディレクトリはサポートしていません
- 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)
これはつまり、SFTPのエンドポイントを一ヶ月立ち上げっぱなしにすると 216USD (約24,500円) 必要で、さらにデータ転送料金もかかるということです。(S3はアップロード側のデータ転送料は無料ですが、SFTP経由だと課金対象です)
これだけあれば VPS 16GBプラン(13,010円/月) と オブジェクトストレージ100GB(700円/月) を借りて、さらにこのはフルジップパーカー(6,200円)を買ってもお釣りがもらえてしまいます(!!!)
「立ち上げっぱではなくオンデマンドで使いなさいよ」と言うAWSからのメッセージなのかもしれませんが...
なお、swift-sftpは無料で使えますし、ConoHaオブジェクトストレージはデータ転送料無料です。