1
/
5

AWSを使ったスケーラブルなログ機能を実装した話

マッチングッドアルバイトの稲森です。初投稿です。

前々から技術ブログを作ろうという話は出ていたのですが、とうとう実現したようです。めでたい。

今回は自分が開発・オープンソース化したSQSLoggerについて、その開発の流れを書きたいと思います。

きっかけ

現在私達が開発している、派遣先スタッフ/担当者向けアプリケーションである勤怠入力ツールWorkinGoodでは当初、ログを取る機能はLaravelのStorageファサードを使い、Amazon S3に直接書き込む形で行っていました。書き込み頻度の低いものであれば、これでも十分実用に足りうるのですが、ことアクセスログやエラーログ等の頻度が多いと想定されるものには、あまりよい手段とは言えません。

そんな時、ソニーのインターンから帰ってきた妹尾さんが良いアイディアを持ってきました。これは実装したい!と思いたち、早速開発にとりかかりました。そして一部の機能は、後にcomposerライブラリとしてオープンソースになりました。

アイディア



現状のログ機能では、アクセスが増えた時にS3へのアクセスがネックになることが想定されたので、その負荷を軽減するのが今回の目的です。そこで、ログに取るべき情報をAWS SQS上のキューに登録する方針が提案されました。これによって、S3がGET/PUTと2つのリクエストを送らなければならないのに対し、ログ情報のPOSTのみで済むので、リソースを食わなくて済みます。

では、SQS上に溜めたログはどう処理するのか、という問題に当たりますが、これはAWS Lambdaを使えば解決できます。Lambdaには、cronのように指定したタイミングでスクリプトを実行できる機能があるので、これを用いて、一定間隔ごとに、SQSに溜まったログを指定した実行時間内にできるだけLambdaでGETし、それらを固めてS3にPOSTします。つまり、いままでアプリケーション側で行っていたS3へのPOSTを、Lambdaという別リソースで行うということです。

また、アプリケーションからPOSTするログ情報はJSON形式で送信し、S3には、各行がJSONになっているテキストとしてPOSTします。これは、Lambdaで走らせるのがJavascriptなのでJSONだと処理しやすいという点と、S3上のログを解析するときにも効率よく処理できる点からそのようにしています。

たとえば、弊社slack上ではheroku上で動いているbotがいますが、S3上にあるログを解析して様々な機能を提供しています。最近実装したものだと、アプリケーションでfatalなエラーが発生した時にslack上のWorkinGoodチャンネルにお知らせしてくれる機能があります。具体的には、

1. heroku上にAPIを用意する(ここをPOSTで叩くとエラーの件数をslackに通知する)

2. Lambda上に、S3上に作成されたエラーログを読み取り、1のAPIを叩くスクリプトを用意し、"S3上の特定の場所にファイルが作成された時"に発火するように設定する。

という形です。S3上のerrorディレクトリ以下にファイルが作成されたりすると、それを読みにいってslackに通知します。





そしてライブラリ化へ…

とりあえずWorkinGoodの1機能として実装したこのログ機能ですが、弊社の別プロジェクトでも需要があるようだったので、切り離してライブラリ化することになりました。とはいえ、アプリケーション側の実装はSQSにログを送信する機能だけなので、そう大変な作業ではありませんでした。一方ただ移植するだけではちょっとつまらないので、Laravelのファサードとして使えるようにしてしまおう!ということでひと工夫加えました。(その辺のことについてだけで1記事ぐらい書けそうなので、また後々書こうと思います。)

できたライブラリがこちらです。composerにも登録しているので、Laravelをつかったプロジェクトや、そうでないプロジェクトでも気軽に使ってください。issue/PRもお待ちしております。

まとめ

こうして、1つの機能を1人で丸々実装するのは結構面白かったですし、AWSの各種機能に親しむこともでました。特にLambdaは(この実装をした当初は)日本語の実用例や解説記事も少なく、結構四苦八苦した記憶があります。。。

今回は実装したものの紹介にとどめましたが、今後は技術Tipsについても投稿していくつもりです。

さて、今回紹介したログ機能の実装のように、やる気があればチャレンジングなこともできる弊社では、アルバイトを絶賛募集中です!(お約束?)

ぜひ一度、お話を聞きに来てください!

マッチングッド株式会社では一緒に働く仲間を募集しています
3 いいね!
3 いいね!
同じタグの記事
今週のランキング