質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.53%
unicorn

Unicornは、汎用のRackアプリケーションサーバ。RackとWebサーバーの機能を併せ持ちます。レスポンス処理や、Nginx単体がRackの機能をサポートしていない事から、一般的にはNginx+Unicorn+Railsの構成を取って用います。

nginx

nginixは軽量で高性能なwebサーバーの1つです。BSD-likeライセンスのもとリリースされており、あわせてHTTPサーバ、リバースプロキシ、メールプロキシの機能も備えています。MacOSX、Windows、Linux、上で動作します。

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

Q&A

解決済

2回答

593閲覧

ALBのヘルスチェックで504になる

mumu1354

総合スコア18

unicorn

Unicornは、汎用のRackアプリケーションサーバ。RackとWebサーバーの機能を併せ持ちます。レスポンス処理や、Nginx単体がRackの機能をサポートしていない事から、一般的にはNginx+Unicorn+Railsの構成を取って用います。

nginx

nginixは軽量で高性能なwebサーバーの1つです。BSD-likeライセンスのもとリリースされており、あわせてHTTPサーバ、リバースプロキシ、メールプロキシの機能も備えています。MacOSX、Windows、Linux、上で動作します。

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

0グッド

0クリップ

投稿2023/11/20 06:33

編集2023/11/25 17:51

実現したいこと

APIモードで作成したRuby on RailsのアプリをAWSにデプロイ

AWS ECSでサービスの作成後タスクが動くようにしたい

前提

AWSのECS サービスの作成をするとエラーがでます
ALBのヘルスチェックで504になる

◽️手順
1.Dockeイメージの作成
2.ECRにpush
3.ECS サービス作成
4.ヘルスチェックで失敗504

ロードバランサーやセキュリティグループの設定も行っています。

サーバ環境 unicornとnginx

発生している問題・エラーメッセージ

Doker-composeでローカル環境での動作確認
localhost:80は502エラーでした

ロードバランサーのログ このエントリは、Cloudflare経由でのリクエストがタイムアウトし、504 Gateway Timeoutが発生したことを示しています。クライアントからのリクエストがターゲットに正常に転送されなかった可能性があります。

ヘルスチェックのエラー
ターゲットグループを確認するとタイムアウトになっていた

