[Heroku] アドオンを共有機能を使って管理する

herokuでPostgreSQLやRedisなどを他のアプリでも共有したい場合、環境変数をコピペして使っていたのだけれど、 それだとちょっとマズイ場合もあるらしく、attacheing add-on を使ってみた。

共有する理由

環境変数にパスワードなどをコピペするよりも確実、という理由もあるが、一番大きなところとしては、 メンテナンスなどでアドオンのDB名やユーザー名などの情報が変わってしまうことがあるよう。
その時に、直接入れているアプリの方では自動的に環境変数も書き換わるため支障はないが、 コピペで設定している他のアプリが合った場合には参照が出来なくなってしまう。 その時に共有設定していれば、設定しているアプリの環境変数も自動で書き換わるためメンテナンスの手間がなくなる。 なによりも突然アクセスできなくなる事がなくなる、というわけ。

コピペなんていう不確定な方法よりもherokuの公式機能に乗った方が確実に安全。

アドオンの追加

例えば今回は、dog、というアプリにheroku postgresを入れてみる。

1
2
3
4
5
$ heroku addons:create heroku-postgresql:hobby-dev -a dog
Creating postgresql-opaque-93277... done, (free)
Adding postgresql-opaque-93277 to dog... done
Setting DATABASE_URL and restarting dog... done, v10
Database has been created and is available

https://devcenter.heroku.com/articles/heroku-postgresql

DBの設定内容は、環境変数のDATABASE_URLに保存されている。

アドオンの共有

作ったアドオンを別のアプリでも利用してみる。
その際にアドオンの名前が必要になる。
上記作成時に名前が返ってきており、postgresql-opaque-93277が今回の名前になる。
後から確認するには、アプリの一覧を見ればわかる。

1
2
3
4
5
6
$ heroku addons -a dog

Add-on                                       Plan       Price
───────────────────────────────────────────  ─────────  ─────
heroku-postgresql (postgresql-opaque-93277)  hobby-dev  free
 └─ as DATABASE

名前がわかったところで、この名前を利用して他のアプリと共有させる。
例えば今回はcat というアプリに共有させたとする。

1
2
3
$ heroku addons:attach -a cat postgresql-opaque-93277
Attaching postgresql-opaque-93277 to cat... done
Setting DATABASE vars and restarting cat... done, v17

ここでアドオンの名前を指定する。
アドオン一覧で確認するとdogアプリから共有されていることがわかる。

1
2
3
4
5
6
7
$ heroku addons -a cat

Add-on                                       Plan       Price
───────────────────────────────────────────  ─────────  ────────────────────
heroku-postgresql (postgresql-opaque-93277)  hobby-dev  (billed to dog app)
 ├─ as DATABASE
 └─ as DATABASE on dog app

DBの設定内容は、環境変数のDATABASE_URLに保存されている。

heorkuのダッシュボード上では以下のように共有されている事がわかるようになっている。

アドオンの削除

共有の解除

共有の解除は、detachを使う。

1
2
3
$ heroku addons:detach -a cat postgresql-opaque-93277
Removing DATABASE attachment to postgresql-opaque-93277 from cat... done
Unsetting DATABASE vars and restarting cat... done, v18

削除

削除には、destroyを使う。
共有をしている場合は、先に共有設定を全て解除しておく必要がある。
途中、確認のためにアプリ名の入力を求められるので入力する。

1
2
3
4
5
6
7
8
9
$ heroku addons:destroy postgresql-opaque-93277

 !    WARNING: Destructive Action
 !    This command will affect the app: dog
 !    To proceed, type "dog" or re-run this command with --confirm dog

> dog
Destroying postgresql-opaque-93277 on dog... done, (free)
Removing vars for DATABASE from dog and restarting... done, v13

アドオン名の指定

ここまでで一通りのアドオンの設定方法は終わりだけど、それぞれのアドオンを追加、共有する時に名前を変更できる。

追加時

1
2
3
4
5
$ heroku addons:create heroku-postgresql:hobby-dev -a dog --name dog-database --as DOG_DATABASE
Creating dog-database... done, (free)
Adding dog-database to dog... done
Setting DOG_DATABASE_URL and restarting dog... done, v16
Database has been created and is available

--nameは、アドオンの名前を指定している。
--asは環境変数に追加する名前を指定している。
asで指定する名前は、アルファベットの大文字で、使用できる記号も決まっている。(-ハイフンは使用できない)

この場合、DBの設定内容は、環境変数のDOG_DATABASE_URLに保存されている。

1
2
3
$ heroku config -a dog
=== dog Config Vars
DOG_DATABASE_URL: postgres://yo....

共有時

共有時にはアドオンの名前は設定出来ない(元を参照するので)が、asの指定は可能。

1
2
3
$ heroku addons:attach -a cat dog-database --as CAT_DATABASE
Attaching dog-database as CAT_DATABASE to cat... done
Setting CAT_DATABASE vars and restarting cat... done, v19

参考

   このエントリーをはてなブックマークに追加