LoginSignup
0
1

More than 5 years have passed since last update.

staging環境、production環境へのデプロイの際にローカル上でasset_syncを事項する際の注意点

Posted at

実行環境

  • 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する方法もある。

これは実際の自分の環境などと比べてどうするかを決めればいいと思う。

最後まで読んでいただきありがとうございます。

何かありましたら、指摘お願いいたします。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1