【terraform+capistrano+itamae】Railsのアプリケーションをawsにデプロイした時の備忘録②
前回はterraform
でaws
の構築を行いました。
Capistrano
itamae
を使用して、環境の構築も同時に学習したかったのですが、あまりにも学習コストが高くなりそうだったので、サーバのrbenv
,nginx
やmysql
のインストールはまずは手動で行いました。bundler
はGemfile.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.rb
でdb
を指定しなかった場合、db_create
の中身は実行されない。
repo_url
ではGit
のPersonal API token
をxxxxに指定することでプライベートリポジトリの物もデプロイ可能。記事の下の方に参考サイトを貼っておきます。
lib/capistrano/tasks/unicorn.rb
unicorn
のタスクを記述したファイル。上のconfig/deploy.rb
内のunicorn:restart
が呼び出しているのはこのファイルに定義したタスク。
config/unicorn/production.rb
unicorn
の設定ファイル。capistrano
との関連はないが、デプロイ先のディレクトリについての関係は同じにしておく。
nginx
,mysql
等の設定については、参考サイト先を参照してください。基本的にこの辺りはのちにitamae
でカバーしようと思うので、入れるコマンドや手順はメモっておくとitamae
の導入が楽かもです。
環境変数
config
gemを使用しました。
ローカルには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'
こんな感じ。
awsのRDBを使用する
config/database.yml
でhost
をaws
に指定しなければいけない。なので、aws
のインスタンス内でyum install mysql-server
をやる必要はない。(aws
内にRDB
インスタンスを作っていない場合は例外)
プライベートリポジトリから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
最新のnodejs
とyarn
導入の参考
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.rb
のserver
のロールとして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
編ではその辺りにも注意して進めます。
次の記事はこっち