KH14
@KH14 (Kaho H)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

EC2サーバー上でrake db:migrateができません

起きているエラー

ローカルにてRailsを使ったWebアプリを作成し、AWS上にあげようとしています。

主にこちらの記事を参考に作業を進め、EC2インスタンスとRDSインスタンスを作成、
ローカルのターミナルからEC2サーバーにSSH接続し、そこからmysqlに接続できることも確認しています。
GitHubからアプリをクローンし、unicornとnginxの設定をして、
rake db:create RAILS_ENV=productionしたところで、

Mysql2::Error::ConnectionError: Access denied for user 'user'@'localhost' (using password: NO)

というエラーが出て解決できないでおります。
(※userのところは私の名前で、サーバーに接続したりmysqlのユーザーとしても登録している名前です)

EC2サーバーからアクセスしているのに'user'@'localhost'となっていて、
そこの設定がおかしいのだと思うのですが、なぜそうなっているのかがわかりません。
(RDSのユーザー名はrootに設定しました)

環境

バージョン
Ruby 3.0.0
Ruby on Rails 6.1.3
MySQL 8.0

試したこと

database.ymlの確認

myapp/config/fatabase.yml

default: &default
  adapter: mysql2
  encoding: utf8mb4
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: <%= ENV['DATABASE_USERNAME'] %>
  password: <%= ENV['DATABASE_PASSWORD'] %>
  socket: /tmp/mysql.sock

development:
  <<: *default
  database: myapp_development

test:
  <<: *default
  database: myapp_test

production:
  <<: *default
  adapter: mysql2
  encoding: utf8
  database: myapp_production
  username: <%= ENV['MYAPP_DATABASE_USERNAME'] %>
  password: <%= ENV['MYAPP_DATABASE_PASSWORD'] %>
  host: <%= ENV['MYAPP_DATABASE_HOST'] %>

myapp/.envrc ※下記パスワードは実際のものとは異なります

export DATABASE_USERNAME=root
export DATABASE_PASSWORD=password(ローカルで設定したもの)
export MYAPP_DATABASE_USERNAME=root(RDSのユーザー名)
export MYAPP_DATABASE_PASSWORD=password(RDSで設定したもの)
export MYAPP_DATABASE_HOST=RDSのエンドポイント

ローカルではdirenvを使っていたので、サーバー上にも.envrcを作成し、同じ内容で変数を定義し直しています。
こちらに入っているユーザー名とパスワードでサーバー上からのMySQLへの接続は
mysql -h エンドポイント -u root -pで、できています。

.envrcの読み込みがうまく行っていないとかと思い、
こちらにならって、ccredentials.yml.encに記載する方法も試しましたが結果は変わらずでした。

MySQLのユーザーを作成して権限を付与

試しに、EC2サーバーからMySQLに接続して、エラーが出ていたuserと同じ名前のユーザーを作成、
myapp_productionへのアクセスを許可してみましたが、結果は変わらずでした。
こちらを参考にしました。

トンチンカンなことばかり試しているような気がしますが、調べても他に方法が見つからず、困っております。

他に足りていない情報がありましたらご教示ください。
何かアドバイスいただけますと幸いです。よろしくお願いいたします。

0

1Answer

サーバで環境変数がセットされていないように思います。サーバにも .envrc を置いたとのことですが、 direnv がインストールされていなければ読み込まれないのでは。

.envrc はただのシェルスクリプトなので source で読み込むこともできます。以下のように実行して正しく動くか確かめてください。

$ source .envrc
$ rake db:create RAILS_ENV=production

# アプリから環境変数が見えているかだけ確かめるには:
$ rails r 'puts ENV["MYAPP_DATABASE_USERNAME"]'
1Like

Comments

  1. @KH14

    Questioner

    早速ご回答、ありがとうございます!
    恥ずかしながら、おっしゃる通り、.envrcを読み込むのを失念しておりました。
    無事、source .envrcで読み込み、migrationが通るようになりました。
    お力添え、ありがとうございました!

Your answer might help someone💌