地方でリモートワーク

リモートワーク、プログラミング、エンジニア、地方

技術書典19に向けてコンテナデプロイツールKamal本を執筆しています

こんにちは、吉田智哉です。

技術書典19ですがリアル会場の当選が(だいぶ前に)決まったので、執筆中。 まだ書き終わってないので、尻に火をつけながら執筆中している。

今回はコンテナデプロイツールのKamal本。

Deploy web apps anywhere

私は業務委託をメインの収益としながら、 - 個人開発のRailsアプリケーション - 受託開発のRemixアプリケーション - レベニューシェアのRailsアプリケーション

を開発している。

デプロイはすべてKamalを使って運用。

なぜKamalを選んだのか?

これらすべてのアプリケーションの技術選定、インフラの選定、構築運用はすべて私が行っている。 業務委託先のインフラの多くはAWSやGCPなどのパブリッククラウドで構築されているが、毎回触るたびに「こんなに複雑なインフラは必要なのか?」と感じてしまう。 複雑な権限管理のIAM、デプロイのたびに実行される複雑で長時間のパイプライン。 TerraformやCDKなどのIaCで構築してみたものの、どういった意図で構築されたのか分からずメンテナンスされずに放置されていたり、Jobを1個追加したいだけなのに、複数のファイルを編集しなければならなかったり.. 何よりパブリッククラウドは高い。

PaaSもいいが、Herokuを例にとるとProduction Checkを満たすような構成にすると、簡単に1万円/月を超えてしまう。

https://devcenter.heroku.com/articles/production-check

自分がやりたいのはDockerコンテナアプリを気軽にデプロイさえできればいい。 そこで常にチェックしているDHH率いるBaseCampが自社で利用しているコンテナデプロイツールKamalを使ってみることにした。

サーバーにSSHさえできればコマンド一つでリリースできるシンプルさがいい。 サーバーが一つであれば自動でTLSを設定してくれるし、アクセサリとしてDBもセットアップできる。 サーバーをVPSにすれば、1,000円/月で運用することも可能。 実際、上記3つのアプリケーションのうちひとつはアクセス数が少ないアプリケーションなので、Conohaのメモリ2GBプランを3年契約で19,485円で契約した。 アプリケーションとビジネスモデルの性質上、ユーザー数が大幅に増えることはなくアクセス数も限定されているので、十分このスペックで運用できる。 デプロイも複雑なパイプラインが走ることなく、 1. 新しいDockcer imageの作成 2. 1のコンテナを起動 3. プロキシサーバーが1の起動を確認したら、旧コンテナから新コンテナにルーティング 4. ルーティングが完全に完了したら、旧コンテナとイメージを削除

するだけでめちゃくちゃシンプルなので、イメージサイズによるが長くても3~5分ほどでデプロイが完了する。

もちろんすべてのアプリケーションがVPSで運用できるとは言わないし、パブリッククラウドがふさわしい場合もあるだろう。でも、VPSで十分運用可能なアプリケーションも多いと思っている。 以前はパブリッククラウドを使う、使いこなせることが「かっこいい」、「使いこなせないとダメ」、「個人開発でも使うことでクラウドに慣れておこう」と考えて、あまり考えずにAWSやGCPを使っていた。 しかし、個人開発や小規模の受託開発でパブリッククラウドを使ったところで、クラウドの柔軟性や複雑な権限管理のメリットを享受できるほどの運用スキルは身につかないことに気づいた。 なので自分が技術選定できるときはVPSやPaaSをつかうようにしている。

Kamalを使うために必要なスキル

Kamal自体はとてもシンプルで必要な知識は次のとおり。

  • Linuxコマンドライン
  • SSH
  • Docker

何か困ったことがあってもこれらのスキルがあれば解決できる。 逆にこれらのスキルが無い場合は、PaaSを使ったほうがよい。

なぜKamal本を書くのか?

最近は思考停止でパブリッククラウドを使う傾向にある。 本当はVPSやPaaSで十分なアプリケーションは多いと思う。 パブリッククラウドを使っておけばなんとなく安心、かっこいいというのもわからなくはないが(かつての私がそうだったので)。 Dockerコンテナをデプロイしたいだけ、それで十分というケースは多いと思うので、その選択肢の一つとしてKamalを選んでほしいという想いで執筆している。

SSHできるLinuxサーバーがあれば気軽に試せるので、ぜひ一度Kamalを試してもらいたい。