ハードウェアからサーバ・アプリまでワンストップで開発

脱クラウド計画(0)

  Napier

ogochan

円安がとんでもないことになっています。

普段ものを買わないのですが、買う時にはAliExpressであったり海外の部品商社だったりと結構ドル建てでの取り引きをします。そうなると、円安は結構ストレートに感じます。

一番感じるのはAWSの支払いの時で、何年か前にかなり頑張って整理して安くしたのに、その頃と比べると体感で3割以上支払いが増えました。何もサービス増やしてないし、むしろ減らしてるくらいなんですけどね。そんなわけで、今までほとんどのものをAWSに置いていたのを再考する必要を感じて来ました。

またその他に「クラウドサービスを使う」ということそれ自体、何やら窮屈に感じることが増えて来ました。この辺はあまり深くここで書くことはしないでいずれ個人ブログにでも書こうと思っています。ただ何にしろ「なんでもかんでもクラウド」ということに問題を感じるようになったのは事実です。

ということで、いろんな動機の下、「脱クラウド計画」を立てることにしました。

背景

おそらく、業界の大多数の人達は「やっとこれからクラウド移行をして行くところなのに、お前は何を言っているのだ?」と思うことでしょう。いやいや、クラウドが便利であることは、十分知っています。だからこそ、今までクラウドサービスを使っていて、一時は社内のサーバがないところまで行きました。最後に残っていたファイルサーバと開発環境は、何度か書いているディスクのクラッシュにより消えてしまいました。その時は「やっぱり全部クラウドに置いておけば良かった」と反省したものです。

しばらくサーバがない状態で運用していたのですが、さすがにファイルサーバと開発環境は手元にないと不便だということがわかり、とりあえずということでラズパイでいろんな環境を作って使っていました

そういったことをしている時に、ふとAmazonからの請求金額のことを思い出したのです。

何もしてないのに請求が増えた

のです。

それはまぁ当然のことで、ここのところの円安のせいで請求が増えてしまったわけです。

そんなことがあって、今まで単に「便利だから」とか「手間がかからないから」といった理由でAWSに置いていたサーバを吟味する必要を感じるようになりました。つまり、

別にクラウドでなくてもいいもの

までクラウドに置くのはやめようということです。

「クラウドに置くと都合のいいもの」や「クラウドでないと困るもの」をクラウドに置くのは良いことなので止めるつもりはありません。ただ、「そうでないもの」については、クラウドでなくてもいいじゃないかということです。

検討

まず、どんなものがクラウドでなくても良いかということを考えてみました。

最初に挙がったのは、会社のホームページです。

会社のホームページ、これは今や「看板」みたいなものですから、インターネットから落とすということはありえません。とは言え、弊社のような零細企業のホームページなんてのは、アクセスはたかが知れています。umamiのログを見る限り、1日せいぜい100 pv、多い日でもその数倍です。そのためにあれやこれやというのはちょっともったいないですね。

次に挙がったのが、いくつかの実験的なサービスです。

実験的なサービスであれ実用的なサービスであれ、インターネット上のサービスはインターネット上になければ意味がありません。また、いずれ何とか「ものにしたい」と思っているものは、インターネット上にデプロイしたいものです。弊社のいくつかのIoTのサービスはそんなものです。

とは言え、今現在はそんなに金になっているわけではないですし、それでいてデータベースのための費用は結構かかるものなので、実のところデータベースの置き場をどうしたものかと悩んでしまいます。これもお金になっていれば金のモノを言わせてしまえばいいわけですが、まだそうではないわけですから。ということで、この辺を何とかしたいですね。

その次に挙がったのが、ちょっと外の人に見て欲しいものです。

これは何かと言えば、たとえば会計のシステム、これは社内のサービスですから社内で見えていれば十分なんですが、たまに「ここの部分は税理士に直接見て欲しいな」と思う部分があります。これが「社内のシステムを社員が外から見る」のであれば、VPNでも使えば十分ですし既に昔からそうしているのですが、相手が社外の人となるとその手は使えません。同じようなことは、たとえば「開発中のシステムを誰かに見てもらう」というようなことにもあります。

そんなわけで、これらのサービスについてはできれば社内のサーバでやってしまいたいなと思うわけです。ただその時にアクセスは外部に公開したい。そういったことです。

実現方法

さてこれらをどうやって実現するかですが、とりあえず

AWSに逆プロキシを置いて、VPN使って社内のサーバに接続する

ことにしました。

元々、VPNサーバのあるインスタンスと会社のホームページのあるインスタンスは同じものなので、VPNを使うオーバーヘッドも少なくて済みます。また、とりあえずのところnginxなり何なりで逆プロキシを設定してしまえば、すぐに実現可能であるという点は大きいです。

