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

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

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

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Ruby on Rails

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

AWS(Amazon Web Services)

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

Capistrano

Rubyで書かれたサーバオーケストレーションで、複数のサーバでスクリプトを実行する際に用いられます。主な使用用途はWebアプリケーションのデプロイメントです。 アプリケーションのバージョンアップ自動化、およびデータベースの変更などもできます。

解決済

Capistranoでのデプロイ実行時、"Access denied for user 'ec2-user'@'localhost' (using password: NO)"のエラーが出る

otdsh9432
otdsh9432

総合スコア53

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Ruby on Rails

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

AWS(Amazon Web Services)

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

Capistrano

Rubyで書かれたサーバオーケストレーションで、複数のサーバでスクリプトを実行する際に用いられます。主な使用用途はWebアプリケーションのデプロイメントです。 アプリケーションのバージョンアップ自動化、およびデータベースの変更などもできます。

1回答

0評価

0クリップ

1690閲覧

投稿2020/11/28 02:44

困っていること

個人開発でCapistranoを用いてRailsアプリを本番環境であるEC2サーバへ自動デプロイしようとしましたが、ローカルから「bundle exec cap production deploy」を実行すると「deploy:migrating」のタスクのところで、
「Mysql2::Error::ConnectionError: Access denied for user 'ec2-user'@'localhost' (using password: NO)」というエラーが出ます。
⇒これに対し**「適切なDB接続の指定をするためにはどうすべきか」**を中心に、エラー解消方法をお伺いしたくご質問させていただきました。

環境

・ローカル:DockerのRailsコンテナ
・本番環境:AWS EC2(Amazon Linux2)⇒Webサーバ:Nginx、APサーバ:Puma
・本番DB環境:AWS RDS for MySQL(MySQL5.7)
・Ruby 2.6.5、Rails 5.2.4

同環境にて、手動デプロイにて同じRailsアプリをGitHubからクローンし、
各サーバを起動の上、ローカルのブラウザからHTTPアクセスでき、CRUDの操作もできることは確認済です。(DBへの反映も確認)
その上で、自動デプロイができるよう取り組んでいる次第です。
EC2上からDB(RDS側)への接続もできる状態です。

Capistrano関連のファイル

・deploy.rb

ruby

lock "3.7.0" set :application, "myfavrest-app" set :user, "ec2-user" set :repo_url, "git@github.com:(省略)" set :log_level, :debug set :deploy_to, "/home/#{fetch(:user)}/var/www/#{fetch(:application)}" set :linked_files, fetch(:linked_files, []).push("config/master.key") append :linked_files, "config/database.yml" append :linked_dirs, "log", "tmp/pids", "tmp/cache", "tmp/sockets" set :keep_releases, 3 # ----------カスタマイズしたタスク------------ namespace :deploy do # linked_filesで使用するファイルをアップロードするタスク。deploy前に実行する。 desc 'upload linked_files' task :upload do on roles(:app) do |_host| execute :mkdir, '-p', "#{shared_path}/config" upload!('config/database.yml', "#{shared_path}/config/database.yml") upload!('config/master.key', "#{shared_path}/config/master.key") # puma.rbをデプロイ時に毎回作成する invoke 'puma:config' end end end # nginxの起動・停止・再起動 namespace :nginx do %w[start stop restart].each do |command| desc "#{command} nginx" task command.to_s do on roles(:web) do sudo "service nginx #{command}" end end end end # capistrano内の変数一覧表示 namespace :config do desc 'show variables' task :display do Capistrano::Configuration.env.keys.each do |key| puts "#{key} => #{fetch(key)}" end end end # デプロイ開始前のサーバ停止タスク(nginx => puma) before 'deploy:starting', 'nginx:stop' after 'nginx:stop', 'puma:stop' after 'puma:stop', 'deploy:upload' # デプロイ完了後のサーバ起動タスク(puma => nginx) after 'puma:start', 'nginx:start'

・production.rb

Ruby

server '(省略)', user: 'ec2-user', roles: %w[app db web], ssh_options: { keys: %w(~/.ssh/(省略)), forward_agent: true, auth_methods: %w(publickey) }

・Capfile

Ruby

require "capistrano/setup" require "capistrano/deploy" require 'capistrano/scm/git' install_plugin Capistrano::SCM::Git require 'capistrano/bundler' require 'capistrano/rbenv' require 'capistrano/rails/assets' require 'capistrano/rails/migrations' require 'capistrano/puma' install_plugin Capistrano::Puma install_plugin Capistrano::Puma::Nginx Dir.glob("lib/capistrano/tasks/*.rake").each { |r| import r }

エラー事象のキャプチャ

エラー事象
なお、このタスク以前のタスクは正常動作している状態です。

試したこと①

「'ec2-user'@'localhost' (using password: NO)」と出ていますが、DB接続時のユーザ、ホスト名、パスワードは、database.ymlに定義している本来のものとは違っています。
**database.ymlが本番サーバへアップロードできていないのか?**と思い確認しましたが、shared配下にローカルと同じ内容のファイルが存在しました。

[ec2-user@ip-10-0-10-10 myfavrest-app]$ ls -l shared/config/ total 8 -rwxrwxr-x 1 ec2-user ec2-user 1950 Nov 28 01:50 database.yml -rwxrwxr-x 1 ec2-user ec2-user 32 Nov 28 01:50 master.key

・database.yml(ローカルもサーバ上も内容同じ)

yml

default: &default adapter: mysql2 charset: utf8 encoding: utf8 pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> username: mydev password: (省略) socket: /var/run/mysqld/mysqld.sock host: db development: <<: *default database: myfavrest-app_development test: <<: *default host: 127.0.0.1 # host: test-db database: myfavrest-app_test production: <<: *default database: <%= ENV['DB_NAME_PRODUCTION'] %> username: <%= ENV['DB_USER_PRODUCTION'] %> host: <%= ENV['DB_HOST_PRODUCTION'] %> password: <%= ENV['DB_PW_PRODUCTION'] %> socket: /var/lib/mysql/mysql.sock

⇒productionの各環境変数はサーバ上にも定義しており、確認できます。

[ec2-user@ip-10-0-10-10 config]$ echo $DB_NAME_PRODUCTION $DB_USER_PRODUCTION $DB_HOST_PRODUCTION $DB_PW_PRODUCTION myfavrestapp_production admin (省略)(省略)

試したこと②

エラーメッセージにて、DB接続先が「localhost」となっていることから推測し、
productionが指定できていないのではと考え、設定ファイルに下記追記して実行しましたが、
エラー事象は全く変わりませんでした。
・deploy.rb

Ruby

set :stages, %(production, staging) set :default_stage, "production"

・production.rb

Ruby

set :stage, :production

現在推測している原因

ec2-user@localhost、かつパスワードなしで接続しにいってしまっているということから、
db:migrateのタスクでの対象DB指定がうまくいっていないと推測しており、
Capistranoのソースを見たりして調査中なのですが、
よく理解できておらず、進展がないため、質問させていただいた次第です。
Capistrano:migrationタスクのソース

ご不明点等あればご教示いただけますと幸いです。
お手数をおかけしますが、よろしくお願いいたします。

良い質問の評価を上げる

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

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

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

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

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

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

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

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

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

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

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

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

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Ruby on Rails

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

AWS(Amazon Web Services)

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

Capistrano

Rubyで書かれたサーバオーケストレーションで、複数のサーバでスクリプトを実行する際に用いられます。主な使用用途はWebアプリケーションのデプロイメントです。 アプリケーションのバージョンアップ自動化、およびデータベースの変更などもできます。