Addon のアプリ間共有
はじめまして、2015年からこのHerokuブログを担当することになりました、浅野です。 今後ともよろしくお願いいたします。
今回のポストは Heroku blog の Expanding the Power of Add-onsを試してみました。
できるようになったこと
1つのアプリが使用しているaddonを別のHerokuアプリケーションで共有できるようになりました。 複数Herokuアプリケーションでaddonが共有できると MicroServices を作りやすくなるよね、とのこと。
動作検証
早速、どんな風に操作するかをためします。
大まかな流れ
- addon-attachmentsプラグインのインストール
- アプリケーション作成
- Addonの追加
- アプリケーションのデプロイ
- Addonを共有するアプリケーションの作成
- Addon共有の設定
- Addonを共有するアプリケーションのデプロイ
addon-attachmentsプラグインのインストール
Addonを追加する前に、addon 共有のためのプラグインをインストールします。
$ heroku plugins:install https://github.com/heroku/heroku-addon-attachments.git
アプリケーション作成
Herokuにデプロイするアプリケーションを作ります。 今回はFlectのgithubリポジトリにある ht-java-demo を使います。
$ git clone git@github.com:flect/ht-java-demo.git
$ cd ht-java-demo
$ heroku create
1つ目のアプリの名前は hogehoge
とします。
Addonの追加
アプリケーションに Addonを追加します。 定番の heroku-postgresql
を使用します。
アドオンの追加は addons:create
を使います。--name
オプションでこのアドオンを共有する名前を設定します。
ここでは my-share-db
という名前にしています。
$ heroku addons:create heroku-postgresql --name my-share-db
アプリケーションのデプロイ
hogehoge
をHerokuへデプロイします。
$ git push heroku master
このプログラムは https://hogehoge.herokuapp.com/db
で、DBから読み込んだ値を表示します。
デプロイしただけだと、テーブル・レコードがないので、エラーが表示されます。
テーブル・レコードを生成するにはプロジェクトのルート階層にある create.sql
を実行します。
$ heroku pg:psql
hogehoge::PURPLE=> \i create.sql
これで再度、https://hogehoge.herokuapp.com/db
を開くとHello test
が表示されます。
ここまでは、いつも通りです。
Addonを共有するアプリケーションの作成
hogehoge
で使用している共有名my-share-db
のheroku-postgresql を使用する別のアプリケーションを作ります。
このアプリも今回はht-java-demo を使います。
実際にAddonを共有したいケースはコードベースを共有しない別アプリケーションのはずなので、別のディレクトリにクローンして、Herokuアプリケーションとして初期化します。
heroku create
2つ目のアプリの名前は piyopiyo
とします。
Addon共有の設定
Herokuの設定
Addonを共有するときには addons:attach
を使います。第1パラメータにアドオンの共有名 --as
オプションでこのアプリが参照する名前を指定します。
hogehoge の heroku-postgresql アドオン my-share-db
を、 SHARED_DB
という名前で参照するには以下のコマンドを実行します。
heroku addons:attach my-share-db --as SHARED_DB
これで、piyopiyo
アプリには、環境変数SHARED_DB_URL
が定義されて hogehoge
の heroku-postgresql アドオンが提供するDBに接続できるようになります。
ソースコードの変更
ht-java-demoで接続先DBの情報を読み込んでいるのはここ なので、この"DATABASE_URL"
を"SHARED_DB_URL"
に変更します。
Addonを共有するアプリケーションのデプロイ
これはいつも通りの
$ git push heroku master
です。デプロイが正常終了したら、ブラウザでhttps://piyopiyo.herokuapp.com/db
を開きます。
hogehoge
の時は、DBテーブルが存在しない、とエラーになっていたページが問題なく表示されていて、DBが共有されていることが確認できました。
まとめ
アプリ間でAddonを共有したいケースは時々あって、環境変数の値を共通の値にする等の対応をしていた部分が今回の変更でずいぶん楽になった気がします。 個人的に、 GitHub Integration の PullRequest ごとの自動デプロイでテスト用データが入ったDBを共有できるのでは、と思って調べてみたのですが、今(2015/01/26)見たら、PullReqeust毎の自動デプロイの機能が見当たらない、っていう。ベータ版機能なのでしかたないですよね...。
おまけ
addon-attachmentsプラグインをインストールして追加される addon コマンドは以下の通りでした。
addons:attach
Usage: heroku addons:attach ADDON
attach add-on resource to an app
--as ATTACHMENT_NAME # (optional) name for add-on attachment
--confirm APP_NAME # overwrite existing add-on attachment with same name
addons:attachments
Usage: heroku addons:attachments
list add-on attachments
--all # list attachments across all apps in account
addons:create
Usage: heroku addons:create PLAN
create an add-on resource
--name NAME # (optional) name for the resource
--as ATTACHMENT_NAME # (optional) name for the initial add-on attachment
--confirm APP_NAME # (optional) ovewrite existing config vars or existing add-on attachments
addons:destroy
Usage: heroku addons:destroy ADDON
destroy an add-on resources
-f, --force # allow destruction even if this in not the final attachment
addons:detach
Usage: heroku addons:detach ATTACHMENT
detach add-on resource from an app
addons:plans
Usage: heroku addons:plans
list all available add-on plans
--region REGION # specify a region for add-on plan availability
Example:
$ heroku addons:plans --region eu
=== available
adept-scale:battleship, corvette...
adminium:enterprise, petproject...