herokuで作成したアプリにデプロイするために
git push heroku branch_name:main
#pushできたのを確認後
heroku open
https://devcenter.heroku.com/ja/articles/error-codes#h10-app-crashed
code=H10エラー
何かが原因でデプロイ先のアプリがクラッシュしたみたいです。
原因を探るには最初にheroku CLIを使用したログから原因を探していく必要がありそうです。
怪しい箇所はどこか
/app/vendor/bundle/ruby/3.2.0/gems/bootsnap-1.16.0/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb
僕の環境で表示されたログのうち、エラーの1行前に表示されたものが一番気になります。
直前に行ったことといえば
docker のGemfileの中にamazon S3用にgemを追加しておりました。
それまではlocalhostへアクセスしても問題なく表示できていたのにローカルを確認したところ
ローカルのコンテナも起動してない事実が発覚。
NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS
rails_ec-css-1 rails_template:latest "entrypoint.sh yarn …" css 46 seconds ago Up 43 seconds 3000/tcp
rails_ec-db-1 postgres:14-alpine "docker-entrypoint.s…" db 46 seconds ago Up 44 seconds 5432/tcp
rails_ec-js-1 rails_template:latest "entrypoint.sh yarn …" js 46 seconds ago Up 43 seconds 3000/tcp
rails_ec-web-1 rails_template:latest "entrypoint.sh bundl…" web 45 seconds ago Exited (1) 40 seconds ago
Gemfileが怪しい?
dockerのlogを確認する
コンテナが起動していないのが気になる。
なのでdockerのログを確認します。
docker logs rails_ec-web-1
bundler: failed to load command: rails (/usr/local/bundle/bin/rails)
/usr/local/bundle/gems/bundler-2.4.19/lib/bundler/definition.rb:540:in `materialize': Could not find aws-sdk-s3-1.136.0, aws-sdk-core-3.185.1, aws-sdk-kms-1.72.0, aws-sigv4-1.6.0, aws-eventstream-1.2.0, aws-partitions-1.834.0, jmespath-1.6.2 in locally installed gems (Bundler::GemNotFound)
from /usr/local/bundle/gems/bundler-2.4.19/lib/bundler/definition.rb:200:in `specs'
from /usr/local/bundle/gems/bundler-2.4.19/lib/bundler/definition.rb:266:in `specs_for'
from /usr/local/bundle/gems/bundler-2.4.19/lib/bundler/runtime.rb:18:in `setup'
from /usr/local/bundle/gems/bundler-2.4.19/lib/bundler.rb:162:in `setup'
from /usr/local/bundle/gems/bundler-2.4.19/lib/bundler/setup.rb:23:in `block in <top (required)>'
from /usr/local/bundle/gems/bundler-2.4.19/lib/bundler/ui/shell.rb:159:in `with_level'
from /usr/local/bundle/gems/bundler-2.4.19/lib/bundler/ui/shell.rb:111:in `silence'
from /usr/local/bundle/gems/bundler-2.4.19/lib/bundler/setup.rb:23:in `<top (required)>'
from /usr/local/bundle/gems/bundler-2.4.19/lib/bundler/cli/exec.rb:56:in `require_relative'
from /usr/local/bundle/gems/bundler-2.4.19/lib/bundler/cli/exec.rb:56:in `kernel_load'
from /usr/local/bundle/gems/bundler-2.4.19/lib/bundler/cli/exec.rb:23:in `run'
from /usr/local/bundle/gems/bundler-2.4.19/lib/bundler/cli.rb:492:in `exec'
from /usr/local/bundle/gems/bundler-2.4.19/lib/bundler/vendor/thor/lib/thor/command.rb:27:in `run'
from /usr/local/bundle/gems/bundler-2.4.19/lib/bundler/vendor/thor/lib/thor/invocation.rb:127:in `invoke_command'
from /usr/local/bundle/gems/bundler-2.4.19/lib/bundler/vendor/thor/lib/thor.rb:392:in `dispatch'
from /usr/local/bundle/gems/bundler-2.4.19/lib/bundler/cli.rb:34:in `dispatch'
from /usr/local/bundle/gems/bundler-2.4.19/lib/bundler/vendor/thor/lib/thor/base.rb:485:in `start'
from /usr/local/bundle/gems/bundler-2.4.19/lib/bundler/cli.rb:28:in `start'
from /usr/local/bundle/gems/bundler-2.4.19/exe/bundle:37:in `block in <top (required)>'
from /usr/local/bundle/gems/bundler-2.4.19/lib/bundler/friendly_errors.rb:117:in `with_friendly_errors'
from /usr/local/bundle/gems/bundler-2.4.19/exe/bundle:29:in `<top (required)>'
from /usr/local/bundle/bin/bundle:25:in `load'
from /usr/local/bundle/bin/bundle:25:in `<main>'
`materialize': Could not find
英語版のエンジニアの掲示板に同じ様な記述があります。
https://stackoverflow.com/questions/68867835/materialize-could-not-find
ここに書かれてある質問で
この問題は環境変数に関連しており、gem の正しいパスを見つけることができないことでした。
つまり、`materialize': Could not find は『〇〇のGemの正しいパスを見つけることができなかった』と考えられます。
エラー内容を見てみると
`materialize': Could not find aws-sdk-s3-1.136.0, aws-sdk-core-3.185.1, aws-sdk-kms-1.72.0, aws-sigv4-1.6.0, aws-eventstream-1.2.0, aws-partitions-1.834.0, jmespath-1.6.2 in locally installed gems (Bundler::GemNotFound)
最後の方にGemnotFoundと書かれてありますので、Gemが問題となっている感じ。
aws s3の設定について振り返る
現在のGemにはS3が使える用にGemを追加してあります。
group :production do
gem 'aws-sdk-s3'
end
ここを追加してからdockerのコンテナが上手く起動しなくなった感じがする。
Activestorageの公式リファレンスを確認してみるとS3についてGithubのリンクが貼られていました。
https://github.com/aws/aws-sdk-ruby
V3以降はGemのバージョン指定が必要?
Google翻訳でページを翻訳してみると
AWS SDK for Ruby は RubyGems から入手できます。V3 モジュール化では、インストールする特定の AWS サービス gem を選択する必要があります。
V3からのことを記述している?みたいなので、バージョンを指定して再度実行してみます。
※正直深い意味は不明。
エラー分に書かれてある
aws-sdk-s3-1.136.0
これはaws-sdk-sの3現在の最新のバージョンの様です。
https://rubygems.org/gems/aws-sdk-s3/versions/1.2.0?locale=ja
group :production do
gem 'aws-sdk-s3', '~> 1.2'
end
内容を変更しました。
以下は行った一連の流れです。
- docker compose build
- 正常にイメージは再作成できたものの、その後docker compose up -dでコンテナが立ち上がらない
- docker compose run web bundle installを実行
- docker compose ps -a でwebコンテナが複数できてしまっていることを確認
- docker compose downでコンテナを削除
- 一部削除できなかったためdocker compose killを行うもしぶとくwebコンテナが複数残る
- docker rm コンテナIDで細々と削除
- コンテナを一度クリーンな状態へ持って行った
- docker compose up -d
- docker compose ps -aで起動の確認
- localhost:3000へアクセスし表示の確認に成功
ここまでは上手くいけました。
git push heroku branch_name:main しかし・・・
無事herokuへpushはできたけど、
念のためheroku openする前にlogの確認を行ったところエラー・・・。
heroku logs --tail
2023-10-12T14:32:57.434280+00:00 app[web.1]: from bin/rails:4:in `<main>'
2023-10-12T14:32:57.556535+00:00 heroku[web.1]: Process exited with status 1
2023-10-12T14:32:57.578855+00:00 heroku[web.1]: State changed from starting to crashed
2023-10-12T14:32:57.582938+00:00 heroku[web.1]: State changed from crashed to starting
2023-10-12T14:33:00.638967+00:00 heroku[web.1]: Starting process with command `bin/rails server -p ${PORT:-5000} -e production`
2023-10-12T14:33:02.397798+00:00 app[web.1]: => Booting Puma
2023-10-12T14:33:02.397829+00:00 app[web.1]: => Rails 7.0.7.2 application starting in production
2023-10-12T14:33:02.397830+00:00 app[web.1]: => Run `bin/rails server --help` for more startup options
2023-10-12T14:33:02.908063+00:00 app[web.1]: Exiting
2023-10-12T14:33:02.908684+00:00 app[web.1]: /app/vendor/bundle/ruby/3.2.0/gems/aws-sdk-core-3.185.1/lib/aws-sdk-core/plugins/regional_endpoint.rb:69:in `after_initialize': No region was provided. Configure the `:region` option or export the region name to ENV['AWS_REGION'] (Aws::Errors::MissingRegionError)
2023-10-12T14:33:02.908685+00:00 app[web.1]:
2023-10-12T14:33:02.908686+00:00 app[web.1]: raise Errors::MissingRegionError
2023-10-12T14:33:02.908686+00:00 app[web.1]: ^^^^^^^^^^^^^^^^^^^^^^^^^^
AWSの設定が間違っているor読み込めていない。
AWSの環境変数の読み込みができていない?
storage.ymlにもともとS3に関連した設定がコメントアウトされていました。
それを元に設定を行ってましたがうまく.環境変数の読み込みができていない様子です。
コメントアウトを解除してS3の設定を
credentials.yml.encへ記述してherokuへpushしたけどアプリがクラッシュ
原因はここにあった可能性が高いと判断
※助言を他の方からもいただきました。
storage.ymlへ直書き
S3の設定内容をcredentials.yml.encへ記述したけど
それをstorage.ymlへ直接記述する方向へ変更
変更分をリポジトリへpushした後、herokuへもpush。
#heroku openする前にlogを見ておく
heroku logs --tail
#今度は crushの文字がなかったぞ!?ってことで確認しに行く
heroku open
かわらずエラー画面ですが、
アプリがクラッシュすることは免れました。
また今表示しているエラー画面の原因もわかったので、
そちらについては別記事でまとめようと思います。
credentials.yml.encに設定すると詰んだ
storage.ymlに直接書くとherokuアプリがクラッシュすることはありませんでした。
設定の仕方が間違っていた可能性もありますが、ひとまず個人開発なのでこれでもよし。
credentials.yml.encに記載した内容が反映されなかったときはstorage.ymlへ直接書けば解決できる。