こんにちは。エンジニアのオクダです。今回のテーマは「自作アプリをHeroku Add-onsにプロビジョンする方法」です。
皆さん、Heroku Add-onsはよく利用しているが、実際にHeroku Add-onsを作成するとなると、って言うことにならないでしょうか?
そこで、今回は「アドオン開発するぞ、の第一歩としてtestクラスのアドオンを作ってみる」をご紹介します。
その前にHeroku アドオンのリリースステージとは
Heroku アドオンには、リリースステージがあり、α版については、審査なしで無料で作成することができます。
そのリリースステージ名が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の要件は...
例
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アドオンの公式ドキュメントもご覧ください。