2018年 YYPHPアドベントカレンダー 17日目です。
題材として@nouphetさんが公開されていたConnpassから参加者リストを一撃で取得するスクリプトのWEB版を作ってみようと思います!
目的
- 普段お世話になってるYYPHPに少しでも貢献したかった
- いつもは自作インフラにアプリを載せてしまっているので、流行りのPaasにデプロイしてみたかった
機能要件
- トップ画面には開催予定のイベント一覧を表示する
- 開催予定のイベントをクリックすると、参加者一覧が表示される
- 参加者一覧ページでコピーボタンを押すと、HackMD用のテキストが取得できる
フロントエンドの構成
インフラ:Firebase Hosting
フレームワーク:Nuxt.js
バックエンドの構成
インフラ:Heroku
フレームワーク:Laravel
作ったもの
https://yyphp-member-list.firebaseapp.com/
(30分無アクセスだとHerokuのDynoさんが居眠りするので、初回アクセスが重いことがあります)
苦労したところ
[Heroku] WEBからアクセスしたときと「heroku run ~」で動く環境は別物だった
イベント情報を1時間おきに実行するバッチで取得し、キャッシュしています。
このキャッシュ、最初は「ローカルファイルキャッシュ」でやろうとしていたのですが罠がありました。
WEBアプリが動く環境(Dyno)と「heroku run」や「Heroku scheduler」が動く環境は別物だったのです。。。
(「heroku run」や「Heroku scheduler」が動く環境は「One-off Dyno」という一時的な環境)
そのため、いくら「heruku run ~」や「Heroku scheduler」でバッチを動かしてキャッシュしても、
キャッシュはそれぞれのDynoにしか存在せず、WEBアプリ側からは見ることができなかったのです。
ローカルファイルキャッシュではだめだ、ということになったのでHeroku Redisを導入してしのぎました。
(ちなみに、Heroku RedisはAWS使っているみたいです)
※もちろん、WEBアプリDyno内でキャッシュする処理であればローカルファイルキャッシュでも問題ありません。
ただ、その場合スケールアウトしたときにそれぞれのDynoにファイルキャッシュされてしまうので、
結局Redisなどでキャッシュするのが正解かもしれません。
[Heroku] laravel.logが出力されない!
未完成状態でデプロイしたときに、なんらかのエラーが起きたのですが「laravel.log」が出力されておらず、見ることができませんでした。
これはログ出力されていないのではなく、見に行こうと「heroku run bash」したときにつながるのは前述の「One-off Dyno」であるためです。
どうすればよいかはHerokuのドキュメントに載っていました。
https://devcenter.heroku.com/articles/getting-started-with-laravel#best-practices
<?php
return [
'default' => env('LOG_CHANNEL', 'stack'),
'channels' => [
'stack' => [
'driver' => 'stack',
'channels' => ['single'],
],
'single' => [
'driver' => 'errorlog', #ここがポイント
'level' => 'debug',
],
Laravel.logをファイルではなく、「errorlog」に出力するように変更すればよいのです。
そうすると、以下のようにHerokuの管理画面からログを確認することができるようになります。
(以下のログは、保存されたデータの確認用に埋め込んだもの)
作ってみた感想
いつも自作インフラにばかりデプロイだったので、PaaS特有の問題に引っかかってしまった。
思った以上に時間を割けず、完成度がちょっと微妙な状態に……
(テストコードすらかけていない有様)
今後、勉強も兼ねてちまちまリファクタリングしていく予定
Firebaseでこまったポイントなかったな。。。Firebaseのシンプルさすごい。
最後に
YYPHPを開催してくださり、さらにリモートでも参加できるようにしてくださってる株式会社クラフトマンソフトウェアの皆様。
本当にありがとうございます! これからもよろしくお願いいたします!