タダです.
業務で 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 になるけど...っていう状況でした
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 コンテナを指定します.
タスク定義のコンテナ設定抜粋
{ "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 への通信が通りました.
まとめ
初歩的なミスですが,苦戦してしまったので備忘録として記事にまとめました.同じ事象に当たった方の参考になれば嬉しいです!