自分用のスクラムツールを、自分のドメインにHTTPSで立てる

f:id:blackawa:20170927160905p:plain

自分用のタスク管理ツールがHTTPSで立ってるってカッコイイなと思って、実際やってみた。

実は1年に1回くらい思ってて、毎回挫折してた。今回初めて成功したことになる。嬉しい。

やったこ

https://taiga.io/)をblackawa.jpのサブドメインに立てて、HTTPS化する。 そのために、Certificate managerで証明書を発行する。 Route53 -> Elastic Load Balancer -> EC2の経路でアクセスさせる。 HTTPへのアクセスがあった時HTTPSにリダイレクトさせる。 taigaのユーザー登録機能を切る。

手順

EC2だけで動かす

taigaが公開してるドキュメントに、インストール用のスクリプトを使う手順があるのでそれをチラ見する。 ubuntu用に書かれてるので、EC2のt2-microでubuntuを立てて手順に従うと、数分でtaigaが起動する。 具体的には、nginx -> circus(gunicorn) -> django の構成のWebアプリケーションが、circusctlで起動する。

EC2の(Elasticじゃない)IPとURLで80番ポートにアクセスすると画面が見れる。

今回はELBを立てるので、Elastic IPの取得は不要。(僕は一度取得してしまったので後から消した。)

Route53でサブドメインを切ってEC2とつなぐ

ネットワークよくわからないけど、Hosted Zoneの子要素としてRecord Setというのがあって、こいつを足すことでサブドメインにアクセスが来た時に違うIPに通信を流すことができるぽい。 work.blackawa.jp にアクセスされた時用の「Aレコード」を切る。宛先はエイリアスなしで、一旦EC2のIP。

たしか反映されるのに数分タイムラグがあった気がする。

nslookup work.blackawa.jp

と打って、「いやそんなん知らんわ」と言われなくなったらOK。 逆にnslookupして名前解決できてなさそうならRecordSetの設定内容を見直す。

ブラウザからアクセスすると画面が見れるはず。

証明書を取る

次はELBを立てたいので、証明書を取得する。最初 let's encrypt を使ってみようかと思ってたけどAWS先生がやってくれると聞いてそっちにした。 ここがけっこうハマった。

証明書を取るには、 1. 証明してほしいドメインを指定して申請する 1. 確認メールを受信する 1. メールを開いて「Approve」ボタンを押す

という手順を踏む必要がある。この「証明してほしいドメインを指定して」ってのと、「メールを受け取る」っていうのにハマった。

メールは admin@blackawa.jp に飛んでくる

お名前.comならメール転送サービスが使えるからそれを設定しておく。 あと、Route53にお名前.comのメールサーバーに向けたMXレコードを追加する必要がある。これがないと転送が効かない。

反映されるのにちょっとかかる。自分で admin@blackawa.jp にメールを投げてみて届くようになればOK。

サブドメインを「別名」に指定する

証明書を申請する時、ドメイン名を指定できる。 ここに work.blackawa.jp と入れると、メールが admin@work.blackawa.jp に飛んでくるが、お名前.com的にはそんなサブドメインは知らないので当然転送サービスで転送できない。 だからといってドメインを「blackawa.jp」にすると、それで手に入れた証明書を使っても「証明されてるドメインとURLのドメインが違うからこれ危険やで」とブラウザに怒られる。 そこで、ドメインは「blackawa.jp」にしつつ、別名で「work.blackawa.jp」を指定する。 するとメールは admin@blackawa.jp に届き、かつサブドメインで使っても怒られない。

ただ、今にして思うとサブドメインワイルドカードとか使えたのかな?とか思う。たとえばblog.blackawa.jpを増やす時証明書を申請し直すのめんどくさそう。

ELBを立てる

ここも結構ハマった。

こいつはHTTPSかHTTP、もしくはその両方を受け取ってくれる。 どこにどのプロトコルで転送するかは、ELBの子要素である「ターゲット」が知っているのでELBは使用するターゲットを指定するだけ。

...なように見える。正直よくわからん。

ターゲットはHTTPでEC2に通信を転送させる

最初、「HTTPS化だしここもHTTPSにしとけばええやろ」と思ってHTTPSにしたら502 Bad Gatewayが出て困った。nginxのログにも出ないし。 仕組みを想像したらここはHTTPのままで良いのでは?と気づいて直したら動いた。

Route53をELBに向ける

ここは簡単。新しいAレコードを追加すればOK。

ここまでやると、HTTPSサブドメインにアクセスして画面表示ができるはず。できなければ通信がどこまでたどりつけたか調べながら頑張れ。

  • nslookup が結果を返すならRoute53が名前解決してくれてる
  • Bad GatewayならELBとEC2でリクエストとレスポンスがうまくできてない
  • EC2のURLにアクセスして表示できるなら、EC2インスタンスとアプリケーションはうまく動いてる
  • 証明書エラーならCertificate Managerに申請したドメインサブドメインが一致してない可能性あり

くらいかな。

HTTPで通信されたらHTTPSにリダイレクトする

Redirect HTTP Traffic to HTTPS Using ELBを読んで頑張る。 他にもQiitaにも日本語でこれと同じことが書いてあったりするから読んで頑張る。

まぁよくあるパターンで、ELB経由でHTTP通信が飛んで来る時はリクエストヘッダーに特定のキーが付与されてるからそれをチェックすると良いよ、ってやつ。

アカウント開設できないようにする

これはtaigaの話だけど、 Taiga: Setup FAQs and common bugsにあるとおり、taiga-backとtaiga-frontそれぞれの設定を書き換えることで無料アカウント登録の口を閉じられる。 これをやっておかないと知らない人がアカウント作れちゃうので。

ここまでやれば、https://work.blackawa.jp みたいなことができる。嬉しい。

今後の展開

自前で建てたアプリなのにHTTPSで、ブラウザのURLバーが緑色に輝くのは、正直QOL上がる。みんなやろう。

今後はブログを子URLにするのと、監視基盤入れてみたいな。 あと、次にドメインを買う時はお名前.comじゃなくてAWSで買おう。