継続は力なり

タイトル通り定期的な更新を心掛けるブログです。

Nginx + Puma + Sinatra のコンテナを ECS Fargate で起動する時にハマったことをまとめる

タダです.

業務で Nginx + Puma + Sinatra の構成を ECS Fargate で動かそうとしてハマったのでこの記事でその辺をまとめていきます.

ハマったこと

Nginx と Sinatra のコンテナを別々で立ち上げた時に Nginx -> Puma へのソケット通信が通らず,connect() to unix:/xxx/xxx/sockets/puma.sock failed (2: No such file or directory) while connecting to upstream というメッセージが出ていました.

ステータスは画像のように Running になるけど...っていう状況でした

f:id:sadayoshi_tada:20210618141654p:plain

Nginx と Puma の関連設定は以下の指定をし,指定した場所でソケット通信が通るよう意図したはずなのに何故だとハマっていました.

Nginx 設定

http {
 ~中略~

    upstream hoge{
            server unix:/xxx/xxx/sockets/puma.sock;
    }
    server {
        listen  80;
        listen 443;
     
        access_log /var/log/nginx/access.log;
        error_log  /var/log/nginx/error.log;
    
        server_name hoge.com;

        location / {
            try_files $uri @fuga;
        }

        location @fuga {
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_redirect off;
            proxy_pass http://hoge;
            proxy_set_header Host $proxy_host;
        }
    }
}

Puma の設定

root = File.expand_path("../..", __FILE__)

bind "unix:#{root}/xxx/sockets/puma.sock"
pidfile "#{root}/xxx/pids/puma.pid"
state_path "#{root}/xxx/pids/puma.state"
rackup "#{root}/config.ru"
threads 10, 20
activate_control_app

設定漏れがあった箇所

設定が漏れていたのが Sinatra のコンテナイメージビルド時と ECS のタスク定義の設定でした.

Sinatra コンテナイメージビルド時のミス

ビルド時のミスはソケット通信時アクセスするディレクトリをマウントできていなかったため,Nginx のコンテナから参照できないでいました.そのため,ソケット通信を行うディレクトリを VOLUME で指定しました.

Dockerfile 例

FROM ruby:2.7.2

WORKDIR /xxx

RUN mkdir -p /xxx/xxx/sockets/
RUN mkdir -p /xxx/xxx/pids/
RUN mkdir -p /xxx/xxx/log/

COPY . /xxx/

RUN bundle install -j4

VOLUME /xxx/xxx <= これが不足していた
CMD bash -c "cd /xxx/app && bundle exec pumactl start" 

ECS のタスク定義の設定

上述の誤りと関連し,ECS タスク定義の Nginx のコンテナでボリュームマウントする Sinatra コンテナを指定します.

docs.aws.amazon.com

タスク定義のコンテナ設定抜粋

  {
    "name": "nginx",
    "image": "nginx-repo",
    "portMappings": [
        {
            "containerPort": 80,
            "hostPort": 80,
            "protocol": "tcp"
        }
    ],
    "essential": true,
    "volumesFrom": [
        {
            "sourceContainer": "sinatra"
        }
    ],
    "logConfiguration": {
        "logDriver": "awslogs",
        "options": {
            "awslogs-group": "/ecs/hoge-task",
            "awslogs-region": "ap-northeast-1",
            "awslogs-stream-prefix": "ecs"
        }
    }
  }

設定の誤りを修正後のデプロイ確認

2点の修正を行った後に ECS へコンテナをデプロイして確認したところconnect() to unix:/xxx/xxx/sockets/puma.sock failed (2: No such file or directory) while connecting to upstream のメッセージは消えて,Nginx -> Puma -> Sinatra への通信が通りました.

f:id:sadayoshi_tada:20210618145728p:plain

まとめ

初歩的なミスですが,苦戦してしまったので備忘録として記事にまとめました.同じ事象に当たった方の参考になれば嬉しいです!