本記事は、開発環境のCloud9からAWSサービスを連携してデプロイすることをゴールにした連載記事です。

Railsアプリをデプロイしよう!!の全体目次はこちらをご覧ください。

本編では、筆者が遭遇したエラー対応の一部を記録した記事です。
収穫があるかもしれないし、ないかもしれないです。笑

紹介するエラーは、全体の一部ではありますが、みなさまのエラー対応の参考になれば幸いです。
心の声が出てたりするので、読みにくいかもしれません、悪しからず。。

本番環境構築時の一部始終

下記はssh接続後に行った流れです。

======================================================

ターミナル

#現在インストールされているパッケージを確認
$ yum list installed

いました、、MariaDBです。

ターミナル(ssh)

# 省略
mariadb-libs.x86_64                          1:5.5.68-1.amzn2                     installed
# 省略

Railsの開発環境でMySQLを利用している場合、本番環境でもMySQLを導入する必要があります。

ちなみに、筆者は3年前からcloud9を使用しておりますが、無料枠対象のAMI(Amazon マシーンイメージ)が変化したことで、パッケージとしてインストールされているDBが異なるようです。

Amazon Linux AMI → MySQL
Amazon Linux 2 AMI → MariaDB

Amazon Linux AMIが下記リンクの通り、2020年12月31日をもって標準サポートを終了しているため、今後はAmazon Linux 2 AMIが良いのでしょう。


DBをMySQLに切り替えるのと、あとはRailsの本番環境として必要なものは下記の通りです。
・Node.js

まずは、MariaDBを削除します。

ターミナル

$ sudo yum remove mariadb-libs

そして、各パッケージを最新版にしておきます。もし不具合でたらその時にまた考えます。

ターミナル

$ sudo yum -y update

続いてNode.jsをインストールしようとしますが、

ターミナル

$ sudo yum -y install nodejs

エラー発生しました。。

ターミナル

読み込んだプラグイン:extras_suggestions, langpacks, priorities, update-motd
パッケージ nodejs は利用できません。
エラー: 何もしません

ということで、ググってみると、機能拡張するためのEPELリポジトリを以下のコマンドで有効化すると良いみたいです。

ターミナル

$ sudo yum install epel-release

が、またもやエラーです。。

ターミナル

読み込んだプラグイン:extras_suggestions, langpacks, priorities, update-motd
amzn2-core                                                                                                                  | 3.7 kB  00:00:00     
パッケージ epel-release は利用できません。
エラー: 何もしません


epel-release is available in Amazon Linux Extra topic "epel"

To use, run
# sudo amazon-linux-extras install epel

Learn more at
https://aws.amazon.com/amazon-linux-2/faqs/#Amazon_Linux_Extras

書いてある通りにやってみます。

ターミナル

$ sudo amazon-linux-extras install epel

無事インストールできました。

そして、再度Node.jsをインストールすると

ターミナル

$ sudo yum -y install nodejs

無事インストールできました。よかった。

ですが、、なぜかバージョンがおかしい、、
nvmでインストールしている事例があるので、nvmで進め直します。
まず、nvmをインストールします。

ターミナル

#nodejsを削除します
$ sudo yum remove nodejs
#nvmをインストール
$ curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.34.0/install.sh | bash
$ . ~/.nvm/nvm.sh

#インストール可能なバージョンを確認
$ nvm ls-remote | grep v14

# バージョン14のいずれかをインストール
$ nvm install v14.17.5

#このコマンドでバージョンが表示されればOK
$ node -e "console.log('Running Node.js ' + process.version)"

続いてYarnのインストールをします。

ターミナル

$ curl -o- -L https://yarnpkg.com/install.sh | bash

次に、rbenvとruby-buildをインストールします。

ターミナル

$ git clone https://github.com/sstephenson/rbenv.git ~/.rbenv

すると、”-bash: git: コマンドが見つかりません”とエラー発生したため、

ターミナル

$ sudo yum -y install git

gitをインストールして下記のコマンドをそれぞれ実行します。

ターミナル

$ git clone https://github.com/sstephenson/rbenv.git ~/.rbenv

$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile

$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile

$ source .bash_profile

$ git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build

$ rbenv rehash

#rbenvでインストールできるものを確認
$ rbenv install --list

#開発環境に近いrubyのバージョンをインストール
$ rbenv install 2.7.4

rbenv install 2.7.4でエラーが発生しました。
=> error: no acceptable C compiler found in $PATH

