【AWS】ArgumentError: Missing required arguments: aws_access_key_id, aws_secret_access_key

こんばんは！
Capistranoを使って自動デプロイの設定まで順調にいきましたが、s3設定後の自動デプロイでエラーにハマったので備忘録

## 自動デプロイエラー文

```terminal:ローカル
$ bundle exec cap production deploy
・
・
・
00:22 deploy:assets:precompile
      01 $HOME/.rbenv/bin/rbenv exec bundle exec rake assets:precompile
      01 rake aborted!
      01 ArgumentError: Missing required arguments: aws_access_key_id, aws_secret_access_key
```
`aws_access_key_id, aws_secret_access_key`が見当たらないよって怒られる

## Rails5.2からの変更点

>【Rails5.2】credentials.yml.encとmaster.keyでのデプロイによる今までとの変更点
https://qiita.com/katsu105/items/88675da5119762d73d92

この記事参考に`credentials.yml.enc`変更。

## carrierwave.rb修正

```ruby:carrierwave.rb
require 'carrierwave/storage/abstract'
require 'carrierwave/storage/file'
require 'carrierwave/storage/fog'

CarrierWave.configure do |config|
  if Rails.env.development? || Rails.env.test? #開発とテストは今まで通りに
    config.storage = :file
  elsif Rails.env.production? #本番はS3に保存する
    config.storage = :fog
    config.fog_provider = 'fog/aws'
    config.fog_credentials = {
      provider: 'AWS',
      aws_access_key_id: Rails.application.credentials.aws[:access_key_id],
      aws_secret_access_key: Rails.application.credentials.aws[:secret_access_key],
# credentials下にaws_access_key_idとaws_secret_access_keyはあるよ
      region: 'ap-northeast-1'
    }
    config.fog_directory  = 's3バケット名'
    config.asset_host = 'https://s3-ap-northeast-1.amazonaws.com/s3バケット名'
  end
end

```

## deploy.rb修正

```ruby:deploy.rb
# config valid for current version and patch releases of Capistrano
lock "~> 3.11.1"

set :application, "appname"
# どのリポジトリからアプリをpullするかを指定する
set :repo_url, "git@github.com:ユーザー名/appname.git"

# バージョンが変わっても共通で参照するディレクトリを指定
set :linked_dirs, fetch(:linked_dirs, []).push('log', 'tmp/pids', 'tmp/cache', 'tmp/sockets', 'vendor/bundle', 'public/system', 'public/uploads')

set :linked_files, fetch(:linked_files, []).push("config/master.key")#ここ注意

set :rbenv_type, :user
set :rbenv_ruby, '2.5.1'

# どの公開鍵を利用してデプロイするか
set :ssh_options, auth_methods: ['publickey'],
                  keys: ['~/.ssh/ここは自分の.pem']

# プロセス番号を記載したファイルの場所
set :unicorn_pid, -> { "#{shared_path}/tmp/pids/unicorn.pid" }

# Unicornの設定ファイルの場所
set :unicorn_config_path, -> { "#{current_path}/config/unicorn.rb" }
set :keep_releases, 5

# デプロイ処理が終わった後、Unicornを再起動するための記述
after 'deploy:publishing', 'deploy:restart'
namespace :deploy do
  task :restart do
    invoke 'unicorn:restart'
  end

  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

set :default_env, {
  rbenv_root: "/usr/local/rbenv",
  path: "/usr/local/rbenv/shims:/usr/local/rbenv/bin:$PATH",
  AWS_ACCESS_KEY_ID: ENV["AWS_ACCESS_KEY_ID"],
  AWS_SECRET_ACCESS_KEY: ENV["AWS_SECRET_ACCESS_KEY"]
}
```

## ローカル・本番両方にAWS_SECRET_ACCESS_KEYとAWS_ACCESS_KEY_IDを設定されているか確認

```terminal:ローカル
$ vim ~/.bash_profile

export AWS_SECRET_ACCESS_KEY='ここにCSVファイルに乗っている値をコピー'
export AWS_ACCESS_KEY_ID='ここにCSVファイルに乗っている値をコピー'
esc+ :wqで抜ける
$ source ~/.bash_profile
```

```terminal:本番
[ec2-user@ip-123-45-67-899 ~]$ sudo vim /etc/environment

AWS_SECRET_ACCESS_KEY='ここにCSVファイルに乗っている値をコピー'
AWS_ACCESS_KEY_ID='ここにCSVファイルに乗っている値をコピー'
esc+ :wqで抜ける
$ exit
sshに再ログイン
$ env | grep AWS_SECRET_ACCESS_KEY
$ env | grep AWS_ACCESS_KEY_ID
反映されているか確認
```

credentials.yml.encはgitignoreされているので、本番環境がcredentials.yml.encを読み込む為には本番環境の`/var/www/appname/shared/config/`配下に`master.key`ファイルが作られて、ローカルのcredentials.yml.enc内の値を呼び出せるようにすればいけるはず。

## まとめ

以前に[master.key書き換えて痛い目みた時](https://qiita.com/suzy1031/items/64598d44b428ccd7abc5)の経験が少し役に立った。

エラーで手こずった場面もあったがデプロイまで漕ぎ着けて一安心。インフラももっと勉強しなければ。