Addon のアプリ間共有

Addon のアプリ間共有

はじめまして、2015年からこのHerokuブログを担当することになりました、浅野です。 今後ともよろしくお願いいたします。

今回のポストは Heroku blog の Expanding the Power of Add-onsを試してみました。

できるようになったこと

1つのアプリが使用しているaddonを別のHerokuアプリケーションで共有できるようになりました。 複数Herokuアプリケーションでaddonが共有できると MicroServices を作りやすくなるよね、とのこと。

動作検証

早速、どんな風に操作するかをためします。

大まかな流れ

  1. addon-attachmentsプラグインのインストール
  2. アプリケーション作成
  3. Addonの追加
  4. アプリケーションのデプロイ
  5. Addonを共有するアプリケーションの作成
  6. Addon共有の設定
  7. 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...
コメント(0)