こんにちは。
テックリードのTerukiです。
今回はコストの文脈でAWS Transfer Familyを廃止したよというお話です。
直近数回の記事よりかはだいぶゆるい記事です。
AWS Transfer Familyとは
シンプルで安全かつスケーラブルなファイル転送により、データの管理と共有を容易に実現
私の理解を書いておくと、S3などのストレージにいろいろな方法でデータをコピーできる便利ツールです。
Oh my teethでは、社内で使っている既成のWindowsアプリでデータ転送をするために使っていました。
このアプリは数十MB程度のファイルをFTPやSFTPなどで送信する必要があるのですが、今どきSFTPサーバを立ててIaaSにストレージを持たせてファイル管理なんてことはしたくありません。
また、そのデータはインターネットから閲覧できる必要もありました。
という背景から、S3に置いたら良いじゃん!ということでSFTPなどでS3にアップロードできるAWS Transfer Familyを使っていたというわけです。
これが結構高いんです
これ、要はS3にSFTP経由でファイルをアップロードしているだけなのですが、金額が結構高いです。
一時間あたり0.3USDほどするため、一ヶ月動かしておくとそれだけで219USD。
だいたい3万円強ほどです。
3万円あればそこそこ強いEC2インスタンスも借りられちゃいます。
もちろんこのサービスはこれ以外にもメトリックが監視できたり他の機能もモリモリなので良いところもあるわけですが、Oh my teethの使い方だともったいなさがあります。
個人開発の場合ではまず手が出ない金額感ですね
代替機能を自作してみた
いつもですが欲しいものがないなら作れば良いというスタンスで自作を試みます。
やることのイメージはこんな感じ。
- EC2を建てる
- S3にアップロードする機能
- SFTPを待ち受ける機能
- SFTPとS3のアップロードを中継する機能
SFTP経由でアップロードされてくる都合上、ファイルシステムにS3のディレクトリをマッピングするような仕組みでないと実現は難しそうです。
探していたところ、AWSから非常にドンピシャなRust製のツールが出ていました。
特定のディレクトリにマウントしておけばファイルの読み書きができます。
マウント時に--allow-overwrite
や--allow-delete
を付与すれば上書きや削除もできるので今回の用途には十分そうです。
SFTPサーバにはこちらを使用しました。
こちらはDocker内でSFTPサーバを立ててくれます。
ホストOSが吹き飛んでもそんなに困らなくて良いように、なるべくDockerコンテナで実現したかったのでちょうど良いですね。
後はmountpoint-s3でマウントしたディレクトリとSFTPサーバでアップロードされたファイルの保存先を上手いこと繋ぎ合わせれば完了です。
mountpoint-s3はfuseを使うためDocker内で使用するには下記のような設定が必要でした。
services:
sftp:
build: .
ports:
- 略
devices:
- "/dev/fuse"
cap_add:
- SYS_ADMIN
security_opt:
- apparmor:unconfined
platform: 略
restart: 略
本当はAppArmerの設定をしっかりするなどするべきなのだとは思いつつ、このサーバはIP制限が掛かった閉じた環境で動いているので一旦は良しとしました。
これを無料枠のts.microのEC2インスタンスで動かして完了です。
おわりに
今回は諸般の事情でサンプルリポジトリを用意できなかったのですが、上記の構成でSFTP経由でS3にファイルをアップロードすることができました。
ここには書いていない、EC2のロールの設定であったりSFTPサーバの設定などが別途必要ですが、各自各々の設定を記載することになると思います。
これで毎月3万円強掛かっていたものが、IPv4のパブリックIP分のみの支払いになってかなり安くなりました。
接続環境がIPv6でも問題ないようならv4のパブリックIPも外してしまっても良いかもしれませんね。
では。
Oh my teethについて
Oh my teethでは未来の歯科体験を創るために日々活動しています。
Techチームではより良いユーザー体験を提供するべく、Webフロントエンドからバックエンド、スマホアプリに機械学習モデルなど、さまざまなプロダクトを開発しています。
一緒に未来の歯科体験を創りませんか?興味がある方は是非こちらを確認してください。
カジュアル面談も可能なので気軽に応募してみてください!