Help us understand the problem. What is going on with this article?

Capistrano自動デプロイ中の「ArgumentError: Missing required arguments: aws_access_key_id, aws_secret_access_key」エラー

こんにちはこんばんは!
駆け出しエンジニアバンドマンのミナミ(@minami_genkiboy)です。

今日もハマりにハマったエラーを共有します。

作業環境

・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/

とディレクトリを降りていき、

unicorn.stderr.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のアクセスキーとシークレットアクセスキーの記述がある。

(※credentials.yml.encはVSCODEなどのIDEで直接開くことができません)

では本番環境ではどうか?

②本番環境

cd/var/www/自アプリの名前/shared/config/master.key

を見ようとしたが、そもそもsharedディレクトリの中にconfigディレクトリがない。

master.keyもない。

こりゃ問題だ。原因を探ろう。

deploy.rbを確認

以下の記述を追加しました。

config/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のサービスにアクセスするためのアクセスキーが記載されておる。

これこれ。

carrierwave.rb
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_genkiboy)
技術に関する呟きを日々しています。
これは以前やっていたバンドの動画。ぜひ観てね!
https://www.youtube.com/watch?v=26A7QeuEw04&feature=youtu.be

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした