LightsailにDockerイメージをデプロイ
Fargateは安定していないかもという話を聞いたのと、EC2より簡単にデプロイできそうだったので Lightsail を選択した。サーバーは Node.js + Puppeteer だったので Docker なしでも動きそうだったけどどこでも開発とデプロイができる環境が理想なので Docker を利用することにした。
インスタンス作成
- インスタンスローケション ... 今回は国内向けなので東京を選択
- インスタンスイメージ ... Dockerさえ動けばよし
- プラットフォーム: Linux/Unix
- 設計図の選択: OSのみ - Amazon Linux 2
- インスタンスプランの選択
- 人数分(最大10名程度が同時利用する想定) Chromium のタブが開かれることを考慮し $20 のプランを選択、Chromiumはメモリを大量に消費するイメージがあるのと、お試しで一番安いプランにしたらレンダリングがタイムアウトする自体に陥った
- インスタンスを確認 ... わかりやすい名前をつける
ネットワーキングの設定
Lightsail は 静的IPが簡単にアタッチできるのがとてもありがたい。社内専用サービスなのでファイアウォールのHTTP:80にIPアドレス制限を追加しておいた。
Dockerのインストール
SSH慣れていないのでとりあえずブラウザ上で操作。。
開発では docker-compose も利用していたが、サーバーでの実行は docker だけで良さそうなので、docker-compose は使用しないことにした。
https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/docker-basics.html
Lightsail 上でイメージを使用できるようにする
ソースコードはローカルにあってイメージのビルドもできている状態、サーバー上で動かすには
- ソースコード自体を転送しサーバー上でビルドする
- プライベートなDockerレジストリサーバーにpushし、それをpullして使う
の二パターンがあると考え後者であればLightsailでレジストリできるようにすれば簡単そうだったので試してみた。
レジストリサーバーを動かす
こちら の記事を参考にプライベートレジストリを起動してみた。
-v /hostdir/registry
については~/docker/registry
をアサインしてみた--restart=always
オプションについてはこのサーバーはレジストリ用として常に動かすわけではないのでつけないことにした
レジストリサーバーへpush
こちら の記事を参考に自分のイメージをpushしようとしたところ、
http: server gave HTTP response to HTTPS client
こんなエラーが出たのでググったところ、pushする側のDockerの設定に insecure-registries
オプションを追加しないといけないことがわかった( 参考 )。Macを利用している場合 /etc/docker/daemon.json にファイルを追加してもダメで Docker.app の Preferences > Docker Engine に追加するのが正しいらしい ( 参考 )。
これでめでたくイメージが登録されたはず。
LightsailのDockerでpullする
ローカルで動いているレジストリからpullするだけ。
$ docker pull 0.0.0.0:5000/<イメージ名>
イメージを動かす
$ docker run -it --privileged --restart=always --env="PORT=3000" -p=80:3000 0.0.0.0:5000/<イメージ名>
--privileged
オプションは Puppeteer で動かす時にエラーを回避するためにつけている--env
オプションは Node.js 側に環境変数を渡すためにつけている-p
オプションは Lightsail の 80番ポートを内部で3000番に変換している- 80番は well known port で Node.js で使用している Express サーバーでエラーになるのでとりあえず好きなポートで動くようにしておいた