わかったつもりになってない?

わかったつもり防止のために、日常で学んだことをもう少し深堀したいブログ

CodeStarで作成したCloud9環境からhrokuへデプロイする手順と発生したエラーまとめ

ども、引き続きRuby on Railsで遊んでいる昨今です。ようやく、作ってたWebサービスが形になって、昨日herokuっていうプラットフォームサービスにデプロイ(Webサービスを利用できる形でアップロードする)したんですがめちゃくちゃエラーが出て完了するまでに5時間弱とかかかったので、次回以降のために発生したエラーと対処法をまとめておきます。

1.前提

この記事は2018/8/9に書いたものであり、その後のAWS側の変更次第では以下記載のとおりに実施しても成功しない可能性がありますのでご了承ください。

また、当記事でのCloud9環境はAWSのCodeStarを利用して作成したものになります。その他の手順で環境作った場合は、各種バージョンが異なっていたりすると思うので、適時対応してください。

CodeStarを利用したCloud9環境の構築手順は以下を参照してください。

【AWS】CodeStar + Cloud9でRuby on Railsを動かす手順まとめ - わかったつもりになってない?

2.herokuへデプロイする最短手順

エラー内容を残すためにも悪戦苦闘の過程を記事にしたいのですが、かなり長い上にぐちゃぐちゃした記事になってしまうので、「そんなことはいいから、とにかく手順が知りたい!」って方向けにまずは、上手くいく(はずの)手順をまとめておきます。

2-1.herokuにユーザ登録

なにはともあれ、herokuにユーザ登録しましょう。以下ページにアクセスして、各種情報を入力し「無料アカウント作成」ボタンを押下します。

すると、入力したメールアドレス宛に件名が「Key added to your Heroku account」のメールが届くので、メール本文に記載されているURLをクリックすれば登録完了です。登録自体はめっちゃ簡単。

https://signup.heroku.com/jp

2-2.herokuインストール

ここからが、Cloud9側の設定になります。

CodeStarでCloud9環境を作った場合、herokuがインストールされていないのでインストールします。以下コマンドを実行して、「command not found」が出力された場合はインストールされていないです。

$ heroku version
bash: heroku: command not found


以下コマンドを実行してインストールします。

$ cd ~/environment
$ wget https://cli-assets.heroku.com/heroku-v7.7.8/heroku-v7.7.8.tar.gz
$ sudo tar lxvf heroku-v7.7.8.tar.gz
$ export PATH="$PATH:~/environment/heroku/bin"


wgetとtarする対象のファイル名はherokuのバージョンアップに伴い変更される可能性が高いです。wgetできない場合は、以下サイト上に記載されているファイル名に適時変更してください。

https://cli-assets.heroku.com/version


このままだと、Cloud9のターミナル立ち上げるたびに「export」コマンドを実行しないとhrokuコマンドが使えないので、「.bash_profile」コマンドにexportコマンドを追記します。

$ vi ~/.bash_profile 
以下を登録して保存。
export PATH="$PATH:~/environment/heroku/bin"


再度、herokuコマンドを実行して以下のとおりエラーが出ればherokuのインストールは完了です。

$ heroku version
WARNING
WARNING Node version must be >=8.0.0 to use this CLI
WARNING Current node version: 6.14.3

2-3.node.js バージョンアップ

このままだと、node.jsのバージョンが古いとエラーが出てしまうので、node.jsのバージョンを上げます。


変更前のバージョン確認。

$ node -v
v6.14.3


バージョンアップ。エラーに記載されていた8.0.0に上げます。

$ nvm install v8.0.0


変更後のバージョン確認。

$ node -v
v8.0.0


node.jsのバージョン固定。これをしないと、Cloud9のターミナルを新しく立ち上げるたびにバージョンを上げる必要があります。

$ nvm alias default 8.0.0


再度herokuのバージョン確認。ちゃんとバージョンが返ってきました。

$ heroku version
heroku/7.7.8 linux-x64 node-v8.0.0

2-4.Gemfile修正

