ミナミ(@minami_nakasato)です。
今日もハマりにハマったエラーを共有します。
作業環境
・ruby on rails 5.2.4
・AWS EC2
・nginx
・unicorn
・MySQL
経緯
現在取り組んでいるのはメル○カリのコピーアプリ作成。
capistranoで自動デプロイを行うため、ローカル環境で以下のコマンドを実行しました。
$ bundle exec cap production deploy
ターミナルとにらめっこしながらデプロイの進行状況を固唾を飲んで待つこの時間。
極度の緊張により寿命が縮んでいくのが分かります。
イヤ〜な予感にさいなまれ、満を持して、ほらきた!
真っ赤な字で
DEPLOY FAILED!
何度見ても慣れないものです。
内容はこちら↓
02:27 unicorn:start
〜
01 master failed to start, check stderr log for details
とのこと。
う〜ん、本番環境のunicornを起動する処理の段階でエラーのようですね。
とりあえずEC2にログインし、自アプリのディレクトリに入り、エラー詳細を確認しましょう。
cd/var/www/自アプリ/current/log/
とディレクトリを降りていき、
ArgumentError: Missing required arguments: aws_access_key_id, aws_secret_access_key
「AWSのアクセスキーとシークレットアクセスキーが見つからないのでAWSのサービスを操作できません」
とのこと。ほうほう。
ではローカル環境と本番環境の両方で、環境変数の記述がなされているかを確認しましょう。
①ローカルで確認
$ EDITOR=“vim" bin/rails credentials:edit
$ echo 'export EDITOR="vi"' >> ~/.zsh_profile
$ source ~/.zsh_profile
$ echo $EDITOR
vim
$ bin/rails credentials:edit
vimでcredentials.yml.encの中身を開いたところ、awsのアクセスキーとシークレットアクセスキーの記述がある。
では本番環境ではどうか?
②本番環境
cd/var/www/自アプリの名前/shared/config/master.key
を見ようとしたが、そもそもsharedディレクトリの中にconfigディレクトリがない。
master.keyもない。
こりゃ問題だ。原因を探ろう。
deploy.rbを確認
以下の記述を追加しました。
# master.key用のシンボリックリンクを追加
set :linked_files, %w{ config/master.key }
# デプロイ処理が終わった後、Unicornを再起動するための記述
after 'deploy:publishing', 'deploy:restart'
namespace :deploy do
task :restart do
invoke 'unicorn:restart'
end
# 以下の記述により、GitHubに記録を残すことなく、master.keyを本番環境内に保存できる。
desc 'upload master.key'
task :upload do
on roles(:app) do |host|
if test "[ ! -d #{shared_path}/config ]"
execute "mkdir -p #{shared_path}/config"
end
upload!('config/master.key', "#{shared_path}/config/master.key")
end
end
before :starting, 'deploy:upload'
after :finishing, 'deploy:cleanup'
end
上記をpushし、リモートリポジトリに反映させ、EC2内の自アプリディレクトリで
git pull origin master
を実行。これで最新のソースコードが本番環境に反映されました。
先ほど同様、sharedディレクトリの中を覗いてみると。
よ〜し、無事にsharedの中にconfig/master.keyが生成されたな。
意気揚々と自動デプロイコマンド
bundle exec cap production deploy
を実行!
…が、…だめ…!!失敗…!
他の可能性は何がある?
あ、そういえば。
carrierwave
画像投稿の機能を実装するために、「carrierwave」gemを使用しているな、おれ。
その際に作成したcarrierwaveの設定ファイルがあったぞ。
確認だ。
「config/initializers/carrierwave.rb」
これだ。
本番環境で画像投稿をしたときに、
画像データをS3(AWSのストレージサービス)に保存する必要があるから、
このファイル内にはAWSのサービスにアクセスするためのアクセスキーが記載されておる。
これこれ。
aws_access_key_id: Rails.application.credentials.aws_access_key_id,
aws_secret_access_key: Rails.application.credentials.aws_secret_access_key,
試しに「rails c」コマンドを使い、中身の値を確認してみよう。
$ rails c
[1] pry(main)> Rails.application.credentials.aws_access_key_id
=> nil
「nil」…!空っぽ…!
そこで以下の記述に変更してみる。
aws_access_key_id: Rails.application.credentials.aws[:access_key_id],
aws_secret_access_key: Rails.application.credentials.aws[:secret_access_key],
再び「rails c」を実行。すると…
成功!しっかり値が表示されている!
(秘匿情報なので記載は控えまする)
「今度こそ頼むよ」と念じながら自動デプロイコマンドを実行。
…無事にデプロイ成功!
よかったよかった。
同じエラーに悩んでる方の力になれますように🙏
======================================
ミナミ(@minami_nakasato)です。都内のベンチャー企業でwebデザイン/プログラミング/動画撮影や編集などをやっています。