Heroku Redisを複数のHerokuアプリケーションで共有する
概要
Heroku Redisを複数のHerokuアプリケーションで共有する方法を示します。
Heroku RedisはHerokuアプリケーションでRedisを利用するためのアドオンです。
Heroku Redisは動的にURLが変わってしまう仕様となっています。Herokuアプリケーションでアドオンとして追加していれば、そのアプリケーションの環境変数REDIS_URLが自動的に変更されるので問題なく動作しますが、他のHerokuアプリケーションから同じRedisインスタンスを参照したいとき、他のHerokuアプリケーションの環境変数REDIS_URLを手入力で設定してしまうと、動的にURLが変わってしまった際にRedisにアクセスできずにRedis::TimeoutErrorとなってしまいます。
以下に示す方法を用いれば、環境変数を手入力で登録したり、 Redis::TimeoutError となることなく、複数のHerokuアプリケーションから同じRedisインスタンスを参照することができます。
やり方
前提
main-app, sub-app という2つのHerokuアプリケーションがあり、main-appのアドオンとして追加しているRedisをsub-appも常に参照するようにしたい。
Heroku CLIを利用可能な状態にしておく。
1
sub-appにHeroku Redisアドオンが入っているなら削除する。
https://dashboard.heroku.com/apps/sub-app の Installed add-ons セクションにてブラウザにて確認するか、以下のコマンドで確認できる。
% heroku addons --app sub-app | grep redis
heroku-redis (redis-aerodynamic-12345) hobby-dev free created
上記のような行が出力されたら、アドオンが入っているということです。
https://dashboard.heroku.com/apps/sub-app の Installed add-ons セクションにてブラウザで削除します。コマンドでも削除できます。
2
sub-appに環境変数 REDIS_URL, REDIS_TLS_URL が定義されているなら削除する。
https://dashboard.heroku.com/apps/sub-app/settings の Config Vars セクションにてブラウザにて確認するか、以下のコマンドで確認できる。
% heroku config --app sub-app | grep REDIS
REDIS_TLS_URL: rediss://:abcdef@abcdef.amazonaws.com:12345
REDIS_URL: redis://:abcdef@abcdef.amazonaws.com:12345
上記のような行が出力されたら、環境変数が定義されているということです。
REDIS_URL のみの場合もあります。
https://dashboard.heroku.com/apps/sub-app/settings の Config Vars セクションにてブラウザで削除します。コマンドでも削除できます。
3
main-app で参照しているHeroku Redisのアドオンの名前を取得する。
% heroku addons --app main-app | grep redis
heroku-redis (redis-aerodynamic-12345) hobby-dev free created
この redis-aerodynamic-12345 の部分を後で使うのでメモしておく。
(環境によって値は異なります)
4
sub-appに main-app で参照しているHeroku Redisのアドオンを追加する。
% heroku addons:attach redis-aerodynamic-12345 --app sub-app
Attaching redis-aerodynamic-12345 to ⬢ sub-app... done
Setting REDIS config vars and restarting ⬢ sub-app... done, v1973
redis-aerodynamic-12345 の部分は3でメモしておいた値です。
完了
以上でmain-app, sub-app という2つのHerokuアプリケーションが、main-appのアドオンのRedisを参照しています。
意図した設定が完了しているか確認のため、作業前・作業後で環境変数の値が変わっていること、main-app, sub-appで同一のアドオン名であること、同一の環境変数の値であることなどを確認しておきましょう。
Discussion