上記のエラーは、Cコンパイラが入っていないので、以下のコマンドでCコンパイラをインストールすればOKのようです。

ターミナル

$ sudo yum install gcc

あらためて

ターミナル

$ rbenv install 2.7.4

ここで少し時間かかり、インストール成功するかと思いきや、エラー。。

Downloading ruby-2.7.4.tar.bz2...
-> https://cache.ruby-lang.org/pub/ruby/2.7/ruby-2.7.4.tar.bz2
Installing ruby-2.7.4...

BUILD FAILED (Amazon Linux 2 using ruby-build 20210804-1-g57c397d)

Inspect or clean up the working tree at /tmp/ruby-build.20210819143444.7578.JwWXXN
Results logged to /tmp/ruby-build.20210819143444.7578.log

Last 10 log lines:
	from ./tool/rbinstall.rb:846:in `block (2 levels) in install_default_gem'
	from ./tool/rbinstall.rb:279:in `open_for_install'
	from ./tool/rbinstall.rb:845:in `block in install_default_gem'
	from ./tool/rbinstall.rb:835:in `each'
	from ./tool/rbinstall.rb:835:in `install_default_gem'
	from ./tool/rbinstall.rb:799:in `block in <main>'
	from ./tool/rbinstall.rb:950:in `block in <main>'
	from ./tool/rbinstall.rb:947:in `each'
	from ./tool/rbinstall.rb:947:in `<main>'
make: *** [do-install-all] エラー 1

調べると、下記のパッケージを追加したほうが良いらしいので、、ビルドに必要なライブラリが不足しているためのようです。

ターミナル

$ sudo yum -y install gdbm-devel openssl-devel readline-devel zlib-devel


これでようやくRubyインストールできました。

あらためて

ターミナル

$ rbenv install 2.7.4

いけました!よかった!

ターミナル

$ rbenv global 2.7.4
$ rbenv rehash
$ ruby -v

ruby -vで意図したバージョンになっていればOKです。

ちなみに、rbenv localはrbenv globalに優先するらしいので、rbenv localでバージョン指定している場合は、お気をつけください。

デプロイ時のエラー

デプロイ中にunf_extのインストールエラー

エラーの原因は下記である

[stderr]An error occurred while installing unf_ext (0.0.7.6), and Bundler cannot
[stderr]continue.
[stderr]
[stderr]In Gemfile:
[stderr] payjp was resolved to 0.0.7, which depends on
[stderr] rest-client was resolved to 2.1.0, which depends on
[stderr] http-cookie was resolved to 1.0.4, which depends on
[stderr] domain_name was resolved to 0.5.20190701, which depends on
[stderr] unf was resolved to 0.1.4, which depends on
[stderr] unf_ext

ググっても、なかなか解決できない。
パッケージが足りないかもしれない、ということで下記も追加した。

ターミナル

$ sudo yum -y install gcc-c++  patch  libyaml-devel libffi-devel libicu-devel libxslt libxml2-devel libxslt-devel

$ sudo yum install libcurl-devel openssl-devel libuuid-devel pulseaudio-libs-devel

が、解決には至らず。

gemについて調べてみる

そしてドキュメントを見てみる

C++ compilerについて調べてみる

bcc を Amazon Linux 2 に導入してみたときのメモ

ということで、

ターミナル

$ sudo amazon-linux-extras install -y epel
$ sudo yum install -y bison cmake3 flex git iperf libstdc++-static python-netaddr gcc gcc-c++ zlib-devel elfutils-libelf-devel
$ sudo yum install -y luajit luajit-devel
$ sudo yum install -y http://repo.iovisor.org/yum/extra/mageia/cauldron/x86_64/netperf-2.7.0-1.mga6.x86_64.rpm
$ sudo yum install -y python2-pyroute2
$ sudo yum install -y clang clang-devel llvm llvm-devel llvm-static ncurses-devel

これもだめだった。。

改めて、gemの依存関係を片っ端からGemfileに入れてみる

gem 'rake', '~> 13.0', '>= 13.0.6'
gem 'bundler', '~> 2.2', '>= 2.2.26'
gem 'rake-compiler', '~> 1.1', '>= 1.1.1'
gem 'rake-compiler-dock', '~> 1.1'
gem 'rdoc', '~> 6.3', '>= 6.3.2'
gem 'test-unit', '~> 3.4', '>= 3.4.4'

bundle installして、再度デプロイを試みると

だめだ。。

最終的に、、本番環境のEC2でgemをインストールするとエラー解消しました。。

ターミナル

$ gem install unf_ext

理由はよく分かりません、、

ApplicationStopでハマった

stop_application.shに記載してもすぐに反映されない件、下記の記事がとてもわかりやすいです。

結局、下記の力ずく技で解決させました。

ApplicationStop イベントの処理を書き換える
力ずくでデプロイ済みのファイルを書き換えます。

mimemagicでbundle installエラー

デプロイ時にmimemagic関連でエラーになる場合、Railsのバージョンを上げることによって解決できました。

gem 'rails', '~> 6.1.3.1'

ターミナル

$ bundle update rails

(2021/03/27時点)Rails 5.2.5 / 6.0.3.6 / 6.1.3.1 はmimemagicに依存しないようなので、別のバージョンの場合は切り替えましょう。

デプロイ後のエラー

HTTP 502 (Bad Gateway) エラー

デプロイ後、IPアドレスでアクセスするとエラー画面が表示されます。
※まだドメイン設定はしていない状態です。

本番環境のログを確認すると

ターミナル

#production.logの確認コマンド(アプリ名は適宜)
$ sudo tail -f /var/www/rails/DC_product/log/production.log

立ち上げ時のログだけあり、アクセスした際のログが出力されていません。
続いて、rails consoleを立ち上げます。

ターミナル

#本番環境でrails cを実行
$ RAILS_ENV=production bundle exec rails c
pry(main)> Rails.logger
=> #<ActiveSupport::Logger:0x0000000003fa8838
 @default_formatter=#<Logger::Formatter:0x0000000003fa8a40 @datetime_format=nil>,
 @formatter=#<Logger::Formatter:0x0000000003fa87e8 @datetime_format=nil>,
 @level=0,
 @logdev=
  #<Logger::LogDevice:0x0000000003fa89f0
   @dev=#<File:/var/www/rails/DC_product/log/production.log>,
   @filename=nil,
   @mon_count=0,
   @mon_mutex=#<Thread::Mutex:0x0000000003fa8978>,
   @mon_mutex_owner_object_id=33375480,
   @mon_owner=nil,
   @shift_age=nil,
   @shift_period_suffix=nil,
   @shift_size=nil>,
 @progname=nil>

開発環境では、

pry(main)> Rails.logger
=> #<ActiveSupport::Logger:0x00007f8884781450
 @default_formatter=#<Logger::Formatter:0x00007f88847815b8 @datetime_format=nil>,
 @formatter=
  #<ActiveSupport::Logger::SimpleFormatter:0x00007f8884781400 @datetime_format=nil, @thread_key="activesupport_tagged_logging_tags:70112157370880">,
 @level=0,
 @logdev=
  #<Logger::LogDevice:0x00007f8884781568
   @dev=#<File:/home/ec2-user/environment/DC_product/log/development.log>,
   @filename=nil,
   @mon_count=0,
   @mon_mutex=#<Thread::Mutex:0x00007f88847814f0>,
   @mon_mutex_owner_object_id=70112157371060,
   @mon_owner=nil,
   @shift_age=nil,
   @shift_period_suffix=nil,
   @shift_size=nil>,
 @progname=nil>

大きな違いがない。。

つづいて、下記のサイトを参考にして対応してみます。

ターミナル

#curlを使って直接httpにアクセス
$ curl -IXGET http://IPアドレス/
=>
HTTP/1.1 502 Bad Gateway
Server: nginx/1.20.0
Date: Tue, 24 Aug 2021 06:05:07 GMT
Content-Type: text/html
Content-Length: 1635
Connection: keep-alive
ETag: "12cd1010-663"

500エラーだと思ってたら、502エラーだった。。
500も502も同じエラー画面を出力する設定になっていたため、気づきませんでした。笑これは大きな収穫です。

しかし、502のまま、、
改めて、本番環境のNginxの設定ファイル(/etc/nginx/conf.d/DC_product.conf)を見直してみると、設定にミスがありました。
(既に紹介したファイルの内容で設定すれば問題ないはずです。)

ここかよ!っといった具合に原因はあっさりでした。。
ネット上で拾って設定したコードが、現在の環境に一致していなかったのです。

めでたしめでたし。

ということで、エラー対応記録は以上です。
エラーと仲良くなりたいですけど、502エラーのようなエラーとは仲良くなれません😭

みなさんは、仲良くしてくださいね?

本編は以上です。