本記事は、開発環境のCloud9からAWSサービスを連携してデプロイすることをゴールにした連載記事です。
Railsアプリをデプロイしよう!!の全体目次はこちらをご覧ください。
本編では、筆者が遭遇したエラー対応の一部を記録した記事です。
収穫があるかもしれないし、ないかもしれないです。笑
紹介するエラーは、全体の一部ではありますが、みなさまのエラー対応の参考になれば幸いです。
心の声が出てたりするので、読みにくいかもしれません、悪しからず。。
目次
本番環境構築時の一部始終
下記はssh接続後に行った流れです。
======================================================
#現在インストールされているパッケージを確認
$ yum list installed
いました、、MariaDBです。
# 省略
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エラーのようなエラーとは仲良くなれません😭
みなさんは、仲良くしてくださいね?
本編は以上です。