AWSで作る理想のdevhostについて考えている。
devhostははてな社内用語だった。
今自分のチームにもdevhostはあるけれど,Jenkinsとchefとnginxとドメインソケットにべったり依存していて結構構成が把握しづらかったりする。
もし1からdevhostの環境を作るとしたらどういうのがいいんだろうかと考えている。
そもそもdevhostとは(おさらい)
devhostという言葉が一般的かどうかは知らないが,Webアプリケーションで実際に本番として稼動しているブランチ/設定とはまた別のブランチ/設定で完全に動作するホストのことを自分はそう呼んでいる。例えばテストDBにつながっているとか,テスト用課金システムにつながっていて自由にクレカで課金する実験ができるとか,未公開の実験機能を本番と同じデータで動作させられる,とかの便利さがある。
こういうホストはローカルで1から作ることもできるが,たいてい今時のソフトウェア開発はチームでやるので,チームメンバーにすぐ見てほしい(チーム内でパブリックなアドレスが欲しい)し,こういうことはたくさんあるのでシステマチックにこういう環境を作りたい(手で毎回やっていては大変)。
理想の環境
開発環境は既にDocker化されているので,それを応用できるCodeBuild+ECSでブランチのホストを建てられるとよさそう。ブランチにpushすると同時にCodeBuildが走ってECRにイメージを入れてくれるようにする。それでECSにサービスを作るまでをCodePipelineとかでやればよさそう。
接続するDBは設定にもよりそう(本番のレプリカにreadonlyで繋ぎたいとか,まっさらなDBに繋ぎたいとかがありそう)。なのでデフォでちっこいDBも起動するようにタスク定義を設定しておいて,後は環境変数とかで設定を切り替えると良さそう。
そしてインターネットもしくはオフィスのIPレンジからの接続を受け付けられるALBがあれば最小限のものが完成する。
ここでいくつか考えないといけないことがある。
- ホストの振り分けをどうするのか
- 認証をどうするのか
ホストの振り分けをどうするのか
複数ブランチのdevhostが同時に動作することを考えるので,foo.example.com
とbar.example.com
といったアドレスを発行し,それぞれがそれぞれの環境に繋がるようにしたい。ALBにはホストベースルーティングがあるのでこれを使ってリスナーを切り替えられるが,これではブランチを切るたびに毎回リスナールールを設定しなければならない。
幸いにも同僚がAPI経由で動的にリスナールールを設定してくれる機構を試作してくれているので,これを試してみたい。
認証をどうするのか
AWSの仕組みを使うならばCognitoを使うことになると思う。ALBはCogintoとシームレスに統合できる。しかしCognitoは素人で,先日も試してみたけれどうまく動かせずによくわかっていない。同僚に使いかたを教えてもらいたい。
また別のやり方では,(今時使いたくないが)BASIC認証をかけるとか,IP制限をかけるとかがある。