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

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

新規登録して質問してみよう
ただいま回答率
85.35%
docker-compose

docker-composeとは、複数のコンテナで構成されるサービスを提供する手順を自動的し管理を簡単にするツール。composeファイルを使用しコマンド1回で設定した全サービスを作成・起動することが可能です。

Ruby on Rails 6

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

Docker

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

AWS(Amazon Web Services)

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

Q&A

解決済

1回答

1529閲覧

ECSにデータベースが作成されない原因を解決したい

yuu0000

総合スコア4

docker-compose

docker-composeとは、複数のコンテナで構成されるサービスを提供する手順を自動的し管理を簡単にするツール。composeファイルを使用しコマンド1回で設定した全サービスを作成・起動することが可能です。

Ruby on Rails 6

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

Docker

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

AWS(Amazon Web Services)

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

0グッド

0クリップ

投稿2021/07/26 13:01

前提・実現したいこと

現在,開発環境をDocker化してから、AWS(ECS)を利用してアプリケーションのデプロイを実装しております。

その実装途中で、ECS上データベースが作成されないエラーが生じたためご相談させてください。

デプロイはFargateを利用しており、ECSでクラスターの作成後にサービス設計を行なったところ、タスク上はRunningとなっているがタスクログにデータベースの作成に失敗したと表示されました。

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

タスク上のログ(ECS)

2021-07-26 19:26:48Tasks: TOP => db:create 2021-07-26 19:26:48(See full trace by running task with --trace) 2021-07-26 19:26:48rails aborted! 2021-07-26 19:26:48ActiveRecord::ConnectionNotEstablished: Unknown MySQL server host 'db' (-2) 2021-07-26 19:26:48Caused by: 2021-07-26 19:26:48Mysql2::Error::ConnectionError: Unknown MySQL server host 'db' (-2) 2021-07-26 19:26:48Unknown MySQL server host 'db' (-2) 2021-07-26 19:26:48Couldn't create 'locat' database. Please check your configuration.

正常に作成された場合

該当のソースコード

entrypoint.sh

#!/bin/bash set -e # Remove a potentially pre-existing server.pid for Rails. rm -f /locat/tmp/pids/server.pid bundle exec rails db:create bundle exec rails db:migrate bundle exec rails db:seed # Then exec the container's main process (what's set as CMD in the Dockerfile). exec "$@"

Dockerfile(rails)

FROM ruby:3.0.1 ENV RAILS_ENV=production RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - \ && echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs yarn WORKDIR /locat COPY Gemfile /locat/Gemfile COPY Gemfile.lock /locat/Gemfile.lock RUN gem install bundler RUN bundle install COPY . /locat COPY entrypoint.sh /usr/bin/ RUN chmod +x /usr/bin/entrypoint.sh ENTRYPOINT ["entrypoint.sh"] EXPOSE 3000 VOLUME /locat/public VOLUME /locat/tmp CMD ["rails", "server", "-b", "0.0.0.0"]

containers/nginx/Dockerfile

FROM nginx:1.19.1 RUN apt-get update && \ apt-get install -y apt-utils \ locales && \ sed -i -e 's/# ja_JP.UTF-8/ja_JP.UTF-8/g' /etc/locale.gen && \ locale-gen ja_JP.UTF-8 ENV LANG ja_JP.UTF-8 ENV LC_TIME C COPY ./nginx.conf /etc/nginx/nginx.conf COPY ./conf.d/default.conf /etc/nginx/conf.d/default.conf

上記のファイルは、ECRのリポジトリへプッシュ済です。

ECSの設定は下記の記事を参考にして構築しました。

試したこと

  • Docker環境上では、エラーが生じることなくアプリケーションが起動しているため、本番環境上でのエラーであることは分かっており、データベースが作成できていないためにアプリケーションの立ち上げが出来ない状態にある。
  • ECS用に作成したRDSのインバウンドルールのセキュリティーグループとの連携ができていないことを考えて調べてみましたが、記載通り正しく入力されていた。

補足情報(FW/ツールのバージョンなど)

  • rubymine
  • ruby(3.0.1)
  • Ruby on rails (6.1.3.1)
  • Docker (20.10.7)
  • Github

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

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

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

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

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

yu_1985

2021/07/27 02:06

データベースを作成したい先はRDSなんでしょうか? エラーメッセージを見ると、接続先ホスト名に`db` と指定しているようですが、ECSではどのような構成で動かそうとしていますか? もしかしてローカルではdocker-composeで動かしていませんかね。
yuu0000

2021/07/27 03:52 編集

