はじめてのALBで割りとハマった-備忘録
はじめに
今回はALBとEC2を使って、former2 on Docker Containerを構築したいと思います。
ALBやWebサーバ/コンテナアプリケーションの構築経験がゼロのため、実際に手を動かしてみました。大きく4つのつまずきポイントがあったので、ここに共有します。former2を題材(構築対象のWEBアプリケーション)として使います。
参考ドキュメント
アーキテクチャ
つまずきポイント
docker-composeコマンドとdockerコマンドを使用した2パターン試してみました。
-
docker-compose.yml
docker-composeでコンテナを起動したときにつまずいた内容です。
former2のリポジトリで提供されているdocker-compose.ymlは、localhost(127.0.0.1)でホストするための設定になっていました。今回はEC2インスタンスでホストするため、80:80と書き換えました、- 変更前
ports: - "127.0.0.1:80:80"
- 変更後
ports: - 80:80"
- 変更前
-
ALBのヘルスチェックにパスするためSG設定
ALBからEC2インスタンスへの通信経路設定が不足していました。ALBのSGに、「タイプ:HTTP、送信先:EC2インスタンス」のアウトバウンドルールを追加しました。今回はインターネットアクセスとALBのヘルスチェックに同じポート(EC2の80番)を使用するため、アウトバウンドはこのルールのみで設定完了です。 -
DockerのEXPOSE命令
dockerコマンドでコンテナを起動したときにつまずいた内容です。
former2のリポジトリで提供されているDockerfileはそのまま利用できます!!が、余計なことをしてハマりました。外部からコンテナへアクセスするには、下記のようにポートマッピングを行う必要があります。docker run -p {ホストポート}:{コンテナポート}
「dockerコマンド実行時ではなく、DockerfileのEXPOSEで指定することもできるのでは?」と思いましたが、この場合は間違いでした。EXPOSEは実際のポート設定を担う命令ではなく、Dockerfile作成者が利用者に対して公開用コンテナポートを知らせるための、いわばドキュメントの役割を果たします。実際にコンテナポートを公開するには、-pオプション(publish)を使います。
なお、-Pオプションを使った場合はEXPOSEで指定した全ポートが公開されます。
-
ALBのヘルスチェックパスとドキュメントルートの設定
最後に本設定を行い、ALBのヘルスチェックに合格できました。
ALBは指定されたプロトコル、パス、ポートに一定間隔でリクエストを送信し、ターゲットからのレスポンスを判定します。デフォルトではパスに「/」が設定され、ドキュメントルートに接続することになります。ドキュメントルートとは、Webサーバが外部に公開するファイルを保存するディレクトリです。
まずコンテナにログインしてドキュメントルートを特定します。$ sudo docker container exec -it ${container_name} bash root@XXXXXXXXXXXX:/# pwd / root@XXXXXXXXXXXX:/# ls bin boot dev docker-entrypoint.d docker-entrypoint.sh etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var root@XXXXXXXXXXXX:/# cat /etc/nginx/conf.d/default.conf server { listen 80; listen [::]:80; server_name localhost; #access_log /var/log/nginx/host.access.log main; location / { root /usr/share/nginx/html; index index.html index.htm; } #error_page 404 /404.html; # redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } } root@XXXXXXXXXXXX:/# cat /usr/share/nginx/html/index.html
Nginxの設定ファイルdefault.confのlocation /でドキュメントルート:/usr/share/nginx/html、コンテンツファイル:index.html or index.htmと設定されています。よって、コンテナポート80にアクセスすると/usr/share/nginx/html/index.htmlが返却されます。
前置きが長くなりましたが、ALBのパスに/user/bin/former2/index.htmlというコンテナ内に存在しないディレクトリ/パスを設定していたため、ヘルスチェックに失敗していました。
ポートマッピングをしたものの、ヘルスチェックやドキュメントルートの仕組みが分かっていなかったため、パスにはなんとなくホストの内容を書いていました。冷静に調べて何とか解決です。(´∀`)ヨカッタ
さいごに
今回はEC2上にコンテナ化されたWEBアプリケーションを構築しました。Webサーバの仕組みに関する知識がかなり浅いので苦戦しました。こういった機会を活用して少しずつ勉強していきます。
次回はECSを使ってformer2をサーバレスなホスト環境で稼働させたいと思います。
お楽しみに!( ・ㅂ・)و ̑̑ グッ !"
Discussion