Heroku Postgresを追加する
Heroku Postgresの追加は、CLI(コマンドラインインタフェース)のherokuコマンドとGUIのWebコンソールのどちらからでも行うことができます。 Webコンソールは、Add-onの説明やプランの詳細を確認しながら追加を行えるので便利なのですが、この連載では、CLIで行える操作は極力CLIで行う方針とします(CLIでの操作方法を知っていればWebコンソールでの操作は特に迷うことはありません)。
まずは、前回作成したアプリケーションのディレクトリに移動して、アプリに追加されているAdd-onの一覧を表示する「heroku addons」コマンドを実行してみてください。
$ heroku addons === codezine-sample Configured Add-ons heroku-postgresql:hobby-dev HEROKU_POSTGRESQL_ONYX (アプリケーション名とHEROKU_POSTGRESQL_XXXXの部分は環境によって異なります)
なんと、まだ何もしていないにもかかわらず、heroku-postgresqlがすでに追加されています。 これは、Javaのbuildpackが初回のbuild時に「Javaでアプリを作るんであれば、RDBもきっと使うよね!」ということで自動的に追加しているからです。
最近ではMongoDBなどのNoSQLも台頭してきており、RDBは必須といえないと思うのですが、どのみち無料なのであまり気にする必要はありません。 使わない場合でもそのまま放置しておいて問題ありません。
今回は練習なので、とりあえずコマンドからこのPostgreSQLの削除と追加を行ってみます。
$ heroku addons:remove heroku-postgresql ! WARNING: Destructive Action ! This command will affect the app: codezine-sample ! To proceed, type "codezine-sample" or re-run this command with --confirm codezine-sample > codezine-sample Removing heroku-postgresql on codezine-sample... done, v12 (free)
「heroku addons:remove」がAdd-onを削除するためのコマンドです。 破壊的な操作のため、コマンド実行後に確認のためにアプリケーション名の入力が促されます。
続いて、追加コマンドです。
$ heroku addons:add heroku-postgresql Adding heroku-postgresql on codezine-sample... done, v14 (free) Attached as HEROKU_POSTGRESQL_BLUE_URL Database has been created and is available ! This database is empty. If upgrading, you can transfer ! data from another database with pgbackups:restore. Use `heroku addons:docs heroku-postgresql` to view documentation.
Add-onのプランを指定する場合はAdd-on名の後ろに[:PLANNAME]を追加します(例 heroku-postgresql:standard-0)。 プランを指定しない場合は、最も低位のプラン(heroku-postgresqlの場合はhobby-basic)が追加されます。
追加されたデータベースの接続情報は、(先のコマンド実行例では)HEROKU_POSTGRESQL_BLUE_URLという環境変数に追加されています。
Heroku Postgresを追加した場合、マルチテナントのhobby-dev、hobby-basicはほとんどすぐにデータベースにアクセス可能になります。
しかし、シングルテナントのstandard-0以降のプランではセットアップが完了するまでに数秒から数分の時間がかかります。
スクリプトなどでセットアップの終了を待ちたい場合は「heroku pg:wait」コマンドを使用することで、セットアップが完了するまで処理をブロックすることができます。
Heroku Postgresにアクセスする
データベースが追加されていることを確認するために「heroku config」コマンドを実行してみます[2]。
$ heroku config === codezine-sample Config Vars DATABASE_URL: postgres://xazxehmuvqeurc:-4XWLr17qoATDG0ftW2lC2ld-8@ec2-54-225-136-187.compute-1.amazonaws.com:5432/deflc9ag02nkfu HEROKU_POSTGRESQL_BLUE_URL: postgres://xazxehmuvqeurc:-4XWLr17qoATDG0ftW2lC2ld-8@ec2-54-225-136-187.compute-1.amazonaws.com:5432/deflc9ag02nkfu JAVA_OPTS: -Xmx384m -Xss512k -XX:+UseCompressedOops MAVEN_OPTS: -Xmx384m -Xss512k -XX:+UseCompressedOops PATH: /app/.jdk/bin:/usr/local/bin:/usr/bin:/bin
DATABASE_URLとHEROKU_POSTGRESQL_BLUE_URLという環境変数に、全く同じpostgresスキームの値が設定されています。 Heroku Postgresは1つのアプリケーションに複数追加することができるので、そのそれぞれの接続情報が「HEROKU_POSTGRES_[色名]_URL」という環境変数に設定されます。
DATABASE_URLは、アプリケーションがメインで使用するデータベースの接続情報です。 アプリケーションにHeroku Postgresが1つだけ追加されている場合は、自動的にその値が設定されます。
[2] 上記コマンドサンプルに含まれている接続情報は実際にHerokuが返したものですが、コピー後に再度、削除と追加を行っているので、すでに無効になっています。念のため。
psqlでアクセス
ローカル環境にpsqlコマンド(PostgreSQLのコマンドラインクライアント)がインストールされている場合には、「heroku pg:psql」コマンドでDATABASE_URLに設定されているデータベースにアクセスすることができます。
codezine-sample $heroku pg:psql ---> Connecting to HEROKU_POSTGRESQL_BLUE_URL (DATABASE_URL) psql (9.3.3, server 9.3.4) SSL connection (cipher: DHE-RSA-AES256-SHA, bits: 256) Type "help" for help. codezine-sample::BLUE=>
これはpsqlそのものなので、ここでCREATE TABLEやINSERT文、SELECT文などのSQLを自由に実行することができます。
pgAdminでアクセス
psqlのほか、DATABASE_URLの接続情報を用いて、pgAdminなどのGUIツールから接続することも可能です。
postgresスキームは、
postgres://[ユーザ名]:[パスワード]@[ホスト名]:[ポート]/[DBメンテナンス]
という構成になっているので接続設定の各項目に設定してください。
また、外部から接続する場合はSSLが必須なので、接続設定のSSLタブでSSLを有効にする必要があります。