ありがとうございます。 そうですね、RDSで作成する実装で進めております。 ECSはこちらの記事を参考に作成しております。 https://qiita.com/maru401/items/8e7d32a8baded045adb2#4ecsの作成 認識が間違っておりましたら申し訳ないのですが、 構成としては、 ・ローカル環境のDockerfile(rails用, nginx用)をECRにプッシュ ・Fargateでタスク定義を行い、コンテナを先程プッシュした内容を参考に構成しました。(Railsコンテナ, nginxコンテナ) ・クラスターの作成 ・サービスの作成 ・サービス設計 で作成しました。 ローカルでは、$ docker-compose upなどで動かしております。
inductor

2021/07/27 08:37

Database.ymlのproduction設定はどうなってますか? また、ECSのタスク定義にRDS接続情報はありませんか?
yuu0000

2021/07/27 10:43 編集

databese.ymlの設定を下記のように修正しました。 (hostを作成し、環境変数に設定したRDSのエンドポイントを指定するようにしております) [databese.yml] production: <<: *default database: <%= Rails.application.credentials.db[:database] %> username: <%= Rails.application.credentials.db[:username] %> password: <%= Rails.application.credentials.db[:password] %> socket: <%= Rails.application.credentials.db[:socket] %> host: <%= Rails.application.credentials.db[:host] %> [環境変数 $ EDITOR=vim bin/rails credentials:edit ] #aws: # access_key_id: xxxxxxxxxxxxxx # secret_access_key: xxxxxxxxxxxxx # Used as the base secret for all MessageVerifiers in Rails, including the one protecting cookies. secret_key_base: xxxxxxxxxxxxxxxxxxxxxxxx db: database: locat username: root password: xxxxxxxxxxxxxxxxx socket: xxxxxxxxxxxxxxxxxxx host: xxxxxxxxxxxxxxxxxx hostにRDSのエンドポイントを設定 ECSのタスク定義において、RDSの接続情報の確認方法をご指摘頂いてもよろしいでしょうか、、
inductor

2021/07/27 17:46

Web UIから見れないですかね?
yuu0000

2021/07/27 18:33 編集

一応、こちらの記述でECRへ修正内容をプッシュしたところデータベースの作成ができました。 [クラスター上のタスクログ] 2021-07-27 20:47:10Use Ctrl-C to stop 2021-07-27 20:47:10Puma starting in single mode... 2021-07-27 20:47:10* Puma version: 5.2.2 (ruby 3.0.1-p64) ("Fettisdagsbulle") 2021-07-27 20:47:10* Min threads: 5 2021-07-27 20:47:10* Max threads: 5 2021-07-27 20:47:10* Environment: production 2021-07-27 20:47:10* PID: 1 2021-07-27 20:47:10* Listening on http://0.0.0.0:3000 2021-07-27 20:47:07=> Rails 6.1.3.1 application starting in production 2021-07-27 20:47:07=> Run `bin/rails server --help` for more startup options 2021-07-27 20:47:07=> Booting Puma 2021-07-27 20:46:51Database 'locat' already exists Listening on http://0.0.0.0:3000で表示するとアプリケーションの確認ができるのですが、こちらはローカルでのアクセスになりますよね? タスク上のパブリックIPでアクセスしたところnginxが表示されました。別の媒体で原因を聞いたところnginxの設定が原因だとご指摘頂きました。 https://gyazo.com/b8dfbd61818c401e96a9b6bed1651bc9 ブラウザ上にRailsアプリケーションを表示させるにはnginxの設定をどのように修正すればよろしいでしょうか、、 [containers/nginx/Dockerfile] FROM nginx:1.19.1 RUN apt-get update && \ apt-get install -y apt-utils \ locales && \ sed -i -e 's/# ja_JP.UTF-8/ja_JP.UTF-8/g' /etc/locale.gen && \ locale-gen ja_JP.UTF-8 ENV LANG ja_JP.UTF-8 ENV LC_TIME C COPY ./nginx.conf /etc/nginx/nginx.conf COPY ./conf.d/default.conf /etc/nginx/conf.d/default.conf [containers/nginx/nginx.conf] user nginx; worker_processes auto; error_log /var/log/nginx/error.log warn; pid /var/run/nginx.pid; events { worker_connections 1024; } http { include /etc/nginx/mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; sendfile on; keepalive_timeout 600; include /etc/nginx/conf.d/*.conf; } [containers/nginx/conf.d/default.conf] upstream unicorn { server 127.0.0.1:3000; } server { listen 80 default_server; server_name localhost; root /usr/share/nginx/html; try_files $uri/index.html $uri @unicorn; proxy_connect_timeout 600; proxy_read_timeout 600; proxy_send_timeout 600; client_max_body_size 100m; error_page 404 /404.html; error_page 505 502 503 504 /500.html; location @unicorn { proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host; proxy_pass http://unicorn; } }
yu_1985