Amazon ECS Exec(https://techblog.styleedge.co.jp/entry/2023/05/31/083500) ECS SSH接続 RDS(https://teratail.com/questions/v1nruunpzn1nsx)
などMacからのターミナル操作も失敗します。

該当のソースコード

https://github.com/yon-s/cat-img-api/pull/8

試したこと

Doker-composeでローカル環境での動作確認
localhost:3000にアクセスできました。(Railsの画面)
ただしlocalhost:80は502エラーでした
nginxのエラーログを確認するとなにも書き込まれていません
nginxもunicornも起動していました。
/tmp/sockets/.unicorn.sock
もあります

ECSのログでunicornとnginxは問題なく立ち上がっている

ドメインにアクセスはできるが503/504エラー

Nginxにproxy_read_timeoutを設定
https://www.yokoyan.net/entry/2018/11/08/180708

ECSのセキュリティグループのインバウンドルール
タイプHTTP ソース ロードバランサーのセキュリティグ
ループに設定 
https://qiita.com/iloveomelette/items/27f45f6c2c14627a19fd

考えられる原因

https://qiita.com/three_mouth_ago/items/a9d268290fd656700712#%E3%82%BF%E3%82%B9%E3%82%AF%E5%AE%9A%E7%BE%A9 
にはないロードバランサーとRoute53(ドメイン設定)を行ったのでその設定周りが怪しい

ECS上のログを確認しようと、EC2インスタンスを作成した。そしてSSH接続をしようとしたがこれもタイムアウト(セキュリティグループ インバウンドルール SSH myipadressに設定済み)

cat-img-api/nginx/nginx.confの設定ミス?

サービス作成設定

イメージ説明イメージ説明イメージ説明イメージ説明

ターゲットグループ周り

イメージ説明
イメージ説明

セキュリティグループ周り

イメージ説明
イメージ説明
イメージ説明
イメージ説明
イメージ説明

タスク定義

イメージ説明
イメージ説明
イメージ説明
イメージ説明
イメージ説明

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yu_1985

2023/11/20 09:08

ECSのサービス設定が不明なので追記してください。 また、ALBのターゲットグループ設定も記載してください。
mumu1354

2023/11/20 09:42

yu_1985様コメントありがとうございます。 追記しました。 よろしくお願いします。
yu_1985

2023/11/21 01:46

セキュリティグループの設定を文字ではなく実際のものを貼ってください 具体的には設定しているポート番号が気になります また、サービスで使用しているコンテナのタスク定義の設定はどうなっていますか? ALBからは80番ポートに通信を送っていますが、コンテナ側が80番ポートを使っていないのでは、と思っています。
mumu1354

2023/11/21 07:13

yu_1985様 追記しました。 よろしくお願いします。
yu_1985

2023/11/21 07:50

> ECSのログでunicornとnginxは問題なく立ち上がっている サービスのところを確認し、コンテナが起動しているか確認してください。 また、nginxのログにヘルスチェックのリクエストのログがあるか確認してください。
mumu1354

2023/11/21 09:00

>サービスのところを確認し、コンテナが起動しているか確認してください サービス>タスクのところで確認しましたがコンテナのステータスRunningになっており コンテナ内でunicornが立ち上がっていることは確認できました。 # ps aux | grep nginx root 1 0.0 0.0 2480 580 ? Ss 08:44 0:00 /bin/sh -c /usr/sbin/nginx -g 'daemon off;' -c /etc/nginx/nginx.conf root 7 0.0 0.1 8932 5668 ? S 08:45 0:00 nginx: master process /usr/sbin/nginx -g daemon off; -c /etc/nginx/nginx.conf nginx 8 0.0 0.0 9320 2608 ? S 08:45 0:00 nginx: worker process nginx 9 0.0 0.0 9320 2608 ? S 08:45 0:00 nginx: worker process root 752 0.0 0.0 5132 712 pts/0 S+ 08:52 0:00 grep nginx # ps aux | grep unicorn root 379 0.0 0.0 5132 644 pts/0 S+ 08:57 0:00 grep unicorn >nginxのログにヘルスチェックのリクエストのログ # vi var/log/nginx/access.log # vi var/log/nginx/error.log →何も書いていない 以上よろしくお願いします。
yu_1985

2023/11/23 16:40

grep unicornにunicornのプロセスが引っかかっていないので、確認できていません。 nginxのコンテナ内で実行してませんか? まあ、そもそもnginxのログに何も出てないならアクセスが届いていないのでまずはそちらが問題ですが。 コンテナを新しいものに入れ替えたらどうなりますか。
guest

回答2

0

自己解決

結論から申しますとDockerの設定が間違っていたこと、特にVolumeやunicorn設定がうまくできていませんでした。

解決策した方法(notionの画像が貼れないためテキストでの説明になります。申し訳有りません)

1.ファイル改善
具体的にはGitHubから見てください。
https://github.com/yon-s/cat-img-api/pull/10/files
1.1dockerignore /config/master.key /config/credentials/*.key 鍵と鍵穴がないのでそれがないとコンテナのRailsでエラーがでる
1.2Dockerfile VOLUME の部分削除
1.3 config/database.yml 本番はmysql使うため production:にadapter: mysql2追加
1.4 config/environments/production.rb config.force_ssl = true これはHTTPでアクセスしたときにHTTPSに転送される設定 なので falseに nginx→unicornが HTTPだから
1.5 docker-compose.yml Volume設定のためvolumesや環境変数追加
1.6 entrypoint.sh unicornを使うので rm -f tmp/pids/server.pid ではなく rm -f tmp/pids/unicorn.pid を消す設定

2AWS設定
2,1 タスク定義
2.1.1 コンテナマウントポイントを設定 docker-compose.ymlのvolumesと同じ値をいれればOK
イメージ説明
2.1.2 ストレージ- オプション部分のボリュームを設定 コンテナマウントポイントのソースボリューム2種類と同じもの
イメージ説明
2.1.3 nginxの設定スタートアップの依存関係の順序 - オプション設定 コンテナ名Rails 条件start これはnginxがRailsに接続するため
イメージ説明
2.1.4 サービスの作成 ロードバランサーのコンテナ部分 nginx 80:80 に設定 リスナーのポートは80 ターゲットグループのプロトコルとヘルスチェックプロトコルは HTTP nginxにロードバランサーは接続するためこう設定
イメージ説明
2.1.5 ロードバランサーリスナーとルールの部分も HTTPSのターゲットグループはポート80の方へ変更
イメージ説明

以上を変更したり設定したりして改善しました。
コメントと回答をいただきありがとうございました。

投稿2023/11/25 08:51

mumu1354

総合スコア18

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

何か解決につながればという思いで気づいた点コメントします。

nginx.confの設定について

nginx.confを確認したところ、server unix:/cat-img-api/tmp/sockets/.unicorn.sockが設定してあったので、unicornとrailsがソケット接続したいというイメージで実装されていると思いました。
https://github.com/yon-s/cat-img-api/blob/main/nginx/nginx.conf#L3
PRの差分で追加している部分が少し気になりましたが、mainブランチには反映されていないので、特に問題ないですがソケット通信であれば、TCP/IPのserver 127.0.0.1:3000;の部分はコメントアウトしても良いかと思いました。
https://github.com/yon-s/cat-img-api/pull/8/files#diff-4adaaefa7fc959e7dfe65e8dc8dadc9ee27ddd284eee3426463b1cdc000587d5

ECSの設定について

ECSのログでunicornとnginxは問題なく立ち上がっている

まず前提としてRailsサーバーは問題なく起動していると仮定してお聞きします。エラーの切り分けとして、ドメインにアクセスした際にnginxとRailsのログをそれぞれ確認してみると良いと思いまいた。

  • ロードバランサーからnginxまでの接続は問題ないか?
  • nginxからrailsの接続は問題ないか?

ソケットで通信する場合

RailsとNginxでそれぞれ同じVolumeを共有する必要があるので、ECSのおそらくサービスだったと思いますが、Dockerfileで定義しているように、Volumeの定義が出来ているか確認すると良いと思いました。今回であれば、/cat-img-api/tmp/をお互いで共有しているような格好になるかと思います。

調べる際に何かのヒントに繋がれば幸いです。

投稿2023/11/20 13:42

編集2023/11/20 13:45
aki366

総合スコア2

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mumu1354

2023/11/20 15:21

ありがとうございます。 やってみます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.53%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問