「社内のサーバ」も別にたいしたことをさせるわけではないので、

ラズパイ

で十分です。と言うか、そもそも会社のホームページのサーバのインスタンスはごくごく小さなものなので、ラズパイ(4)の方が強いくらいです。実際試してみたところ、ホームページの表示はこの方が速かったくらいです。

もちろんラズパイと言ってもSDカードでの運用ではなく、reTerminalを使ってファイルシステムはHDDに入れて使うという工夫がしてあります。

この辺の詳細は、以後のエントリでmayumiが説明してくれると思います。

次のステップ

実はこの計画はmayumiが言い出したことなのですが、私(生越)には前々から思っていたプランがありました。

それは、かつて一部で流行っていた「自鯖の公開(自分のサーバを公開するということです)」を現代風にして行いたいということです。

これも書くと長くなるので背景については省きますが、かつての「自鯖の公開」にはいろんなメリットと共に制限や面倒がついて回っていました。ここで考えたのは、そういった制限や面倒を現代の技術を使って解決してしまったら、もっとカジュアルに出来るのではないかということです。設備の維持やセキュリティといったものを、現代の技術で解決してしまったら、「自鯖の公開」はもっとカジュアルになるのではないかということを考えたわけです。

たとえば極端なユースケースだと、「Windows上で何かアプリを起動したら、そのまま指定したフォルダをインターネットに公開してくれる」みたいな感じです。これが出来れば、たとえば「ファイルの受け渡し」の時に外部のサービスを使う必要がなくなります。

同じことは、逆プロキシ設定したウェブサーバ(nginxとか)とsshのポートフォワードを組み合わせれば実現出来ますが、もっとずっとカジュアルに使えるようにしたいなと考えました。当面のゴールは前述の「何かアプリを起動したらローカル環境を公開するウェブサーバが起動する」というシステムです。

実験

前述のことの実現性を確認するために、実証のためのシステムを書いてみました。

まぁ普通のトンネルと(逆)プロキシの構成です。

ここでトンネルはWebSocketを使いました。

WebSocketは「ウェブ技術」でプログラムを書きやすいこと、TCP socketと同じような感じで扱えることで選択しました。経路の暗号化についても、wssを使えば問題なく可能なので、特に悩むこともありません。気になるのはオーバーヘッドですが、これは実験してみましょう。

つまるところ、この構成は

プロキシサーバの出力をWebSocketで作ったトンネルでつなぎ、
ローカルのウェブサーバを公開する

というものです。

実際のコードはGitHubに置いてあります。

Napier

テストのウェブサーバとして作成途中の情報共有システム(まだ名はない)を使って試してみました。

結果は割と良好で、雑に計測した範囲では心配したWebSocketによるオーバーヘッドも特になく、直接接続した場合とトンネルを経由した場合で目に見えるパフォーマンスの違いはありません。タイミングによってはトンネル経由の方が速かったりするので、まぁその程度のオーバーヘッドなのでしょう。つまり、測定誤差として無視できる範囲だということです。

展望

展望としては、ここを開始点として広くウェブサービスとして公開出来る程度の機能を付加して行きたいと考えています。程々使い良くなったあたりで、「検討」で挙げたようなものはこちらに移行してしまおうと考えています。

そして、セルフホスト可能なように、オープンソース(AGPL)で公開し続ける予定です。この辺は冒頭にチラと書いた「クラウド利用による窮屈さ」から解放するためです。

今回はHieronymusの時のように「社内で使えれば十分」「使いたい人はどうぞ」「自社ではそれ程ビジネスは考えてない」というスタンスではなくて、ちゃんと社外に公開するサービスまで作る予定です。お金出すなら今のうちですよw

最近のエントリー

現在の営業品目(2)

現在の営業品目(1)

SPDX License Listをデータ化した

Orange Pi5でC3TR-Adapterを試す

CasaOS上で会計システム「Hieronymus」を動かす

会計システム「Hieronymus」v1.0.0 リリースしました

CasaOSでファイル同期アプリSyncthingをセットアップする

第11回 Freshmeat

オープンソースノーコード「Activepieces」でワークフローを作る

RaspberryPiにパーソナルクラウドOS「CasaOS」を導入する

sequelize-cliでdb:migrateすると「SyntaxError: Unexpected token ':'」が出る

LED行燈の試作(2)

CMSの社内向けサービスのリニューアル

LED行燈の試作(1)

エントリを書くこと

お手軽ポップコーン

VR徘徊(5) StereoPi V1でROSを動かす

VR徘徊(4) StereoPi Ver 1でUbuntu 22.04を動かす

新しいおもちゃ

執筆進捗