セキュリティ系の勉強・その他開発メモとか雑談. 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