個人開発で利用したソフトウェアやサービスとその選定理由
概要
先日 TCP Exposer という、プライベートIPアドレスしか持たないローカルサーバーに、インターネットからアクセスできるようにするサービスを作りました。
本記事ではTCP Exposerを開発・運用する際に利用したソフトウェアやサービスを紹介します。
使い方や開発理由ついては以前投稿したZennの記事に記載しています。
ご興味が出たら、こちらもチェックしてみてください。
開発に利用したソフトウェア
TCP Exposerは以下のソフトウェアを使って開発しました。
sish
TCP Exposerの核となる機能を提供しているソフトウェアです。
ローカルサーバーのポートをインターネットに公開するソフトウェアはこれ以外にもあり、このGitHubのリポジトリによくまとまっています。
その中でsishを選んだ理由は、ユーザーの利便性や使用開始時のハードルを下げるためです。
sishの場合は専用のクライアントソフトをローカルサーバーにインストールする必要がなく、OSに標準でインストールされているSSHクライアントを使います。
ユーザーにとって自分のPCにソフトをインストールするのは面倒であったり、セキュリティ的に不安であったりするかと思い、sishを選択しました。
TCP Exposerはsishをそのまま利用しているわけでありません。
私が確認したタイミングでは、sishは不特定多数のユーザーというよりも信用できる限られたユーザーを対象としたソフトウェアのようで、なりすましを防ぐのが難しい作りになっていました。
そのため、ユーザー認証周りを一部変更しているのと、認証情報をDBから読み込むようにソースコードを変更しました。
Django
サービスのトップページや、ユーザー登録関連でDjangoを使いました。
理由はPythonのフルスタックWEBフレームワークであるからです。
私はプログラミング言語の中ではPythonが一番得意だったため、PythonのWEBフレームワークの中で探しました。
また、サービスの特性上、ユーザー認証機能やDB連携機能が必須でした。
Flaskのようなマイクロフレームワークも検討しましたが、認証やDBの機能を使うためにはプラグインが必要なため、そのプラグインの選定しなければならず、それが面倒でした。
そういった理由からPythonのフルスタックWEBフレームワークの中でおそらく圧倒的な人気を持つDjangoを選びました。
Djangoを選定したことは良かったと思っていますが、使っていく中で下記のような不満がありました。
- 型ヒントが活用しにくい
- フロントエンドの開発がしにくい
他のPythonWEBフレームワークと比較したわけではないですが、Djangoでは型ヒントが機能しない場合が多かったです。
フレームワークとしての汎用性を持たせつつ、型を定義することは難しいのかもしれません。
Djangoは特有の知識を求められることが多く、フロントエンドの開発もしにくかったです。
例えば、ユーザーが入力したデータをサーバーに送り入力値が不正な場合にメッセージを表示したい場合のときです。
一つのページに複数のフォームを設けて、それぞれのエラーをそのページで表示したい場合など、少し応用的なことがしたい場合に手が止まることが多かったです。
Reactはフロントエンド開発をしやすかったので、今度はReactとDjango REST frameworkを組み合わせてみたいです。
SQLite
DBにはSQLiteを使っています。
DBへのアクセスは、Djangoで開発したWEBアプリからは読み書きを、sishからは読み込みをしています。
SQLiteを選んだ理由は軽量なDBだからです。
個人開発のため大量のユーザ数は考えにくく、サービスの特性上一人のユーザーがDBアクセスが必要な操作を頻繁にしないことが予想されました。
そのため、軽量と言われており、おそらくCPUやメモリの使用量が少ないSQLiteを選びました。
運用時に利用しているサービス
デプロイ環境
KAGOYA CLOUD VPSという日本企業のVPSサービスを使っています。
VPSはクラウド上にあるLinuxサーバーのようなものです。
HerokuなどのPaaSはHTTP(S)でのアクセスしかできず(間違っていたらすみません)、SSHが必要な今回のサービスでは利用できませんでした。
AWSのEC2など大手クラウドの仮想マシンサービスや他のVPSサービスも考えたのですが、以下の理由からKAGOYA CLOUD VPSを選びました。
- 日本語対応なこと
- 類似のサービスに比べてマシンスペックの割に安いこと
- 通信量に応じた費用がかからず料金が一定であること
- 自動スケールアウトなど高度な使い方をする予定がないこと
OSのアップデートなどを自分でやらないといけないのは面倒ですが、別のサービスを同じVPSに同居させるなどもでき、自由度は高いです。
運用にかかる費用はVPS費用のみで、私の場合は金額も月々600円程度なので趣味の費用としては安いです。
ドメイン管理
ドメイン関係では以下のサービスを利用しています。
お名前ドットコム
ドメインはお名前ドットコムで購入しました。
それらしいキーワードで検索したらトップだったのと、登録料が1円だったからです。
なお、後から分かったのですが、1円なのは初回だけで2つ目以降のドメイン登録は、キャンペーン次第ですが1000円程度かかりますのでご注意ください。
また、継続利用するには1年ごとに更新する必要があり、その場合も1000円程度かかりそうです。
Cloudflare
ドメインのネームサーバーにはCloudflareを使っています。
お名前ドットコムのままではCertbotというツールによるワイルドカードSSL証明書の自動更新ができなかったためです。
そのため、ドメインのレジストラはお名前ドットコムで、ネームサーバーはCloudflareという変則的な形になっています。
狙ってやったわけでなく、後から必要にかられてこのような構成になりました。
Let's Encrypt
パスワード等の秘密情報を扱うので、HTTP(S)通信が必要になります。
そのため、SSL証明書を発行する必要がありました。
こちらはLet's Encryptという無料で証明書を発行できるサービスを利用しました。
無料で発行できますが、3ヶ月ごとに更新する必要があります。
サブドメインをユーザーに貸し出すというサービスの特性上、証明書はワイルドカード証明書という自分の管理するドメインに対する任意のサブドメインに対する証明書が必要です。
TCP Exposerの場合、foo.tcpexposer.comのようなドメインで、foo以外にもいろいろなサブドメインに対してHTTPS通信できる必要があります。
Let's Encryptでもワイルドカード証明書の発行はできます。
Certbot
証明書は定期的に更新する必要があるため、自動化に向いている作業です。
Let's Encryptが推奨しているCertbotというツールを定期的に実行することで、自動更新することができます。
ワイルドカード証明書の場合は、通常のSSL証明書よりも取得や更新が面倒で、ネームサーバーに対していろいろする必要があります。
この自動化のために、Cloudflare含むいくつかのDNSサービスはCertbotのプラグインを提供しています。
お名前ドットコムのCertbotプラグインは無さそうだったので、プラグインがあるDNSで聞いたことがあるCloudflareを利用しています。
最後に
TCP Exposerというサービスを開発・運用する際に利用したソフトウェアやサービスを紹介しました。
皆さんの開発時の技術選定やモチベーション維持に役立ってくれることを願っています。
また、サービスの使い方や開発理由ついて興味がある方は以前投稿したZennの記事をチェックしてみてください。
Discussion