🐎

はじめてのALBで割りとハマった-備忘録

2024/11/01に公開

はじめに

今回は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