UPOST Interface (仮)
Universal Pipable Object STorage Interface とかそんなノリで
OSSになる、予定
課題
以前、ファイルの扱いをより簡単に、かつより厳格なパーミッション制御をするために (e.g. なんかの間違いでファイルを消しまくったりしないために削除権限を殺す) クラウドストレージをラップする自作 S3 互換実装を書いた
が、そろそろ自作 S3 互換実装が様々な面で限界を迎えてきた
S3 API の都合とクラウドストレージ側の都合の両面をモロに受けている
クラウドストレージ側に密結合なコードになっているため、自動テストがしづらい
自動テストができないと壊しそうで怖い
その結果改修もできない
というわけで次回はコンポーネント毎に何らかの手法で細かく区切りたい
HTTP API でもよし、単純に言語上の interface でもよし…
必要な機能
S3 gateway
以下の実装
ListBuckets
ListObjects (V2?)
PutObject
GetObject
DeleteObject
透過的暗号化のサポート
うっかりストレージ側のクレデンシャルが漏れた時にも中身がわからなくてあんし〜ん
(それはそうとして、本当に大事な、例えば DB ダンプとかは別途暗号化するべき)
サーバーのローカルストレージによるキャッシュの導入
書き込み時にキャッシュに書くのが一番ストレージ側に優しい
が、別に塩漬けにしたいだけなのでキャッシュはいらん、というユースケースもある
裏のクラウドストレージへのアップロード/ダウンロードの分散
サーバー側に 100Mbps 制限がある事業者を利用しているといくら手元の回線が良くてもそこでキャップがかかる
参考: 前世ではこのような脱出ハッチを用意していた:
クライアント側でクラウドストレージの認証情報を持つ
クラウドストレージ側に直接アップロードしてからクラウドストレージ上のファイルIDを伝える
サーバー側でそのファイルを認識し、メタデータを読み取った後管理下のフォルダに移動する
が、今回の場合透過的暗号化等があるのでこのような手法は取りづらい
1オブジェクトの複数ストレージへの保存
アイデア
"pipable" なので、S3 gateway 後はいろんな UPOST interface が何らかの方法でパイプのように繋がれる
一例: (S3 gateway ->) encrypt server -> cache server -> rocket server (-> cloud providers)
今のところHTTPが有力候補だが、特定言語上の interface で繋ぐという形でも良いかもしれない
なぜ rclone でないか
rclone はファイルシステムを模倣するためにファイル一覧リクエストを送りがち
だが、上流のファイル一覧リクエストはいろいろ不便なので、自分たちで (S3 gatewayで) ファイル一覧を保持し、それをソースにしたい
案に対しての pros/cons を考える
案: UPOST interface 間接続を HTTP API にする
pros
実装を段階的に変更できる
例えば処理Aを挟みたいとなったとき、処理Aがとてもやりやすい言語Pでやりたい
cons
オーバーヘッドがやばそう
クラウドストレージへのアップロード/ダウンロードの分散 をするのに、pipe全てを全サーバーに立てる必要があり面倒くさい
workaround
コマンドとかで何とかする?