こんにちは。あとむです。
かなり前から実装と仕様変更を繰り返しまくっていた入稿管理システムプロジェクトの実装が一旦落ちつきました。
一旦落ち着いたといえここからまた仕様が変わったり追加の開発があったりする雰囲気はプンプン漂っているのですが、一旦振り返りをしようと思います。
プロジェクト概要
- 現状メールなどでやりとりしている入稿状況の管理をシステムを使うことで分かりやすく、かつ効率化することが目的
- 5つの権限×入稿状況により様々な処理を分岐する必要あり
- Laravelで実装
- ストレージはS3ではなくBOX
- AWSにデプロイ(EC2・RDS等を使った最小構成)
- 定期実行バッチで入稿状況等の更新が必要
- HTML/CSSはデザイナーさんに作成いただいて、その後の部分についてインフラ含め担当
今回実装したシステムは記事の入稿→確認→製作(別システム)→製作物の確認→公開の流れをシステム上で分かりやすく簡潔に実行できるようにするためのシステムでした。
基本的にやりたいことは記事の入稿状況の管理で、記事自体は別システムで製作され、かつ特にその別システムとのAPI連携などはないので、そこまで複雑なものではないなと最初は考えていました。
が、寄稿者・確認者A・確認者B・製作者というように複数の権限に別れていることや、記事のテンプレート等の関係性がかなり複雑で、どう作るかについてかなり頭を悩ませるシステムでした。
個人的にはそもそものやりたいことと仕様の複雑さのバランスがとれてないように思うのですがこのあたりは受託なので仕方ないですね、、、
一応実際のお客様とのMTGにも出席していたのですが、お客様の出してきた仕様や要望に対してそれを跳ね除けるのに十分な説明ができなかったこともあり、結局複雑な仕様のままシステムに落とし込むことになりました。
AWSにデプロイ!
今回はこれまでのレンタルサーバーとは違いAWSにデプロイする必要がありました。
実は私昨年AWSのSolutions Architect Associateの資格を取得しており、いつか業務でAWSを使えることを夢見ていたのですが、ようやくその願いが叶いました!
会社員だった時は業務でAWSを使うなんて夢のまた夢くらいの感じだったのですが、フリーランスになった途端当たり前みたいな感じでAWSを使うことを指示されたのでとても嬉しかったです。
フリーランスでやっていく上でAWSの経験は必要不可欠といろんなところで聞いているのでね。絶対にいい経験になるはずと意気込んでインフラを作りました。
試験に出てこなかったネットワークACLやらルートタイムテーブルやらに悩まされましたが、何とかSSL化まで無事できた時は結構嬉しかったです。AWS楽しい。
まだ簡単なものしか作れませんが、いずれはオートスケールだったりを綺麗に設定できるようにしたいですね。
権限による処理の分岐
今回のシステムでは権限というかユーザーの役割による処理の出しわけがとても多いシステムでした。
最初はif(Auth::user()->role == "hoge")
みたいな形で分岐していたのですが、何となく見づらい。。。
みたいなところで色々と調べていたのですが、さすがはLaravel。ちゃんとそういう時に使うドンピシャな機能が備わっていました。
1年くらいずっとLaravel開発していますがまだまだ知らない機能がてんこ盛りなようです。日々精進ですね。
バッチ処理で作成されたログが権限エラー問題
今回一つ詰まったものとして、権限エラーの問題がありました。
毎日深夜0時に動くバッチがあり、こいつがapacheではなくcronの実行ユーザーでログを作成することが原因で、作成されたログをapacheが書き込みできずに権限エラーが発生するというものです。
自分の中では下記のような感じでグループの書き込み権限つければいいんじゃないの?と思っていたのですがどうやら違ったようです。
$ ls -ltr
-rw-rw-r-- 1 hoge-user hoge-user 4238238 6月 23 20:32 laravel-2021-03-15.log
$ getent group hoge-user
hoge-user:x:1001:apache
おそらくスティッキービットかサブグループの問題だとは思うんですけどね。。
残念ながら色々試してもうまく動かず、、諦めてバッチのログとウェブのログを出し分けることで対応しました。
'daily' => [
'driver' => 'daily',
'path' => storage_path('logs/laravel.log'),
'level' => 'debug',
'days' => 14,
'permission' => 0664,
],
// 追加
'batch' => [
'driver' => 'daily',
'path' => storage_path('logs/batch.log'),
'level' => 'debug',
'days' => 14,
'permission' => 0664,
],
class hogeCommand extends Command
{
・・・
public function __construct()
{
parent::__construct();
// ログの出力方式を設定
Log::setDefaultDriver('batch');
}
・・・
今思うとpermissionを0664ではなく2664にすればうまく動いたのかな?ちょっとそのうち検証します。
このあたりのログは忘れそうなのでLaravelデプロイチェックリストみたいな記事を書こうかなと思います。
最終的には権限エラーも起きずログも見やすく出しわけされるようになったのでよかったです。
そんな感じで頑張りましょう
以上入稿管理システムの実装の振り返りでした。
上記以外にもS3ではなくBOXをストレージとして使いたいという不思議な要件などがあったおかげで苦戦したのですが、書ききれなくなりそうだったので一旦ここで振り返りは終わりにしようと思います。
いやー新しくシステムを作るたびに知らないものがどんどんでてくるので、学ぶことがつきないですね。
フリーランスの悩みとして「勉強する暇がない」というものが結構多くあるようですが、僕の場合は仕事しているだけで色々勉強できるのでその心配はなさそうです。なんて素晴らしい環境。
そんな感じでこれからも頑張っていきたいと思います。
ありがとうございました!