フレクトのクラウドblog re:newal

http://blog.flect.co.jp/cloud/からさらに引っ越しています

自作アプリをHeroku Add-onsにプロビジョンする方法

こんにちは。エンジニアのオクダです。今回のテーマは「自作アプリをHeroku Add-onsにプロビジョンする方法」です。

皆さん、Heroku Add-onsはよく利用しているが、実際にHeroku Add-onsを作成するとなると、って言うことにならないでしょうか?

そこで、今回は「アドオン開発するぞ、の第一歩としてtestクラスのアドオンを作ってみる」をご紹介します。

その前にHeroku アドオンのリリースステージとは

Heroku アドオンには、リリースステージがあり、α版については、審査なしで無料で作成することができます。

devcenter.heroku.com

そのリリースステージ名がtestになります。

Heroku Add-ons自体は、Heroku以外のhttpsサーバーでも実装可能です。

Heroku CLIでHerokuにログイン

$ heroku login

既に別のアカウントにログインしていて、Herokuにログインできない場合は

$ heroku login --interactive

addons-adminプラグインをインストール

$ heroku plugins:install addons-admin

add-onsのルートディレクトリにマニフェストを作成

$ heroku addons:admin:manifest:generate

Input manifest information below: // と聞いてくるので

? Enter slugname/manifest id: <manifest id>    # 一度決めると変更できない
? Addon name (Name displayed to on addon dashboard): (MyAddon) <Addon name>    # Addon nameを入力
? Choose regions to support
  <space> - select
  <a> - toggle all
  <i> - invert all 
  ↑↓ use arrow keys to navigate
 (Press <space> to select, <a> to toggle all, <i> to invert selection)
❯◯ dublin
 ◯ eu
 ◯ frankfurt
 ◯ oregon
 ◯ sydney
 ◯ tokyo
 ◉ us    # 取り敢えず弊社ではUSを選択
 ◯ virginia
? Would you like to generate the password and sso_salt? (Y/n) <Y>    # Yを入力
? This prompt will create/replace addon-manifest.json. Is that okay with you? (Y/n)  <Y>    # Yを入力
Generating add-on manifest... done
The file addon-manifest.json has been saved!    # と表示されたら成功

Heroku Add-onsマニフェストの要件

生成されたHeroku Add-onsマニフェストは下記のようになっています。

{
  "id": <add-on-id>,    # 後ほどBasic認証のuserNameで使用する。
  "api": {
    "regions": [
      "us"
    ],
    "version": "3",
    "password": <add-on-password>,    # 英数32文字の任意の文字列で自動生成されます。後ほどBasic認証で使用するので、覚えておく。後ほどBasic認証のpasswordで使用する。
    "requires": [],
    "sso_salt": "********************************",    # 英数32文字の任意の文字列で自動生成されます。
    "production": {
      "sso_url": "https://<example>.herokuapp.com/sso/login",
      "base_url": "https://<example>.herokuapp.com/heroku/resources"
    },
    "config_vars": [
      <CONFIG_VARS_URL>
    ],
    "config_vars_prefix": <CONFIG_VARS_PREFIX>
  },
  "name": <add-on>,
  "$base": 156626069365144
}

Heroku Add-onsマニフェストにはproduction.sso_url / base_urlが存在し、実在するURLに編集しなければなりません。

sso_urlとbase_urlの要件は...

  • URLの命名規則

    • sso_urlの命名規則は、URLの最後が/sso/loginで終了する
    • base_urlの命名規則は、URLの最後が/heroku/resourcesで終了する
  • httpsサーバーであること

    • manifestにあるproduction.sso_url / base_urlに実在するURLを指定する
    • これらのURLをhttpsサーバーに実装

sso_url: https://example.com/a/b/sso/login

base_url: https://example.com/c/d/e/heroku/resources

"base_url"は、heroku addonsを作成する際に、有効なアドオンであるか確かめる為に、Basic認証を行うページです。

"sso_url"は、heroku addonsを起動する際に、一番最初に訪れるページです。

更新したaddon-manifest.jsonをHerokuにプッシュする

$ heroku addons:admin:manifest:push

アドオンをホストするWebサーバーを下記のコードのように追加する(Python Flaskの場合)

from flask import Flask, render_template, jsonify, redirect
    ︙
    ︙
def basic_auth():
    userName = <add-on-id>    # 先ほどマニフェストで登録していた、アドオンID
    password = <add-on-password>    # 先ほどマニフェストで登録した、パスワード

    app.config['BASIC_AUTH_USERNAME'] = userName
    app.config['BASIC_AUTH_PASSWORD'] = password
    app.config['BASIC_AUTH_FORCE'] = True

    basic_auth = BasicAuth(app)
    ︙
    ︙
@app.route('/heroku/resources', methods=["GET", "POST"])            # addonの認証はPOSTで行われるため、methodにPOSTを追加
def base():
    basic_auth()
    res = {
        "id": "01234567-89ab-cdef-0123-456789abcdef",            # 何でも良い
        "message": "",                            # 空で良い
        "config": { <CONFIG_VARS_URL>: "https://<example>.herokuapp.com/" }    # キーにaddon-manifest.jsonのconfig_varsを指定してあげる。値はアプリのURL
    }
    return jsonify(res)

@app.route('/sso/login', methods=["GET", "POST"])                # base関数同様、methodにPOSTを追加
def sso():
    basic_auth()
    return redirect('/')    # rootパスにリダイレクト

自作Add-onをHerokuアプリに追加する

$ heroku addons:create <add-on>:test

下記のようなログが出てきたら成功です。

Creating <add-on>:test on ⬢ <app-name>... free
Created <add-on>-<alpha-numeric> as <CONFIG_VARS_URL>    # <CONFIG_VARS_URL>は、addon-manifest.jsonのconfig_varsで宣言しているキー
Use heroku addons:docs <add-on> to view documentation

うまく作成されない時は、これをやってみると詳しいログが取得できます

$ DEBUG=* heroku addons:create <add-on>:test --app <app-name> --wait

どうでしたか?参考になりましたでしょうか?

Herokuを利用している場合、使用する機会があるHeroku Add-ons。そのHeroku Add-onsを、作成する方法をご紹介させていただきました。

最後まで、読んでいただき有難うございました。

Herokuアドオンの公式ドキュメントもご覧ください。

devcenter.heroku.com

devcenter.heroku.com