Unity Fukuokaというコミュニティをやってまして、前に専用Slackを作っていました。
その専用Slackに自動招待ができるようにslackinとHerokuを使って無料作れる事を知り用意していたところ、1年以上ぶりに開くとApplication error
となっていたことを先日知りました(コミュニティー自体全然動いていないので案の定何の連絡もありませんでした苦笑)。
久々に触りたいこともあって作り直した際に何点かつまづいたことのメモとして、正直使いにくいHerokuの使い方や所感も交えながら書いているのでお急ぎの方は欲しい情報だけ読んでくださいmm
heroku-cli
Herokuのsignupが終わったのちに、slackingを使うのでデプロイはやりませんが、heroku-cliをインストールしておきましょう。
heroku-cliは、Node.jsで作られているCLIツールなので(問題が起きないことを確認した上で)npm update
をやってからインストールすると良いでしょう。
Herokuは、Node.jsで操作させるアーキテクチャになっているみたいでちょっと面白いですよねぇ^^
slackin
rauchg/slackinのREADMEに載っているHerokuをクリックするとslackinとHerokuが連携している状態でHerokuアプリケーションが作成できます。
遷移先のslackin × Herokuのアプリケーション作成に必要な情報は以下の内容です。
- GOOGLE_CAPTCHA_SECRET
- Google reCAPTCHAで作成したシークレットキー
- GOOGLE_CAPTCHA_SITEKEY
- Google reCAPTCHAで作成したサイトキー
- GOOGLE_CAPTCHA_SITEKEY
- 自動招待したいSlackのレガシートークン
- SLACK_SUBDOMAIN
- 自動招待したいSlackのサブドメイン
Google reCAPTCHA
Google reCAPTCHAは、ボットからサイトを守るセキュリティシステムです。
間違いやすいですがHerokuのページでは、上からシークレットキー→サイトキーですが、recaptchaのページだと、上からサイトキー→シークレットキーと順番が逆なので何も考えずそのままコピペして間違わないように注意しましょう。
Slack Legacy Tokens
Legacy tokensで自動招待したいSlackのトークンを発行しましょう。
Deploy app
全て入力後にDeploy appを押すとちょっと待ち時間がありますが、数分後すぐにアプリケーションがデプロイされてhttps://【App name】.herokuapp.com/
にアクセスできるようになります。
私の場合は、ある問題でアクセスしてもApplication error
ページでそこから1時間以上つまづいた状況でした。
Application error
まず、Application error
ページが出たときは、ログの確認です。
ですが、Herokuの管理画面上ではログを確認することができません。
マジでHerokuの使い方って分かりにくいんですが苦笑、heroku-cliからログを確認することができます。
確認するには、まず、デプロイはしませんがHerokuアプリケーションをlocalにcloneする必要があります。
以下のコマンドのそれ以降のコマンドは行わなくて大丈夫です。
$ heroku git:clone -a 【App name】
$ cd 【App name】
この次に
$ heroku logs --tail
と実行すると作ったHerokuアプリケーションが動いているログがリアルタイムで流れ込んできます。
再度https://【App name】.herokuapp.com/
にアクセスしてみるとエラーの詳細が表示されてますのでそこから原因を探ることになります。
さて、私の場合は以下の各エラーが表示されて原因が突きとめました。
status=503
heroku[router]: at=error code=H10 desc="App crashed" method=GET path="/" host=unityfukuoka.herokuapp.com request_id=【REQUEST_ID】 fwd=【IP】 dyno= connect= service= status=503 bytes= protocol=https
heroku[router]: at=error code=H10 desc="App crashed" method=GET path="/favicon.ico" host=unityfukuoka.herokuapp.com request_id=【REQUEST_ID】 fwd=【IP】 dyno= connect= service= status=503 bytes= protocol=https
これはエラーが原因で出てしまうエラーのようです。
簡単に説明すると「デプロイ」→「反映」→「アクセス可能」というフローでデプロイ時に何らかの問題が起き、反映が完了できておらず、アクセス不可状況でアクセスしてしまうとこのエラーが出てしまうようです。
TypeError: Cannot read property 'body' of undefined
app[web.1]: TypeError: Cannot read property 'body' of undefined
app[web.1]: at /app/dist/slack.js:62:23
app[web.1]: at Request.callback (/app/node_modules/superagent/lib/node/index.js:699:3)
app[web.1]: at ClientRequest.<anonymous> (/app/node_modules/superagent/lib/node/index.js:636:10)
app[web.1]: at ClientRequest.g (events.js:292:16)
app[web.1]: at emitOne (events.js:96:13)
app[web.1]: at ClientRequest.emit (events.js:188:7)
app[web.1]: at TLSSocket.socketErrorListener (_http_client.js:309:9)
app[web.1]: at emitOne (events.js:96:13)
app[web.1]: at TLSSocket.emit (events.js:188:7)
app[web.1]: at emitErrorNT (net.js:1277:8)
heroku[web.1]: Process exited with status 1
これはデプロイ時に起きたエラーでした。
正直このエラーでは全く分かりませんでした笑汗
色々調べたところslackinのissuesにIssues with set up in heroku #160があるのを見つけて、サブドメインに関する話しをされていたのでSLACK_SUBDOMAIN
に設定した内容を確認しました。
オプションの設定後の確認/編集について
これまたHerokuの分かりづらいUI/UXで初見じゃどこに設定したオプションが確認と編集ができるのか気づきにくいんですよねぇ( *`ω´)
SettingページのConfig Vars
のReveal Config Vars
ボタンをクリックすると設定した各オプションが表示され、確認と編集が可能になります。
このとき、私がSLACK_SUBDOMAIN
に設定した内容は、unityfukuoka.slack.com
でした。
サブドメインだからそのまま指定しましたが、試しにhttps://unityfukuoka.slack.com
などと設定してみたところ、Error: getaddrinfo ENOTFOUND https https:443
という結果でした。
ちなみにどれかConfig Vars
のオプションを変更するとHerokuが勝手に毎度デプロイ作業を自動で行います。
$ heroku logs --tail
しておくとその様子が見れるのですぐに確認ができます。
Error: getaddrinfo ENOTFOUND https https:443
app[web.1]: Error: getaddrinfo ENOTFOUND https https:443
app[web.1]: at errnoException (dns.js:28:10)
app[web.1]: at GetAddrInfoReqWrap.onlookup [as oncomplete] (dns.js:76:26)
なおさら分からなくなりましたね笑汗
再度、SLACK_SUBDOMAIN
をunityfukuoka.slack.com
に戻したところ次のエラーが表示されました。
Error: Hostname/IP doesn't match certificate's altnames
app[web.1]: Error: Hostname/IP doesn't match certificate's altnames: "Host: unityfukuoka.slack.com.slack.com. is not in the cert's altnames: DNS:slack.com, DNS:*.slack.com"
app[web.1]: at Object.checkServerIdentity (tls.js:199:17)
app[web.1]: at TLSSocket.<anonymous> (_tls_wrap.js:1098:29)
app[web.1]: at emitNone (events.js:86:13)
app[web.1]: at TLSSocket.emit (events.js:185:7)
app[web.1]: at TLSSocket._finishInit (_tls_wrap.js:610:8)
app[web.1]: at TLSWrap.ssl.onhandshakedone (_tls_wrap.js:440:38)
heroku[web.1]: Process exited with status 1
ここでやっとエラーの原因が分かりました。
DNS:*.slack.com
とあり、Host: unityfukuoka.slack.com.slack.com
と表示されているため、SLACK_SUBDOMAIN
への設定は、unityfukuoka
(Slackのアプリ名)だけで良かったようです^^;
まとめ
その後は、全てデプロイが上手く処理され反映が完了し、この記事のトップに載せている画像のページが表示されるようになりました。
参考にした記事は以下になりますので、付き合わせて何かのお役に立てたらなと思いますmm
- hamakn/slackin_2018.md
- [Ruby on Rails Tutorial]Herokuにデプロイ後Application error[H10 (App crashed)]が発生した時の対処法