slackからの自動打刻システムをサーバレスで作る

AMI
7 min readSep 18, 2019

--

slackのメッセージを送ると勤怠管理システムに打刻ができる仕組みを作りました。
構成図は以下の通りです。

「開始」や「終了」のメッセージを送ると、その時刻で打刻が完了する仕組みです。
slackとAWSで完結するのものでも良いかとも思いましたが、スプレッドシートへの記録を挟むことでメンバーみんなが確認しやすかったり、無料で利用できるというのもあったためGAS・スプレッドシートも利用しました。

【作成の手順】
1 slackに送った勤怠情報をスプレッドシートに記録させる
2 lambdaから勤怠管理システムに打刻する
3 GASからLambdaを起動する

slackに送った勤怠情報をスプレッドシートに記録させる

slackのout going webhookと、GASのWebアプリケーションとして導入を利用して連携させる。
まずはスプレッドシートとGASの設定をする。
Google ドライブからスプレッドシートを開き、ツール > スクリプトエディタからGASプロジェクトを作成し、以下のようにコードを保存する。

「Webアプリケーションとして導入」を選択して、URLを叩いたとき、POSTリクエストの場合はdoPost、GETリクエストの場合はdo
Getという関数が呼ばれます。

slackからGASの関数を呼び出せられるように、公開 > ウェブアプリケーションとして導入を選択する。

アクセスできるユーザーで「全員(匿名ユーザーを含む)」を選択し、「導入」をクリックする。

表示された「現在のウェブ アプリケーションの URL:」をどこかに控えておいてください。

次にslackのoutgoing Webhookの設定をします。
https://slack.com/apps/A0F7VRG6Q-outgoing-webhook
上記URLから「設定を追加」します。
インテグレーションの設定から、お好きな「チャンネル」を選択し、「引き金となる言葉」に「開始, 終了」と入力、「URL」には先程GASで生成したウェブ アプリケーションの URLを入力してください。
入力が完了したら保存をします。
「トークン」の項目に入っている文字列は、後で使うのでどこかに控えておきます。
ここまで設定をして、slackの該当チャンネルで「開始」と送ると・・・

A1セルに値が入っているのがわかります!これで連携成功です!

A1セルの中には、slackから送られた内容を含むevent Objectが記録されているので、その情報をもとに必要な内容を抜き出します。

年、月、日、時間・・・などちょっとしつこい感じで記録しようと思います・・・・

slack_token →outgoing webhookで取得したトークンを入力します。
WebhookURLは、知っていれば誰でもリクエストを送ることができてしまうので、このトークンの文字列を判定することでslackからのリクエスト以外は処理を行わないようにできます。

ここで改めてslackのチャンネルで「開始」と送るとこのようにうまく記録できました!

lambdaから勤怠管理システムに打刻する

次にlambdaの設定
puppeteerというChromeのヘッドレスブラウザを使い、スクレイピングをする
lambdaにはLayersと関数というものがある。
関数には実行したい処理を書きます。

Layerには関数で使うライブラリやモジュールを登録できます。 一つの関数に5つLayerを登録でき、一つのLayerを他の関数に登録することもできます。

今回、関数にはスクレイピングの処理を書くindex.jsと、パスワード情報などを保管するconfig.jsonの2つを設定。
また、関数内で利用するchrome-aws-lambda、puppeteer-core、requestの3つのモジュールが入ったLayerを一つ紐付ける。

lambdaでは関数とすべてのレイヤーの解凍後の合計サイズが、解凍後のデプロイパッケージのサイズ制限 250 MB を超えることはできません。nodejsで利用するpuppeteerは普段ブラウザにChromiumを使っていますが、Chromiumを内包したpuppeteerは容量が大きすぎるため、Chromiumを含まないpuppeteer-coreを利用します。

lambdaでpuppeteerを利用する方法は以下の記事がとてもわかりやすかったのでおすすめです↓
AWS LambdaでPuppeteerを動かす

モジュールが入ったzipファイルをローカルで作成する際は、nodejsという名前のディレクトリにしなければうまく動きません。
また、Layer登録時と、関数で利用するランタイムにNode10を利用するとうまく動かない問題があるようですので、Node8を利用してください。

関数にはこのようなコードを登録します。

※github:https://github.com/amiamiyamamoto/slack_stamp

ご利用の勤怠管理システムに合わせて作成してください!

関数の登録ができたら、GASから呼び出しができるよう、API Gatewayの登録を行います。
↓こちらのページがとても分かりやすかったので、おすすめです!
ゼロから作りながら覚えるAPI Gateway環境構築

lambdaやAPIゲートウェイは初期設定がリソース少なめに設定されてます。
lambdaだったら、起動時間上限が少なかったり、API Gatewayは呼び出し上限回数が少なかったりなどなどです。
うまく動かない場合でも、設定が制限されていないか確認してみてくださいね。

GASからLambdaを起動する

最後にGASコードからLambdaに勤怠情報を送る処理と、エラーを受信する処理を記述して終わりです。

おわりに

勤務開始、終了の時間を記録する仕組みはできましたが、細かいところは粗いままです。勤務終了を忘れていたらアラートを上げるなどの機能も付けられたらいいかもなーと思います。

--

--