セキュリティ系の勉強、その他開発メモとか雑談. GithubはUnity触っていた頃ものがメイン Twitterフォローもよろしくです

【terraform+capistrano+itamae】Railsのアプリケーションをawsにデプロイした時の備忘録②


前回terraformawsの構築を行いました。

thinline196.hatenablog.com

Capistrano

itamaeを使用して、環境の構築も同時に学習したかったのですが、あまりにも学習コストが高くなりそうだったので、サーバのrbenv,nginxmysqlのインストールはまずは手動で行いました。bundlerGemfile.lockを参照して同じバージョンを入れるのが望ましいかも?

デプロイプロジェクトで使用しているgemが要求する物に関しては適宜入れていきます。ImageMagickとか。本当はitamaeでその辺りもカバーします。バージョン等は各環境に合わせて。

参考サイト

以下、設定ファイルの説明のみ書いていくので、手順が知りたい人はリンク先をおってください。 (デプロイ編①)世界一丁寧なAWS解説。EC2を利用して、RailsアプリをAWSにあげるまで - Qiita

AWS RailsアプリケーションのCapistranoによるデプロイ - Qiita

使用Gem

capistrano3-unicornは使用せずにやりました。

#Gemfile
group :development, :test do
 gem 'capistrano'
 gem 'capistrano-bundler'
 gem 'capistrano-rails'
 gem 'capistrano-rbenv'
end

group :production, :staging do
  gem 'unicorn'
end



bundle exec cap installを実行

capistrano設定

Capfile



config/deploy/production.rb

このファイルは大枠の設定ファイルみたいなイメージ。
serverにはデプロイする先のアドレスと、そこにどのロールのタスクを実行するか指定する。今回でいうとapp``db``webと指定したタスクが指定アドレス上で実行される。次に紹介するconfig/deploy.rbにてタスクごとにロールを振っているのがわかる。



config/deploy.rb

このファイルが上から実行されるみたいなイメージだと良いかも?上から変数を定義して下でタスクを順に実行するみたいな。例えば上のconfig/deploy/production.rbdbを指定しなかった場合、db_createの中身は実行されない。

repo_urlではGitPersonal API tokenをxxxxに指定することでプライベートリポジトリの物もデプロイ可能。記事の下の方に参考サイトを貼っておきます。



lib/capistrano/tasks/unicorn.rb

unicornのタスクを記述したファイル。上のconfig/deploy.rb内のunicorn:restartが呼び出しているのはこのファイルに定義したタスク。



config/unicorn/production.rb

unicornの設定ファイル。capistranoとの関連はないが、デプロイ先のディレクトリについての関係は同じにしておく。



nginx,mysql等の設定については、参考サイト先を参照してください。基本的にこの辺りはのちにitamaeでカバーしようと思うので、入れるコマンドや手順はメモっておくとitamaeの導入が楽かもです。



環境変数

configgemを使用しました。 ローカルにはconfig/secrets.yml

# config/secrets.yml(ローカル)
production:
  secret_key_base: <%= Settings.production[:secret]%>

としましたが、他のページにもいくつか同じように指定している箇所があるかと思います。上のconfig/deploy.rbの設定で、shared/config/settings/production.ymlシンボリックリンクを生成することを宣言したため、そちらに内緒にしたい値を定義していきます。

# shared/config/settings/production.yml (aws)
database:
  user_name: 'root'
  password: 'hogehoge'
production:
  secret: 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
mail:
  address: 'test@example.com'
  password: 'xxxxxxxxxxxxx'

こんな感じ。

awsRDBを使用する

config/database.ymlhostawsに指定しなければいけない。なので、awsインスタンス内でyum install mysql-serverをやる必要はない。(aws内にRDBインスタンスを作っていない場合は例外)

EC2とRDSでrailsを動かす - Qiita



プライベートリポジトリからdeployする

Capistrano3でgithubのプライベートリポジトリを簡単にデプロイする方法 · polidog lab++

CapistranoでGitHubにアクセスする際のネットワークプロトコルをhttpsにする - Qiita



デプロイ実行

$ bundle exec cap production deploy



その他対処など..

assets:precompileエラー

ActionView::Template::Error (The asset "application.css" is not present in the asset pipeline.):

上のエラーはcss等が未コンパイルのためエラーが起こる。自分でコンパイルする必要があるが、yarnが必要になるため、下記事を参考に導入後次のコマンドを入力する。

エラー解決の参考 Rails5でnginx+pumaでproduction環境を構築する · atwata developer blog
最新のnodejsyarn導入の参考 EC2にyarnをインストールする|新卒エンジニアの開発日記

bundle exec rake assets:precompile RAILS_ENV=production また、静的ファイルが読み込めない場合以下をconfig/environments/production.rbに記述

  # config.public_file_server.enabled = ENV['RAILS_SERVE_STATIC_FILES'].present? コメントアウト
  config.public_file_server.enableda = true



ImageMagic問題

gemのrmagicのバージョンが3だと、ImageMagicのバージョン7に2019年6月現在対応していない。が、6系も低すぎるとエラーになる。

ImageMagicインストール参考サイト

Install ImageMagick from source on Amazon Linux · GitHub


ImageMagicバージョンダウンロードサイト Index of /download

db:migrate

参考にしたサイト通りにやっていればエラーなど出ないが、db:migrateが実行されない現象にぶつかった。 config/deploy/production.rbserverのロールとしてdbを含めていなかったため、dbロールに割り当てられていた、マイグレーションの実行がされておらずテーブルが生成されていなかった。(itamae導入前なので、テーブル自体は手動で生成した)

Capistrano の db ロール - akishin999の日記



デプロイ時エラー

git stdout: Nothing written
git stderr: fatal: Not a valid object name
tar: これは tar アーカイブではないようです
tar: 前のエラーにより失敗ステータスで終了します

=>Capfileで指定したデプロイするブランチ名が違っていた。

sharedディレクトリ等の作成

あらかじめディレクトリを生成しておく場合、権限を正しくしておかないとcapistranoが書き込めなくてエラーがでる。terraformで使用したアカウントとcapistranoで使用するアカウントの権限の差に注意しておくこと。特に、ec2-userより権限の小さいユーザを生成してから、capistranoでデプロイするとだいたい書き込めないので注意。次回のitamae編ではその辺りにも注意して進めます。
次の記事はこっち

thinline196.hatenablog.com