実行環境
capistranoを使用してawsなどのサーバーにrailsアプリをデプロイ
-
デプロイする際にassets:precompileはローカル上で行う
サーバーが複数ある時などを考慮してローカルで行う
asset_syncを使用して、precompileで出力されるファイルを Amazon S3 などでホスティング
-
production環境はデプロイサーバーからデプロイ
デプロイサーバーからのデプロイはIAMロールからの認証
staging環境では、ローカル上からcapコマンドを叩いてデプロイ
EC2からS3へのアクセスはIAMロールでの認証
ローカル環境でassets:precompile
どのように設定をするかなどはもともと素晴らしい資料があったのでそちらを参照していただい方がいいだろう
以上を参考に設定を行った。
実行環境のような環境ではおそらくうまくいかないことがある。
失敗例
1.ローカル以外でもassets:precomile?
capfileに
require 'capistrano/rails/assets'
を設定している場合。。。
おそらく、初歩的なミスをする人は少ないと思うが、少なからず自分はこれで結構な時間を消費した。
そもそも、一度ローカルでassets:precompileするのだから、この設定はいらない。
そこに気づけず、ずっとdeployを失敗していた。
staging環境へのdeployの際にまず、最初にローカル上でassets:precompileが実行され、
asset_syncは
config.fog_provider = 'AWS'
config.fog_directory = ENV['FOG_DIRECTORY']
config.aws_access_key_id = ENV['AWS_ACCESS_KEY_ID']
config.aws_secret_access_key = ENV['AWS_SECRET_ACCESS_KEY']
以上の設定をすることで、s3にファイルをアップしてくれる
ここまではいいのだが、staging環境(awsのEC2)でもassets:precompileが実行されてしまう。
そうすると、IAMロールユーザーからの認証になるので、
config.fog_provider = 'AWS'
config.fog_directory = ENV['FOG_DIRECTORY']
config.aws_iam_roles = true
以上の設定が必要になる。
これが原因でエラーが起きていた。
対処方法としては、
capfileの
require 'capistrano/rails/assets'
をコメントにすればいいだけである。
すでにローカル上でassets:precompileするのだから、これは必要なくなる
2.stagingとproductionとでデプロイ方法が違う
上記の実行環境を見ていただくとわかるが、production環境の方はデプロイサーバーを介してデプロイをするが、staging環境ではローカル上から直接コマンドを叩いてデプロイする場合
何が問題かというと、asset_syncの設定が異なること!!
一般的には、config/initializers/asset_sync.rbに設定を記述する。
これが問題となる!!
production環境はデプロイサーバーからのデプロイであるからIAMロールが認証する
だから
config.fog_provider = 'AWS'
config.fog_directory = ENV['FOG_DIRECTORY']
config.aws_iam_roles = true
以上の設定が必要になる。
しかし、
stagingはローカル上からなので、
config.fog_provider = 'AWS'
config.fog_directory = ENV['FOG_DIRECTORY']
config.aws_access_key_id = ENV['AWS_ACCESS_KEY_ID']
config.aws_secret_access_key = ENV['AWS_SECRET_ACCESS_KEY']
以上の設定が必要になる。
stagingとproductionで設定が異なるという問題起きる。。。
対処方法は
config/environmets/rails_env.rb(rails_env=各環境) に設定を記述すればいい。
注意点としてstagingでのデプロイで必要となるasset_syncの設定はdevelopment.rbに記述する必要がある。理由はローカル上でassets:precompileをしているから!!!
最後に
以上のようにローカル上でのassets:precompileをする際の注意点を挙げたが、実際にこのようなことを防ぐために、複数台あるwebサーバーのうち一台のwebサーバー上でassets:precompileする方法もある。
これは実際の自分の環境などと比べてどうするかを決めればいいと思う。
最後まで読んでいただきありがとうございます。
何かありましたら、指摘お願いいたします。