ここから、ようやくRailsチュートリアルの内容に入っていきます。
Cloud9上でGemfileを開き、以下のとおり修正します。herokuはCloud9で標準で使われているSqlLiteっていうDBはサポートしていません。そのため、Cloud9上ではSqlLiteを、herokuではPostgreSQLというDBを使うように設定します。

<<略>>
以下を削除
gem 'sqlite3', '1.3.13'

<<略>>

group :development, :test do
  以下を追記
  gem 'sqlite3', '1.3.13'
  # Call 'byebug' anywhere in the code to stop execution and get a debugger console
  gem 'byebug', platform: :mri
  gem 'rspec-rails', '3.7.2'
end

<<略>>
以下を追記
group :production do
  gem 'pg'
end

2-5.PostgreSQLのライブラリインストール

PostgreSQLをインストールするにはGemfileを修正するだけでは不足していて、「yum」というコマンドを使って必要なライブラリをインストールする必要があります。

$ sudo yum -y install postgresql-devel

2-6.bundle install

これで、準備が整ったのでGemfileの内容を適用させましょう。
事前にプロジェクトフォルダへ移動するのを忘れないようにしてください。ここではプロジェクトフォルダ名を「heroku_test」としています。

$ cd ~/environment/heroku_test
$ bundle install

2-7.git add & commit

herokuへpushされる対象はgit上でcommitされたライブラリのみのようなので、以下コマンドを実行してcommitします。
※ メッセージは適当です。

$ cd ~/environment/heroku_test
$ git add -A
$ git commit -m "heroku fix"

2-8.herokuへpush

いよいよherokuにpushします。

まずはherokuにログイン。ユーザ登録時に設定したメールアドレスとパスワードを入力してください。

$ heroku login
heroku: Enter your login credentials
Email: XXXXXXX@gmail.com
Password: *********


次にssh公開鍵をherokuに登録します。
以下コマンドを実行すると、鍵の作成から登録までしてくれます。

$ heroku keys:add
Could not find an existing SSH key at ~/.ssh/id_rsa.pub
? Would you like to generate a new one? Yes ←「Yesと入力してEnter」
Generating public/private rsa key pair.
Your identification has been saved in /home/ec2-user/.ssh/id_rsa.
Your public key has been saved in /home/ec2-user/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:fqz10VRYx6/osU+051Bq9eKmuhbMBQ28I/NZ90NjVFI ec2-user@ip-172-31-1-3
The key's randomart image is:
+---[RSA 2048]----+
|         ..o  .oE|
|          o .  =o|
|           o  o o|
|        o o o .=.|
|        S* = o=o+|
|       . .* o+.*o|
|        . +o.oO +|
|         +..o=.= |
|        ..ooo+o .|
+----[SHA256]-----+
Uploading /home/ec2-user/.ssh/id_rsa.pub SSH key... done


そして、heroku上でアプリを作成します。コマンドを実行して以下のようなURLが表示されれば成功。ブラウザでherokuにログインすると、アプリケーション名が表示されています。

$ heroku create
Creating app... done, ? gentle-reaches-87917
https://gentle-reaches-XXXXXX.herokuapp.com/ | https://git.heroku.com/gentle-reaches-XXXXX.git


f:id:gattsu09:20180810005116p:plain


ようやくherokuにpushする準備が整ったので以下コマンドを実行します。
ここまできたら、後は成功を祈りましょう。

$ git push heroku master


DBを使用する場合は、以下コマンドを実行してheroku側のDBをマイグレーションします。

$ heroku run rails db:migrate


ここまででherokuへのデプロイ作業すべて完了です。あとは、herokuの管理画面で「Open app」ボタンをクリックすれば作成したWebサービスが表示されるはず…。長い道のりでしたね!


f:id:gattsu09:20180810005309p:plain

3.発生したエラーと対処法

ここからは、エラー奮闘記ということでデプロイ時に発生したエラーと対応を書いていきます。2の手順に書いたことと重複する点もありますが、あえてハマった順番通りに書いていきますね。

3-1.Cloud9にherokuコマンドが存在しない

Railsチュートリアルとか見てるとCloud9にはherokuがインストール済み前提で書かれていることが多いのですが、インストールされておらず、以下エラーが出力しました。対応は2-2で記載したとおり、herokuをインストールすることで解消しました。

