Lambdaで早く帰りましょうアラートを毎日19時にSlackに送る

# はじめに
自分達のチームでは**「残業=カッコ悪い事」**という共通認識を持っております。
ただ、集中してるとどうしても時間を忘れて作業していたりという事があるので、毎日19時になったらアラートが飛ぶようにしています。

こんな感じです↓

<img width="440" alt="スクリーンショット 2016-08-05 16.15.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/65968/ad3bb309-6b37-11da-503d-5188d83118e6.png">

我々の間で最近「藤井萩花」がアツいので藤井萩花が19時の到来を教えてくれます。
それでは設定とコードについて書いていきます。

# 前提
* ローカルのマシンでnode.jsが使えること
* AWSが使えること

# Lambdaの設定
AWSからLambdaを開いて Create a Lambda function でfunctionを作っていきます。
今回はNode.jsで作ります。

<img width="214" alt="スクリーンショット 2016-08-05 16.20.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/65968/da6f10eb-93a6-365b-5789-9c327611cf5a.png">

この辺は他にもたくさん情報あるのでここでは割愛します。
ここではfunction名を``slack_overtime``として作成しました。

# CloudWatchの設定

## CloudWatchのルールを追加します
ルールからCreate ruleを押下します。
<img width="73" alt="スクリーンショット 2016-08-05 16.38.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/65968/4537c484-fbfc-075f-c311-1fbff77a8bc4.png">

<img width="115" alt="スクリーンショット 2016-08-05 16.39.27.png" src="https://qiita-image-store.s3.amazonaws.com/0/65968/9887b6ef-3230-2095-d559-c7555dc71e8a.png">

左側の``Event selector``はスケジュールを選択します。
``Cron expression``で定期実行する設定を入れます。

今回の場合は月曜日から火曜日の19時に実行したいので

```
0 10 ? * MON-FRI *
```
としました。

0 10となっているのは、LambdaのCronはUTCに基いて実行される為です。

右側のTargetsには先程作成した``slack_overtime``のfunctionを指定します。

**入力するとこういう感じになっていると思います**

<img width="1040" alt="スクリーンショット 2016-08-05 16.44.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/65968/a1b8ca8f-da5a-65e6-acfc-dc8cefd721be.png">

ここまで入力したら詳細の設定ボタンを押します。
<img width="108" alt="スクリーンショット 2016-08-05 16.52.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/65968/b2166c40-0a41-f2f3-c729-b4c267095af3.png">

## 詳細情報の入力
名前と、説明、ステータスを設定するのでこんな感じにします

<img width="522" alt="スクリーンショット 2016-08-05 16.53.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/65968/3ab41489-187b-8dcc-37b6-617e7002e9f5.png">

入力したらルールの作成で作成します。

<img width="121" alt="スクリーンショット 2016-08-05 16.55.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/65968/a079f6d0-ff15-0bd1-3b3f-66618af0a373.png">


# LambdaのTriggersの確認
先ほどLambdaで作成した``slack_overtime``functionに戻ります。
Triggersのタブを見てみると、先ほどCloudWatchで設定したCronが有効になっているはずです。

これで平日19時に動くようになりました。

<img width="698" alt="スクリーンショット 2016-08-05 16.58.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/65968/fe216f9d-8125-f4c4-3e5c-0707c0ea5114.png">

# SlackのWebHooks設定
SlackのWebHooksについては他にも色々と説明しているところがあるのでそちらを参照してください。

以下、WebHooksの項目ざっくり説明

* ``Post to Channel``に通知したいチャンネルを設定
* ``Webhook URL``後述のNode.jsのコードにこのURLを埋め込みます
* ``Customize Name`` ここに通知をくれる名前を入れます。
* ``Customize Icon`` 通知をくれるアイコンです。

**ここまで設定すると最下部でこんな感じになってると思います。**

<img width="932" alt="スクリーンショット 2016-08-08 10.33.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/65968/22dea7f8-ae44-b374-5a32-a24f60accb82.png">

設定したらWebHooksの設定は完了です。

# Slackに通知するコード

## 必要なパッケージのインストール
今回、requestが必要なので
https://www.npmjs.com/package/request

```
npm install request
```

でインストールしてください。

## node.jsのコード
ここからはLambdaで動作させる為のコードを書いていきます。
WebHookのURLのみ変えれば動くはずです。
あとは、適宜メッセージとか変えて使ってみてください。

ファイルは
``index.js``
として作成してください。

```index.js
const request = require('request');

exports.handler = function(event, context) {

  // 本文の成形
  var message = '@channel:' + "\n";
  message += '*' + 'もう19時になっちゃったじゃない:lips:' + '*' + "\n";
  message += '*' + '残業はモテないし早く仕事終わらせて飲みましょーよ:hearts:' + '*';

  // WebHookのURLをここに入れます
  var slackWebhookUrl = 'https://hooks.slack.com/services/......';

  // リクエスト設定
  const options = {
    url: slackWebhookUrl,
    headers: {
      'Content-type': 'application/json'
    },
    body: {
      "text": message
    },
    json: true
  };

  // メッセージ送信
  request.post(options, function(error, response, body) {
    if (!error && response.statusCode == 200) {
      context.done(null, body);
    } else {
      console.log('error: ' + response.statusCode);
      context.done(null, 'error');
    }
  });
}

```

## ファイル構成の確認
ここまでやると以下のようなファイル構成になっていると思います。

<img width="147" alt="スクリーンショット 2016-08-08 16.32.21.png" src="https://qiita-image-store.s3.amazonaws.com/0/65968/8c72c347-713b-a3ad-593c-7cf12cb6978f.png">

### アーカイブ
Lambdaにアップロードする為にファイルを圧縮します。
``index.js``と``node_modules``を選択して``.zip``で圧縮します。

## Lambdaにアップロード
AWSにログインして、Lambdaのサービスに移動して、作成してあるfunctionに移動して、Uploadボタンから作成済の``index.js``と``node_modules``が圧縮された``.zip``のファイルをアップロードします。

<img width="452" alt="スクリーンショット 2016-08-08 16.35.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/65968/fcafceb4-8046-e343-59ca-e2e0677b756e.png">

### SaveかSave and test で保存しましょう。

<img width="204" alt="スクリーンショット 2016-08-08 16.38.17.png" src="https://qiita-image-store.s3.amazonaws.com/0/65968/ad2aa8b4-34aa-91e3-1d87-53b6791cda2d.png">

エラーが無ければ保存か、保存後にテストが走って完了です。

ここまで出来たらあとは設定した時間を待つのみです！

# おわりに
「ITは帰りが遅い」「エンジニアは帰りが遅い」みたいないつの日からか出来た固定概念を無くしたいですよね。早く帰る意識を持つのが一番大事ですが、仕組みがあるとより早く帰りやすいと思って作りました。

``npm install``したり、コードのコピペが面倒でしたらGithubに一式アップしたので良かったらご利用ください。
https://github.com/s-noguchi/slack_notification_lambda

早く帰れるエンジニアが増えることを心より願っております。