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

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

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

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

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

AWS(Amazon Web Services)

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

解決済

AWS ECSにて、サービスで実行したタスクが3分程で停止してしまう原因がわからない

coffee_like
coffee_like

総合スコア0

nginx

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

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

AWS(Amazon Web Services)

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

1回答

0評価

0クリップ

5728閲覧

投稿2020/05/19 08:21

編集2022/01/12 10:58

実現したいこと

RailsアプリケーションをAWS ECSにて運用したいのですが、
サービスを実行すると、実行したタスクが数分で停止してしまいます。
サービスがタスク数を維持しようとしてまた新しくタスクが実行されますが、そのタスクも数分で停止します。
この繰り返しになってしまいます。

以前は問題なくサービスを実行できていたのですが、アプリの開発を行い、タスク定義をアップデートしたところ、
上記のような問題が発生しました。

*5/19追記
以前は問題なくサービスを実行できたと書きましたが、確認してみると、以前のコードでも上手く動きませんでした。
コード以外になんらかの変更を加えてしまい、それが原因となっている可能性が高そうです。

構成・前提

ロードバランサー:ALB データベース:RDS デプロイ:ECS => 起動方法: EC2 => 実行: クラスター1つ、サービス1つ、タスク1つ => タスク定義: Nginxコンテナ, Railsコンテナ (Unicorn) ALB-EC2間の通信: HTTPS Rails関連: => rails db:create, rails db:migrate 済み => RAILS_MASTER_KEY 設定済み

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

ECSのサービスにて実行したタスクが3分程で停止してしまいます。
具体的には、Nginxコンテナ, Railsコンテナが両方立ち上がるのですが、3分程でコンテナが停止し、どちらもSTATUSExited (137)になってしまいます。

また、同じタスクを、サービスを通さずに単発で実行すると、停止しません。
ECSコンソール=>クラスター=>タスク=>新しいタスクの実行
タスクは停止せず、コンテナは問題なく起動し、コンテナのSTATUSUPを維持します。

この違いは何なのでしょうか?

単発のタスク実行は成功することから、タスク定義は問題ないと考えます。

どちらのパターンも同じタスク定義を使用し、タスクの実行に使用しているEC2インスタンスも同じです。
どこに差分が生まれているのでしょうか?

試したこと

考えられる差分として、ALBのヘルスチェックが何らかの悪さをしているのではと考え、ヘルスチェックのプロトコルをHTTPSからHTTPに変更しましたが、結果は変わりませんでした。
(Nginxコンテナは、443ポートで動的ポートマッピングしているため、HTTPにすることによりNginxコンテナへのヘルスチェックの通信を切る形になります)

ログ

Dockerの標準出力、NginxとRailsAppのログファイルにも、ログは一切出力されませんでした。

該当のソースコード

servise

起動タイプ: EC2 新しいデプロイの強制: なし サービスタイプ: REPLICA タスクの数: 1 最小ヘルス数: 0 最大ヘルス数: 200 ヘルスチェックの猶予期間: 0 ロードバランシング: => ロードバランサー名: ALB => コンテナ名: Nginx => コンテナポート: 443 => ターゲットグループ: ALB-TargetGroup Service Auto Scaling: サービスの必要数を直接調整しない

task

