Heroku スターターガイド (Ruby)(Microsoft Windows)
はじめに
このチュートリアルを完了して、ローカルの Microsoft Windows 開発環境で JRuby を使用したサンプル Ruby アプリを開発し、それを Heroku にデプロイします。
Windows ではない場合、「Heroku スターターガイド (Ruby)」ガイドに従います。
このチュートリアルでは、以下が用意されていることを前提としています。
- 確認済みの Heroku アカウント
- Java 仮想マシン (JVM) を取得するためのローカルにインストールされた JDK 8。
- ローカルにインストールされた JRuby 9.4.1.0。
- ローカルにインストールされた Bundler。コマンドプロンプトで、
jruby -S gem install bundler
を使用してこれをインストールできます。
'jruby' is not recognized as an internal or external command, operable program or batch file.
のようなエラーが表示されたら、ターミナルセッションを閉じ、新しいターミナルを開いて %PATH%
環境変数が正しく設定されていること確認します。
dyno とデータベースを使用してこのチュートリアルを完了した場合、使用量のカウントに入ります。低料金プランを使用してこのチュートリアルを完了することをお勧めします。資格のある学生の皆様は、新しい Heroku for GitHub Students プログラムを通じてプラットフォームクレジットを申請できます。
設定する
Heroku CLI には、一般によく使われている Git というバージョン管理システムが必要です。Git がインストールされていない場合は、先に進む前に次の手順を完了してください。
Heroku Command Line Interface (CLI) をインストールします。CLI は、アプリケーションの管理やスケール、アドオンのプロビジョニング、ログの表示、アプリケーションのローカル実行に使用できます。
インストール後、コマンドシェルで heroku
コマンドを使用できます。
Heroku CLI にログインするには、heroku login
コマンドを使用します。
> heroku login
heroku: Press any key to open up the browser to login or q to exit
› Warning: If browser does not open, visit
› https://cli-auth.heroku.com/auth/browser/***
heroku: Waiting for login...
Logging in... done
Logged in as me@example.com
このコマンドにより、Web ブラウザで Heroku ログインページが開きます。ブラウザですでに Heroku にログインしている場合は、ページの Log in
(ログイン) ボタンをクリックします。
この認証は、heroku
と git
コマンドが正常に動作するために必要な操作です。
外部の HTTP/HTTPS サービスへの接続にプロキシを使用するファイアウォールを利用している場合は、heroku
コマンドを実行する前に、ローカルの開発環境で HTTP_PROXY
または HTTPS_PROXY
環境変数を設定してください。
サンプルアプリを複製する
Heroku をはじめて使う場合は、 Heroku が提供するサンプルアプリケーションを使ってこのチュートリアルを行うことをお勧めします。
デプロイする既存のアプリケーションを用意してある場合は、 代わりにこの記事に従います。
コードのローカルバージョンを得るために、サンプルアプリケーションを複製します。以下のコマンドをローカルのコマンドシェルまたはターミナルで実行します。
> git clone https://github.com/heroku/jruby-getting-started.git
> cd jruby-getting-started
これで、シンプルなアプリケーションを格納した、正常な Git リポジトリを準備できました。これには Gemfile
ファイルが含まれ、Ruby の依存関係マネージャーの bundler
で依存関係のインストールに使用されます。
アプリを作成する
Eco にサブスクライブしている場合、アプリではデフォルトで Eco dyno が使用されます。それ以外の場合は、デフォルトで Basic dyno が使用されます。Eco dyno プランは、アカウント内のすべての Eco dyno で共有されます。これは、多数の小さいアプリを Heroku にデプロイする予定がある場合にお勧めします。詳細は、こちらを参照してください。資格のある学生の皆様は、Heroku for GitHub Students プログラムを通じてプラットフォームクレジットを申請できます。
Heroku でアプリを作成して、ソースコードを受け取るプラットフォームを準備します。
$ heroku create
Creating app... done, ⬢ polar-inlet-4930
http://polar-inlet-4930.herokuapp.com/ | https://git.heroku.com/polar-inlet-4930.git
アプリを作成すると、heroku
という名前の Git リモートリポジトリも作成され、ローカルの Git リポジトリと関連付けられます。Git リモートは、他のサーバー上で稼働するリポジトリのバージョンです。アプリに関連付けられた、Heroku でホストされる特別なリモートにコードをプッシュすることにより、アプリをデプロイします。
Heroku によってランダムなアプリ名 (このケースでは polar-inlet-4930
) が生成されます。独自のアプリ名を指定できます。
Procfile を定義する
Procfile は、アプリケーションのルートディレクトリにあるテキストファイルです。このファイルを使って、アプリの起動時に実行するコマンドを明示的に宣言します。
サンプルアプリの Procfile
は、次のようになっています。
web: bundle exec puma -C config/puma.rb
この Procfile では、単一のプロセスタイプの web
と、その実行に必要なコマンドを宣言しています。 ここでは、web
という名前が重要です。 これは、このプロセスタイプを Heroku の HTTP ルーティングスタックにアタッチし、デプロイ後に Web トラフィックを受信することを宣言しています。 ここで使われているコマンドは、Puma (Web サーバー) を実行し、設定ファイルを渡しています。
Procfile には追加のプロセスタイプを含めることができます。 たとえば、キューからアイテムを取り出して処理するバックグラウンドワーカープロセスを宣言できます。
プロジェクト例には Procfile.windows
ファイルも含まれ、それには web: jruby -S bin\puma -C config\puma.rb
の行が含まれます。
このファイルは、Windows でのアプリケーションの実行に使用されるコマンドが、Linux ベースである Heroku でのアプリケーションの実行に使用されるものと異なるので必要です。
データベースをプロビジョニングする
サンプル Rails アプリにはデータベースが必要です。Elements Marketplace から入手可能なアドオンの 1 つである Heroku Postgres データベースをプロビジョニングします。アドオンは、ログ記録、モニタリング、データベースなど、アプリケーションですぐに使える追加サービスを提供するクラウドサービスです。
essential-0
Postgres のサイズのコストは月額 5 ドルで、分単位で課金されます。このチュートリアルの最後で、データベースを削除して、コストを最小限に抑えるように求められます。
$ heroku addons:create heroku-postgresql:essential-0
Creating heroku-postgresql:essential-0 on ⬢ polar-inlet-4930... ~$0.007/hour (max $5/month)
Database should be available soon
postgresql-encircled-75487 is being created in the background. The app will restart when complete...
Use heroku addons:info postgresql-encircled-75487 to check creation progress
Use heroku addons:docs heroku-postgresql to view documentation
Heroku アプリでこの Postgres データベースにアクセスできるようになりました。DATABASE_URL
環境変数は、規約によって Rails が接続する資格情報を格納します。addons
コマンドを使用して、プロビジョニングされたすべてのアドオンを確認できます。
$ heroku addons
Add-on Plan Price State
────────────────────────────────────────────── ─────────── ──────── ───────
heroku-postgresql (postgresql-encircled-75487) essential-0 $5/month created
└─ as DATABASE
The table above shows add-ons and the attachments to the current app (polar-inlet-4930) or other apps.
アプリをデプロイする
コードをデプロイします。このコマンドは、サンプルリポジトリの main
ブランチを heroku
リモートにプッシュし、次に Heroku にデプロイします。
> git push heroku main
$ git push heroku main
Enumerating objects: 282, done.
Counting objects: 100% (282/282), done.
Delta compression using up to 16 threads
Compressing objects: 100% (175/175), done.
Writing objects: 100% (282/282), 56.28 KiB | 7.04 MiB/s, done.
Total 282 (delta 103), reused 232 (delta 86), pack-reused 0
remote: Compressing source files... done.
remote: Building source:
remote:
remote: -----> Building on the Heroku-22 stack
remote: -----> Determining which buildpack to use for this app
remote: -----> Ruby app detected
remote:
remote: ## Warning: Your app needs java
remote:
remote: The Ruby buildpack determined your app needs java installed
remote: we recommend you add the jvm buildpack to your application:
remote:
remote: $ heroku buildpacks:add heroku/jvm --index=1
remote:
remote: -----> Installing Java
remote:
remote: -----> Downloading Buildpack: heroku/jvm
remote: -----> Detected Framework: JVM Common
remote: -----> Installing OpenJDK 1.8... done
remote: -----> Installing bundler 2.3.25
remote: -----> Removing BUNDLED WITH version in the Gemfile.lock
remote: -----> Compiling Ruby/Rails
remote: -----> Using Ruby version: ruby-3.1.0-jruby-9.4.1.0
remote: -----> Installing dependencies using bundler 2.3.25
remote: Running: BUNDLE_WITHOUT='development:test' BUNDLE_PATH=vendor/bundle BUNDLE_BIN=vendor/bundle/bin BUNDLE_DEPLOYMENT=1 bundle install -j4
...
remote: Bundled gems are installed into `./vendor/bundle`
remote: Bundle completed (109.67s)
remote: Cleaning up the bundler cache.
remote: -----> Installing node-v16.18.1-linux-x64
remote: -----> Detecting rake tasks
remote: -----> Preparing app for Rails asset pipeline
remote: Running: rake assets:precompile
...
remote: Asset precompilation completed (18.27s)
remote: Cleaning assets
remote: Running: rake assets:clean
remote: -----> Detecting rails configuration
remote:
remote:
remote: -----> Discovering process types
remote: Procfile declares types -> web
remote: Default types for buildpack -> console, rake
remote:
remote: -----> Compressing...
remote: Done: 147.6M
remote: -----> Launching...
remote: ! The following add-ons were automatically provisioned: heroku-postgresql. These add-ons may incur additional cost, which is prorated to the second. Run `heroku addons` for more info.
remote: Released v6
remote: https://polar-inlet-4930.herokuapp.com/ deployed to Heroku
remote:
remote: Verifying deploy... done.
To https://git.heroku.com/polar-inlet-4930.git
* [new branch] main -> main
アプリケーションがデプロイされました。 アプリのインスタンスが 1 つ以上実行されていることを確認します。
> heroku ps:scale web=1
ログに示されている URL でアプリにアクセスします。 次のショートカットを使って、Web サイトを簡単に開くこともできます。
$ heroku open
ログを表示する
Heroku では、すべてのアプリと Heroku のコンポーネントの出力ストリームから集約した時系列イベントのストリームとして、ログが扱われます。Heroku は、すべてのイベントに単一のストリームを提供します。
実行中のアプリに関する情報を表示するには、ログコマンドの 1 つである、heroku logs --tail
を使います。
> heroku logs --tail
2023-03-07T18:17:20.056546+00:00 heroku[web.1]: State changed from crashed to starting
2023-03-07T18:17:28.388264+00:00 heroku[web.1]: Starting process with command `bundle exec puma -C config/puma.rb`
2023-03-07T18:17:29.421644+00:00 app[web.1]: Setting JAVA_TOOL_OPTIONS defaults based on dyno size. Custom settings will override them.
2023-03-07T18:17:29.456159+00:00 app[web.1]: Picked up JAVA_TOOL_OPTIONS: -Xmx300m -Xss512k -XX:CICompilerCount=2 -Dfile.encoding=UTF-8
2023-03-07T18:17:35.000000+00:00 app[api]: Build succeeded
2023-03-07T18:17:35.498806+00:00 app[web.1]: Puma starting in single mode...
2023-03-07T18:17:35.499821+00:00 app[web.1]: * Puma version: 6.1.1 (jruby 9.4.1.0 - ruby 3.1.0) ("The Way Up")
2023-03-07T18:17:35.500730+00:00 app[web.1]: * Min threads: 5
2023-03-07T18:17:35.501612+00:00 app[web.1]: * Max threads: 5
2023-03-07T18:17:35.502174+00:00 app[web.1]: * Environment: production
2023-03-07T18:17:35.503200+00:00 app[web.1]: * PID: 2
2023-03-07T18:17:42.977653+00:00 app[web.1]: * Listening on http://[::]:53483
2023-03-07T18:17:43.026824+00:00 app[web.1]: Use Ctrl-C to stop
2023-03-07T18:17:43.504644+00:00 heroku[web.1]: State changed from starting to up
さらに他の生成されたログメッセージを表示するには、まずブラウザでアプリケーションにアクセスします。
ログのストリーム出力を停止するには、Control+C
を押します。
アプリをスケールする
サンプルアプリをデプロイすると、1 つの Web dyno で自動的に実行されます。 dyno とは、Procfile
で指定されているコマンドを実行する軽量のコンテナのようなものです。
実行されている dyno の数を確認するには、ps
コマンドを使います。
> heroku ps
=== web (Eco): `web: bundle exec puma -C config/puma.rb`
web.1: up 2023/03/07 12:42:34 (~ 23m ago)
Heroku でアプリケーションをスケールするとは、実行中の dyno の数を変更することを意味します。 Web dyno の数を 0 にスケールしてみます。
$ heroku ps:scale web=0
ブラウザで更新ボタンを押して再度アプリにアクセスするか、heroku open
コマンドを使って Web タブで開きます。 リクエストに応答できる Web dyno がないので、エラーメッセージが表示されます。
もう一度スケールしてみましょう。
$ heroku ps:scale web=1
Eco にサブスクライブしている場合、アプリではデフォルトで Eco dyno が使用されます。それ以外の場合は、デフォルトで Basic dyno が使用されます。Eco dyno プランは、アカウントのすべての Eco dyno 間で共有され、多数の小さなアプリを Heroku にデプロイする場合にお勧めします。Eco dyno は 30 分間トラフィックを何も受信しないとスリープします。 このスリープ動作により、スリープ解除した最初のリクエストで数秒の遅延が発生します。Eco dyno は、月ごとに割り当てられるアカウント別の Eco dyno 時間を消費します。割り当て時間が残っている限り、アプリは稼働し続けます。
dyno がスリープしないようにするには、「dyno タイプ」の記事で紹介されている Basic 以上の dyno タイプにアップグレードします。少なくとも Standard dyno にアップグレードすることで、プロセスタイプあたり複数の dyno にスケールアップできます。
アプリの依存関係を宣言する
Heroku では、アプリのルートディレクトリに Gemfile
ファイルがあると、そのアプリを Ruby アプリと認識します。
デプロイしたデモ用アプリには、事前に次のような Gemfile
が用意されています。
source 'https://rubygems.org'
ruby '3.1.0', engine: 'jruby', engine_version: '9.4.1.0'
# Bundle edge Rails instead: gem 'rails', github: 'rails/rails'
gem 'rails', '~> 7.0.4.2'
...
Gemfile
ファイルは、アプリケーションと一緒にインストールする依存関係を指定します。このファイルでは、Heroku でアプリケーションを実行するときに使用される Ruby のバージョンも決定します。
アプリをデプロイすると、Heroku がこのファイルを読み出し、bundle install
コマンドを使って適切なバージョンの Ruby と依存関係をインストールします。
アプリをローカルで実行するには、依存関係もローカルでインストールする必要があります。ローカルディレクトリで bundle install
を実行して、依存関係をインストールします。
> jruby -S bundle install --binstubs
Using rake 13.0.6
Using concurrent-ruby 1.2.2
Using i18n 1.12.0
Using minitest 5.18.0
Using tzinfo 2.0.6
Using activesupport 7.0.4.2
Using builder 3.2.4
Using erubi 1.12.0
Using racc 1.6.2 (java)
Using nokogiri 1.14.2 (java)
....
Using puma 6.1.1 (java)
Your bundle is complete!
No such file or directory -- bundle (LoadError)
というエラーが表示された場合は、「はじめに」に記述されているように、jruby -S gem install bundler
を実行していることを確認してください。
アプリをローカルで実行する
お使いの開発環境でアプリをローカル実行するには、若干の作業が必要です。Rails では通常データベースが必要です。このサンプルアプリケーションでは Postgres を使用しています。Postgres をローカルでインストールする場合の手順に従う必要があります。. Postgres をインストールする場合、デフォルトユーザーに対して設定したパスワードを書き留めてください。
config\database.yml
ファイルを開き、ローカル (開発) データベースのユーザー名とパスワードを設定します。次の行を探します。
development:
<<: *default
database: ruby-getting-started_development
# The specified database role being used to connect to postgres.
# To create additional roles in postgres see `$ createuser --help`.
# When left blank, postgres will use the default role. This is
# the same name as the operating system user that initialized the database.
#username: ruby-getting-started
# The password associated with the postgres role (username).
#password:
ユーザー名とパスワードを Postgres のインストール時に設定したものに置き換えて変更します。
username: postgres
# The password associated with the postgres role (username).
password: postgres
開発データベースエントリの下の test:
セクションにある ruby-getting-started_test
データベースについてもこのステップを繰り返します。
この rake
タスクを使用して、アプリの適切なデータベースおよびテーブルを作成できます。
> jruby -S bin\rake db:create db:migrate
== 20140707111715 CreateWidgets: migrating ====================================
-- create_table(:widgets)
-> 0.0076s
== 20140707111715 CreateWidgets: migrated (0.0077s) ===========================
heroku local
コマンドを使ってアプリケーションをローカルで起動します。このコマンドは、Heroku CLI の一部です。
> heroku local --port 5001 -f Procfile.windows
[OKAY] Loaded ENV .env File as KEY=VALUE Format
12:26:42 PM web.1 | Puma starting in single mode...
12:26:42 PM web.1 | * Puma version: 6.1.1 (jruby 9.4.1.0 - ruby 3.1.0) ("The Way Up")
12:26:42 PM web.1 | * Min threads: 5
12:26:42 PM web.1 | * Max threads: 5
12:26:42 PM web.1 | * Environment: development
12:26:42 PM web.1 | * PID: 35023
12:26:46 PM web.1 | * Listening on http://[::]:5001
12:26:46 PM web.1 | Use Ctrl-C to stop
-f Procfile.windows
フラグにより、Windows 固有の Procfile が確実に選択されます。プロジェクト例には Procfile.windows
ファイルも含まれ、それには web: jruby -S bin\puma -C config\puma.rb
の行が含まれます。このファイルは、Windows でのアプリケーションの実行に使用されるコマンドが、Linux ベースである Heroku でのアプリケーションの実行に使用されるものと異なるので必要です。Heroku と同じように、heroku local
も Procfile を確認して実行する内容を判断します。
アプリがローカルで実行していることを確認するには、Web ブラウザで http://localhost:5001 を開きます。
アプリのローカル実行を停止するには、CLI で Control + C
を押して終了します。
ローカルの変更をプッシュする
このステップでは、アプリケーションへのローカルでの変更を Heroku に反映させます。
Gemfile
を編集して、cowsay
gem の依存関係を追加します。
gem 'cowsay'
# Bundle edge Rails instead: gem 'rails', github: 'rails/rails'
gem 'rails', '~> 7.0.4.2'
...
この gem を使用するように app/views/welcome/index.erb
を変更します。次のようにコードを変更します。
<h1>Getting Started with Ruby</h1>
<p>
Welcome!
</p>
<pre><%= Cowsay.say("Hello", "tux") %></pre>
ローカルでテストします。
> jruby -S bundle install
> heroku local --port 5001 -f Procfile.windows
http://localhost:5001 でアプリケーションにアクセスし、表示された ASCII アートを確認します。
次は、このローカルの変更を Heroku にデプロイします。
Heroku へのデプロイは、ほとんどの場合、同じパターンで行います。まず、変更したファイルをローカルの Git リポジトリに追加します。
> git add .
次に、変更内容をリポジトリにコミットします。
> git commit -m "Demo"
前と同じ方法でデプロイします。
> git push heroku main
最後に、すべて正常に動作しているかどうかを確認します。
> heroku open
ログ記録アドオンをプロビジョニングする
データベース以外に、アドオンはアプリケーションに多くの追加のサービスを提供します。このステップでは、アプリのログを保存する無料のアドオンをプロビジョニングします。
Heroku では、デフォルトで 1500 行のアプリケーションログが記録されますが、完全なログストリームはサービスとして提供されています。複数のアドオンプロバイダーが、ログの永続化、検索、メールや SMS 通知などの機能を提供するログサービスを用意しています。
このステップでは、このようなログ関連アドオンの 1 つである、Papertrail をプロビジョニングします。
Papertrail ログ記録アドオンをプロビジョニングします。
> heroku addons:create papertrail
Creating papertrail on ⬢ polar-inlet-4930... free
Welcome to Papertrail. Questions and ideas are welcome (technicalsupport@solarwinds.com). Happy logging!
Created papertrail-horizontal-77903 as PAPERTRAIL_API_TOKEN
Use heroku addons:docs papertrail to view documentation
アドオンがデプロイされ、アプリケーション用に設定されました。 アプリのアドオンは、次のコマンドで一覧表示できます。
$ heroku addons
このアドオンが動作していることを確認するため、アプリケーションの Heroku URL に数回アクセスします。アクセスするたびにログメッセージが生成され、Papertrail のアドオンに送られます。 Papertrail のコンソールにアクセスし、ログメッセージを確認します。
$ heroku addons:open papertrail
ブラウザで Papertrail の Web コンソールが開き、最新のログイベントが表示されます。このインターフェースでは、検索したり通知を設定したりできます。
コンソールを起動する
One-off dyno で、heroku run
コマンドを使ってコマンド (通常はアプリの一部を構成するスクリプトやアプリケーション) を実行できます。アプリの環境で試行するためにローカルターミナルにアタッチされた REPL プロセスを起動することもできます。
> heroku run jirb
Running jirb on ⬢ polar-inlet-4930... up, run.4883 (Eco)
irb(main):001:0>
Error connecting to process
というエラーが表示された場合は、ファイアウォールを設定します。
コンソールが起動すると、アプリ全体が読み込まれます。たとえば、puts Cowsay.say("hi", "Cow")
と入力すると「hi」という吹き出しの付いた動物が表示されます。コンソールを終了するには、exit
と入力します。
irb(main):001:0> require 'cowsay'
require 'cowsay'
=> true
irb(main):002:0> puts Cowsay.say("Hello", "tux")
_______
| Hello |
-------
\
\
.--.
|o_o |
|:_/ |
// \ \
(| | )
/'\_ _/`\
\___)=(___/
=> nil
irb(main):003:0> exit
別の例を試してみましょう。別の One-off dyno を作成し、bash
コマンドを実行して、その dyno でシェルを開きます。シェルが開いたら、そこでコマンドを実行できます。それぞれの dyno には専用の一時的ファイル領域があり、アプリとその依存関係が入力されています。コマンドが完了したら (このケースでは bash
)、dyno が終了します。:
> heroku run bash
Running `bash` attached to terminal... up, run.1421
~ $ ls
app bin config config.ru db Gemfile Gemfile.lock last_pack_release.out lib log Procfile Procfile.windows public Rakefile README.md test tmp vendor
~ $ exit
exit
必ず exit
と入力してシェルを閉じ、dyno を終了してください。
環境設定を定義する
Heroku では、暗号鍵や外部リソースのアドレスなどのデータを環境設定に保存して、設定を外部に置くことができます。
環境設定は、ランタイムに環境変数としてアプリケーションに提供されます。 例として、app/views/welcome/index.erb
を編集し、環境変数 TIMES
の値に応じてあるアクションを繰り返し実行するメソッドを追加します。 ファイルの最初の数行を次のように変更します。
<h1>Getting Started with Ruby</h1>
<p>
Welcome!
</p>
<% for i in 0..(ENV['TIMES'] ? ENV['TIMES'].to_i : 2) do %>
<p>Hello World #<%= i %>!</p>
<% end %>
heroku local
は、ローカルディレクトリにある .env
ファイルの内容に応じて、環境を自動的に設定します。 サンプルプロジェクトのトップレベルディレクトリにはすでに .env
ファイルがあり、以下の行が含まれています。
TIMES=10
heroku local
でアプリを実行すると、「Hello World」というテキストが 10 回表示されます。
Heroku で環境設定を設定するには、次のコマンドを実行します。
> heroku config:set TIMES=10
heroku config
を使用して、アプリの環境設定を表示します。
> heroku config
== polar-inlet-4930 Config Vars
PAPERTRAIL_API_TOKEN: erdKhPeeeehIcdfY7ne
TIMES: 10
このアクションの変更を確認するには、変更したアプリケーションを Heroku にデプロイします。
データベースを使う
アプリの環境設定を一覧表示すると、アプリがデータベースに接続するときに使用する URL (DATABASE_URL
) が表示されます。
> heroku config
=== polar-inlet-4930 Config Vars
DATABASE_URL: postgres://xx:yyy@host:5432/d8slm9t7b5mjnd
HEROKU_POSTGRESQL_BROWN_URL: postgres://xx:yyy@host:5432/d8slm9t7b5mjnd
...
Heroku には、さらに詳細を表示する heroku pg
コマンドもあります。
> heroku pg
=== DATABASE_URL
Plan: Essential 0
Status: Available
Connections: 0/20
PG Version: 15.5
Created: 2024-05-01 13:22 UTC
Data Size: 8.0 MB/1.00 GB (0.78%) (In compliance)
Tables: 3
Fork/Follow: Unsupported
Rollback: Unsupported
Continuous Protection: Off
Add-on: postgresql-elliptical-30581
この情報は、essential-0
データベースが Postgres v15.5 を実行しており、3 つのテーブルがあることを示しています。
デプロイしたサンプルアプリにはデータベース機能が備わっています。それには、アプリの「/widgets」ページで使用されるウィジェットのコントローラーとデータベースモデルがあります。アプリの URL に「/widgets」を追加して、このページにアクセスできます。
その URL にアクセスすると、エラーページが表示されます。heroku logs
を使用するか、または Papertrail でエラーメッセージを確認すると、次のようになっています。
2023-03-07T18:32:40.112476+00:00 app[web.1]: I, [2023-03-07T18:32:40.111637 #2] INFO -- : [ba2011bf-3eda-446d-aa73-99469351542c] Started GET "/widgets" for 13.110.54.15 at 2023-03-07 18:32:40 +0000
2023-03-07T18:32:40.120417+00:00 app[web.1]: I, [2023-03-07T18:32:40.119956 #2] INFO -- : [ba2011bf-3eda-446d-aa73-99469351542c] Processing by WidgetsController#index as HTML
2023-03-07T18:32:40.709253+00:00 app[web.1]: I, [2023-03-07T18:32:40.708867 #2] INFO -- : [ba2011bf-3eda-446d-aa73-99469351542c] Rendered widgets/index.html.erb within layouts/application (Duration: 568.1ms | Allocations: 0)
2023-03-07T18:32:40.710008+00:00 app[web.1]: I, [2023-03-07T18:32:40.709695 #2] INFO -- : [ba2011bf-3eda-446d-aa73-99469351542c] Rendered layout layouts/application.html.erb (Duration: 569.2ms | Allocations: 0)
2023-03-07T18:32:40.712406+00:00 app[web.1]: I, [2023-03-07T18:32:40.712130 #2] INFO -- : [ba2011bf-3eda-446d-aa73-99469351542c] Completed 500 Internal Server Error in 591ms (ActiveRecord: 147.4ms | Allocations: 0)
2023-03-07T18:32:40.728894+00:00 app[web.1]: F, [2023-03-07T18:32:40.728559 #2] FATAL -- : [ba2011bf-3eda-446d-aa73-99469351542c]
2023-03-07T18:32:40.728896+00:00 app[web.1]: [ba2011bf-3eda-446d-aa73-99469351542c] ActionView::Template::Error (ActiveRecord::JDBCError: org.postgresql.util.PSQLException: ERROR: relation "widgets" does not exist
2023-03-07T18:32:40.728896+00:00 app[web.1]: Position: 25):
2023-03-07T18:32:40.728897+00:00 app[web.1]: [ba2011bf-3eda-446d-aa73-99469351542c] 12: </thead>
2023-03-07T18:32:40.728898+00:00 app[web.1]: [ba2011bf-3eda-446d-aa73-99469351542c] 13:
2023-03-07T18:32:40.728898+00:00 app[web.1]: [ba2011bf-3eda-446d-aa73-99469351542c] 14: <tbody>
2023-03-07T18:32:40.728898+00:00 app[web.1]: [ba2011bf-3eda-446d-aa73-99469351542c] 15: <% @widgets.each do |widget| %>
2023-03-07T18:32:40.728898+00:00 app[web.1]: [ba2011bf-3eda-446d-aa73-99469351542c] 16: <tr>
2023-03-07T18:32:40.728899+00:00 app[web.1]: [ba2011bf-3eda-446d-aa73-99469351542c] 17: <td><%= widget.name %></td>
2023-03-07T18:32:40.728899+00:00 app[web.1]: [ba2011bf-3eda-446d-aa73-99469351542c] 18: <td><%= widget.description %></td>
2023-03-07T18:32:40.728899+00:00 app[web.1]: [ba2011bf-3eda-446d-aa73-99469351542c]
2023-03-07T18:32:40.728901+00:00 app[web.1]: [ba2011bf-3eda-446d-aa73-99469351542c] app/views/widgets/index.html.erb:15
このエラーは、データベースへの接続は成功したものの、widgets
テーブルが見つからなかったことがわかります。 rake db:migrate
を実行して、そのエラーを解決できます。 Heroku でこのコマンドを実行するには、次のように One-off dynoで実行します。
> heroku run rake db:migrate
Running `rake db:migrate` attached to terminal... up, run.3559
Migrating to CreateWidgets (20140707111715)
== 20140707111715 CreateWidgets: migrating ====================================
-- create_table(:widgets)
-> 0.0244s
== 20140707111715 CreateWidgets: migrated (0.0247s) ===========================
ここで、アプリの /widgets
ページにもう一度アクセスすると、ウィジェットのレコードを一覧表示して、作成できます。
Postgres がローカルでインストールされている場合、データベースと直接対話することもできます。たとえば、次のように psql
を使ってデータベースに接続し、クエリを実行できます。
> heroku pg:psql
d8slm9t7b5mjnd=> select * from widgets;
id | name | description | stock | created_at | updated_at
----+-----------+--------------+-------+----------------------------+----------------------------
1 | My Widget | It's amazing | 100 | 2023-03-07 21:04:39.029311 | 2023-03-07 21:04:39.029311
(1 row)
詳細は、「Heroku PostgreSQL」を参照してください。
MongoDB や Redis のアドオンをインストールするときも、同様のテクニックを利用できます。
次のステップ
ここまで、アプリのデプロイ、アプリの設定変更、ログの表示、スケール、アドオンのアタッチを行う方法を説明しました。
次にお勧めするリソースを紹介します。
- 「Heroku の仕組み」では、アプリケーションの作成、設定、デプロイ、および実行時に必要な技術的な概念の概要を紹介しています。
- Ruby アプリケーションの開発とデプロイの詳細については、Ruby サポートカテゴリを参照してください。
コストを抑制するために、チュートリアルを完了したらすぐにサンプルアプリを削除し、データベースも削除してください。
アプリとアドオンを削除する
アカウントからアプリとデータベースを削除します。使用したリソースに対してのみ課金されます。
この操作により、アドオンとデータベースに保存されたすべてのデータが削除されます。
$ heroku addons:destroy heroku-postgresql
▸ WARNING: Destructive Action
▸ This command will affect the app polar-inlet-4930
▸ To proceed, type polar-inlet-4930 or re-run this command with
▸ --confirm polar-inlet-4930
>
この操作により、アプリケーションが完全に削除されます。
$ heroku apps:destroy
▸ WARNING: This will delete ⬢ polar-inlet-4930 including all add-ons.
▸ To proceed, type polar-inlet-4930 or re-run this command with
▸ --confirm polar-inlet-4930
>
以下のコマンドによって、アドオンとアプリが消去されたことを確認できます。
$ heroku addons --all
$ heroku apps --all