2021/07/28 05:52

データベースが作成できたなら、この質問としては解決なので必要があれば別の質問を立ててください。 > 別の媒体で原因を聞いたところnginxの設定が原因だとご指摘頂きました。 蛇足かもしれませんが一般的にマルチポスト行為をする方は質問を放置する傾向が強いため嫌われることが多いのでご注意ください。 https://ja.wikipedia.org/wiki/%E3%83%9E%E3%83%AB%E3%83%81%E3%83%9D%E3%82%B9%E3%83%88 https://ja.meta.stackoverflow.com/questions/1766/%E3%82%B9%E3%82%BF%E3%83%83%E3%82%AF%E3%82%AA%E3%83%BC%E3%83%90%E3%83%BC%E3%83%95%E3%83%AD%E3%83%BC%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8B%E3%83%9E%E3%83%AB%E3%83%81%E3%83%9D%E3%82%B9%E3%83%88%E3%81%AE%E6%89%B1%E3%81%84/1769 また、コミュニティによっては禁止されているのでご注意ください(たとえばmixiでは禁止だそうで) Teratailにおいては、禁止ではないですが非推奨とされています。 https://teratail.com/help#posted-otherservice
yuu0000

2021/07/28 09:21

かしこまりました! たくさんのアドバイスなどを頂き大変参考になりました
guest

回答1

0

自己解決

エラー原因

今回ECS上でデータベースが作成できなかった原因としては、mysqlに対してホスト名 “db”で接続しようとしていたことが原因でした。

ローカル環境下で、ホスト名がDBと設定されているためこの部分をAWS上のRDSと繋ぐ必要がありました。

変更前のdatabase.yml

# MySQL. Versions 5.5.8 and up are supported. # # Install the MySQL driver # gem install mysql2 # # Ensure the MySQL gem is defined in your Gemfile # gem 'mysql2' # # And be sure to use new-style password hashing: # https://dev.mysql.com/doc/refman/5.7/en/password-hashing.html # default: &default adapter: mysql2 encoding: utf8 pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> username: root password: password socket: /tmp/mysql.sock host: db development: <<: *default database: locat_development # Warning: The database defined as "test" will be erased and # re-generated from your development database when you run "rake". # Do not set this db to the same as development or production. test: <<: *default database: locat_test production: <<: *default database: <%= Rails.application.credentials.db[:database] %> username: <%= Rails.application.credentials.db[:username] %> password: <%= Rails.application.credentials.db[:password] %> socket: <%= Rails.application.credentials.db[:socket] %> # As with config/credentials.yml, you never want to store sensitive information, # like your database password, in your source code. If your source code is # ever seen by anyone, they now have access to your database. # # Instead, provide the password or a full connection URL as an environment # variable when you boot the app. For example: # # DATABASE_URL="mysql2://myuser:mypass@localhost/somedatabase" # # If the connection URL is provided in the special DATABASE_URL environment # variable, Rails will automatically merge its configuration values on top of # the values provided in this file. Alternatively, you can specify a connection # URL environment variable explicitly: # # production: # url: <%= ENV['MY_APP_DATABASE_URL'] %> # # Read https://guides.rubyonrails.org/configuring.html#configuring-a-database # for a full overview on how database connection configuration can be specified. #

解決方法

  • AWSのRDSに記述されているエンドポイントをコピー
  • % EDITOR=vim bin/rails credentials:editでhostを追加
#aws: # access_key_id: AKIAU2S6QQYAB4JOXSO6 # secret_access_key: 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 # Used as the base secret for all MessageVerifiers in Rails, including the one protecting cookies. secret_key_base: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx db: database: xxxxxx username: xxxxxx password: xxxxxx socket: xxxxxxx host: RDSのエンドポイントを指定する
  • 上記の環境変数にhostを追加し、RDSのエンドポイントを記述して接続先ホストを指定する

  • 接続先をRDSのエンドポイントに設定後、database.ymlにhostを追加して反映させる

database.yml

production: <<: *default database: <%= Rails.application.credentials.db[:database] %> username: <%= Rails.application.credentials.db[:username] %> password: <%= Rails.application.credentials.db[:password] %> socket: <%= Rails.application.credentials.db[:socket] %> host: <%= Rails.application.credentials.db[:host] %> ←新しく作成する
  • ECRリポジトリのlatest削除後に各種設定後にECRへ変更内容をプッシュ。
  • タスク定義内で設定したコンテナ(今回の場合はRailsに関するコンテナ)の削除を行い、再定義。
  • クラスターへ移動し、サービス名の選択後に設定したリビジョンを最新のものに変更。
  • 上記の手順でエラーを解決することができました!

投稿2021/07/28 09:47

yuu0000

総合スコア4

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問