こんばんは!
Capistranoを使って自動デプロイの設定まで順調にいきましたが、s3設定後の自動デプロイでエラーにハマったので備忘録
自動デプロイエラー文
ローカル
$ 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修正
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修正
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を設定されているか確認
ローカル
$ vim ~/.bash_profile
export AWS_SECRET_ACCESS_KEY='ここにCSVファイルに乗っている値をコピー'
export AWS_ACCESS_KEY_ID='ここにCSVファイルに乗っている値をコピー'
esc+ :wqで抜ける
$ source ~/.bash_profile
本番
[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書き換えて痛い目みた時の経験が少し役に立った。
エラーで手こずった場面もあったがデプロイまで漕ぎ着けて一安心。インフラももっと勉強しなければ。