$ heroku version
bash: heroku: command not found

3-2.node.jsのバージョンが古い

herokuをインストール後、herokuコマンドを実行すると、node.jsのバージョンが低いとのエラーが発生します。2-3に記載した方法でnode.jをバージョンアップすることで解消します。

$ heroku version
WARNING
WARNING Node version must be >=8.0.0 to use this CLI
WARNING Current node version: 6.14.3

3-3.PostgreSQLのbundle install失敗

Gemfileを修正後、「2-5.PostgreSQLのライブラリインストール」を実施せずにbundle installを実行すると、以下エラーが出力します。2-5の対応を実施後にbundle installを実行すると解消します。ここが一番ハマって、解消までにめちゃくちゃ時間がかかった…。

$ bundle install

<<略>>

Fetching pg 0.18.4
Installing pg 0.18.4 with native extensions
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

<<略>>

An error occurred while installing pg (0.18.4), and Bundler cannot continue.
Make sure that `gem install pg -v '0.18.4' --source 'https://rubygems.org/'` succeeds before bundling.

3-4.herokuへのpushに失敗(その1)

「2-8.herokuへpush」のgit pushコマンド実行時、以下エラーが出て失敗。原因は「heroku create」時にプロジェクトフォルダに移動していなかったため。heroku上にアプリはcreateされてしまっているので、herokuの管理画面にてアプリを削除後、プロジェクトフォルダに移動し、再度「heroku create」を実行すると解消。

$ git push heroku master
fatal: Not a git repository (or any of the parent directories): .git

3-5.herokuへのpushに失敗(その2)

3-4解消後、再度git pushコマンドを実行すると別のエラーが発生。原因はbundle install後、「2-7.git add & commit」を実施しなかったため。2-7の対応を実施することで解消。四苦八苦して色々弄っていましたが、git push前は必ず2-7の対応を実施するようにクセ付けると良いと思います。

$ git push heroku master

<<略>>

remote:  !
remote:  !     Gemfile.lock required. Please check it in.
remote:  !
remote:  !     Push rejected, failed to compile Ruby app.
remote: 
remote:  !     Push failed

3-6.herokuへのpushに失敗(その3)

3-5解消後、再度git pushコマンドを実行すると、またまた別のエラーが発生。これは単純に自分のポカなのですが、「2-4.Gemfile修正」の際に、「gem 'sqlite3', '1.3.13'」の記述の削除が漏れていたため。記述を削除し、再度bundle install,git add -A,git commit -m messageすることで解消。

remote:  !     Failed to install gems via Bundler.
remote:  !     Detected sqlite3 gem which is not supported on Heroku:
remote:  !     https://devcenter.heroku.com/articles/sqlite3
remote:  !
remote:  !     Push rejected, failed to compile Ruby app.
remote: 
remote:  !     Push failed

3-7.herokuへのrails db:migrateに失敗

正常にherokuへpushしたあと、herokuへdbマイグレートしたところ以下エラーが発生。原因は、色々四苦八苦している中で「bundle install --without production」(Gemfile内のprodacution項目をインストールしない)を実行していたため。withoutオプション付きでbundle installを実行すると、その設定がプロジェクトフォルダ配下の「.bundle/config」に保持され、ずっと有効になるとのこと。

対応として「.bundle/config」を削除し、再度オプション無しで「bundle install」を実行し「2-7.git add & commit」実行後、「 git push heroku master」を再実行することで解消。

$ heroku run rails db:migrate
Running rails db:migrate on ⬢ shrouded-anchorage-47928... up, run.8592 (Free)
rails aborted!
Gem::LoadError: Error loading the 'postgresql' Active Record adapter. Missing a gem it depends on? pg is not part of the bundle. Add it to your Gemfile.

4.参考にしたサイト

先人たちがエラーと奮闘した結果を共有してくださっていたおかげでデプロイできました。感謝。

cloud9にheroku-cliを最短でインストール – LilPacy.info
Cloud9でHerokuが使えない時の対処法
cloud9 から heroku にデプロイするまで + ごにょごにょ