# タスク定義 { "ipcMode": null, "executionRoleArn": null, "containerDefinitions": [ { "dnsSearchDomains": null, "environmentFiles": null, "logConfiguration": { "logDriver": "json-file", "secretOptions": null, "options": null }, "entryPoint": null, "portMappings": [ { "hostPort": 0, "protocol": "tcp", "containerPort": 443 } ], "command": null, "linuxParameters": null, "cpu": 0, "environment": [], "resourceRequirements": null, "ulimits": null, "dnsServers": null, "mountPoints": [ { "readOnly": null, "containerPath": "/rails-app-root/tmp/sockets", "sourceVolume": "sockets" }, { "readOnly": null, "containerPath": "/var/log/nginx", "sourceVolume": "logs" } ], "workingDirectory": null, "secrets": null, "dockerSecurityOptions": null, "memory": null, "memoryReservation": null, "volumesFrom": [], "stopTimeout": null, "image": "nginx-image", "startTimeout": null, "firelensConfiguration": null, "dependsOn": [ { "containerName": "nginx", "condition": "START" } ], "disableNetworking": null, "interactive": null, "healthCheck": null, "essential": true, "links": null, "hostname": null, "extraHosts": null, "pseudoTerminal": null, "user": null, "readonlyRootFilesystem": null, "dockerLabels": null, "systemControls": null, "privileged": null, "name": "nginx" }, { "dnsSearchDomains": null, "environmentFiles": null, "logConfiguration": { "logDriver": "json-file", "secretOptions": null, "options": null }, "entryPoint": null, "portMappings": [ { "hostPort": 0, "protocol": "tcp", "containerPort": 3000 } ], "command": [], "linuxParameters": null, "cpu": 0, "environment": [ { "name": "DB_HOST", "value": "rds-endpoint" }, { "name": "DB_PASSWORD", "value": "db-password" }, { "name": "DB_PORT", "value": "db-port" }, { "name": "DB_USER_NAME", "value": "db-user" }, { "name": "JAVA_HOME", "value": "/usr/lib/jvm/java-1.8.0-openjdk-amd64" }, { "name": "RAILS_ENV", "value": "production" }, { "name": "RAILS_LOG_TO_STDOUT", "value": "ture" }, { "name": "RAILS_MASTER_KEY", "value": "master-key-value" }, { "name": "TZ", "value": "Asia/Tokyo" } ], "resourceRequirements": null, "ulimits": null, "dnsServers": null, "mountPoints": [ { "readOnly": null, "containerPath": "/rails-app-root/tmp/sockets", "sourceVolume": "sockets" }, { "readOnly": null, "containerPath": "/rails-app-root/log", "sourceVolume": "logs" } ], "workingDirectory": null, "secrets": null, "dockerSecurityOptions": null, "memory": null, "memoryReservation": null, "volumesFrom": [], "stopTimeout": null, "image": "rails-app-image", "startTimeout": null, "firelensConfiguration": null, "dependsOn": null, "disableNetworking": null, "interactive": null, "healthCheck": null, "essential": true, "links": null, "hostname": null, "extraHosts": null, "pseudoTerminal": null, "user": null, "readonlyRootFilesystem": null, "dockerLabels": null, "systemControls": null, "privileged": null, "name": "rils-app" } ], "placementConstraints": [], "memory": "512", "taskRoleArn": null, "compatibilities": [ "EC2" ], "taskDefinitionArn": "arn:aws:ecs:ap-northeast-1:arn-number:task-definition/task-name:task-number", "family": "rails_app_task", "requiresAttributes": [ { "targetId": null, "targetType": null, "value": null, "name": "com.amazonaws.ecs.capability.ecr-auth" }, { "targetId": null, "targetType": null, "value": null, "name": "ecs.capability.docker-plugin.local" }, { "targetId": null, "targetType": null, "value": null, "name": "ecs.capability.container-ordering" }, { "targetId": null, "targetType": null, "value": null, "name": "com.amazonaws.ecs.capability.docker-remote-api.1.25" }, { "targetId": null, "targetType": null, "value": null, "name": "com.amazonaws.ecs.capability.logging-driver.json-file" }, { "targetId": null, "targetType": null, "value": null, "name": "com.amazonaws.ecs.capability.docker-remote-api.1.18" } ], "pidMode": null, "requiresCompatibilities": [ "EC2" ], "networkMode": "bridge", "cpu": "512", "revision": 96, "status": "ACTIVE", "inferenceAccelerators": null, "proxyConfiguration": null, "volumes": [ { "efsVolumeConfiguration": null, "name": "sockets", "host": null, "dockerVolumeConfiguration": { "autoprovision": null, "labels": null, "scope": "task", "driver": "local", "driverOpts": null } }, { "efsVolumeConfiguration": null, "name": "logs", "host": null, "dockerVolumeConfiguration": { "autoprovision": null, "labels": null, "scope": "task", "driver": "local", "driverOpts": null } } ] }

RailsApp

# Dockerfile FROM ruby:2.5.1 ENV JAVA_HOME /usr/lib/jvm/java-1.8.0-openjdk-amd64 RUN apt-get update \ && apt-get install -y \ build-essential \ nodejs \ openjdk-8-jdk ADD . /rails-app-root WORKDIR /rails-app-root RUN mkdir tmp tmp/sockets log \ && bundle install CMD unicorn_rails -c /rails-app-root/config/unicorn.rb -E production

nginx

# Dockerfile FROM nginx:1.15.8 RUN rm -f /etc/nginx/conf.d/* ADD docker/nginx/nginx.pro.conf /etc/nginx/conf.d/rails_app.conf RUN apt-get update \ && apt-get install -y \ openssl \ && mkdir /etc/ssl/ca \ && cd /etc/ssl/ca \ && openssl req -new -newkey rsa:2048 -keyout server.key -nodes -out server.csr -subj "/C=JP/ST=Prefecture/O=Hoge/CN=www.hoge.com" \ && openssl x509 -req -days 3650 -signkey server.key -in server.csr -out server.crt CMD /usr/sbin/nginx -g 'daemon off;' -c /etc/nginx/nginx.conf # docker/nginx/nginx.pro.conf upstream unicorn { server unix:///rils-app-root/tmp/sockets/unicorn.sock; } server { listen 443 default ssl; server_name www.hoge.com; access_log /var/log/nginx/access.log main; error_log /var/log/nginx/error.log warn; root /rails-app-root/public; client_max_body_size 100m; error_page 404 /404.html; error_page 505 502 503 504 /500.html; try_files $uri/index.html $uri @rails_app; keepalive_timeout 5; ssl_certificate /etc/ssl/ca/server.crt; ssl_certificate_key /etc/ssl/ca/server.key; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers HIGH:!aNULL:!MD5; location @rails_app { proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header Host $http_host; proxy_pass http://unicorn; } }

まとめ

なぜ、タスクは数分ですぐに停止してしまうのでしょうか?

サービスを通さずに単発でタスクを実行した状態と、サービスを通してタスクを実行した状態の差分に原因があると考えていますが、その原因をつかめておりません。
ALBが絡むくらいしか差分はないように思うのですが、ALBが原因であるとは考えづらいです、、。
このような問題の想定原因をご教授頂けますと幸いです。

宜しくお願い致します。

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

nginx

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

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

AWS(Amazon Web Services)

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