お弁当の注文忘れ防止のため、定刻にslackにメッセージをAWS lambdaを使って送ってみた　

# はじめに
お昼にお弁当の注文をWebでいつもしているのですが、よく忘れます。
そこでslackに毎朝通知が来るようにすれば忘れ防止になると思い、試していたらハマった箇所があったのでメモです。

# まずは単純にSlackへのpostを成功させる
slack chat.postMessage API がスタンダードなメッセージをPOST するAPIがあると思いますが、帯をつけたメッセージにしたいなと思う時、attachementが使えます。

python のrequests モジュールを使ってattachmentを定義する際、少しハマりました。

```py3
import json
import requests

SLACK_TOKEN = YourToken
SLACK_CHANNEL = YourChannelId


res = requests.post(url='https://slack.com/api/chat.postMessage', data={
    'token': SLACK_TOKEN,
    'channel': SLACK_CHANNEL,
    'as_user':'true',
    "attachments": json.dumps([
        {
            "title": "おべんとねっと",
            "title_link": "https://www.obentonet.jp/login.html",
            "text": "今日の注文はお済みですか？まだの方はお忘れなく",
            "image_url": "https://pbs.twimg.com/profile_images/918467156697694209/7Za_rDKG.jpg",
            "color": "#36a64f",
            "footer": "XXXX"
        }
    ])
}).json()
print(res)
```

**attachments はJson.dumps かけないとだめのようです。**
ちゃんとドキュメントにもかいてありますね。
そのほかのパラメータについては[公式ドキュメント](https://api.slack.com/methods/chat.postMessage) を参照してください。

今回はおべんと注文サイトの[おべんとねっと](https://www.obentonet.jp/login.html)さんへタイトルを押したら遷移できるようにしています。

# 次に定刻でPythonコードが実行されるようにAWS Lambda を設定する

続いて毎朝１０時になったらpostをするというのをAWS Lambdaを使って実装します。
Lambda では5,6行目の TOKEN、ACCESS_CHANNELのようなキー情報は、lambdaのソースコードには直接書かずに環境変数に書き出すことができます。
※ただし、今回はモジュールのインストールが必要になることからやめました。


lambda_handler の中身はほぼそのままで、
以下のようなソースになります。
これをそのままAWS コンソールで使おうと思っても使えません。

<font color="DeepSkyBlue">requestsモジュールはlambdaでは標準インストールされておらず、</font>
こういった場合は、pip installをlambda上でしなくなるところですができません。
ローカルでファイルを作成して、それをzip圧縮してアップロードをしなければなりません。

```py3

def lambda_handler(event, context):
    # TODO implement
    import json
    import requests

    SLACK_TOKEN=YourToken
    SLACK_CHANNEL=YourChannelId
    
    res = requests.post(url='https://slack.com/api/chat.postMessage', data={
        'token': SLACK_TOKEN,
        'channel': SLACK_CHANNEL,
        'as_user':'true',
        "attachments": json.dumps([
            {
                "title": "おべんとねっと",
                "title_link": "https://www.obentonet.jp/login.html",
                "text": "今日の注文はお済みですか？まだの方はお忘れなくー",
                "image_url": "https://pbs.twimg.com/profile_images/918467156697694209/7Za_rDKG.jpg",
                "color": "#36a64f",
                "footer": "XXXX"
            }
        ])
    }).json()
    
    return res
```
**関数の名前はlumbda_handlerでないとだめなので注意してください。**
上記ファイルをローカルに作った任意のフォルダに格納して、
そのフォルダまで移動した状態で、

```
$ pip install requests -t .
```

を行います。カレントディレクトリにライブラリをインストールすることができます。



lambdaのアップロードにはzipファイルにする必要があるため、

```
$ zip -r upload.zip *
```
ディレクトリの中身丸ごと圧縮してくれます。

その後、コードエントリタイプからzipファイルをアップロードを選択して、
![lambdaupload.png](https://qiita-image-store.s3.amazonaws.com/0/137532/274e0ea5-65ab-4882-4917-343e6c7900c3.png)

**uploadでlambda関数を作る場合、環境変数の外だし定義は使えないようで、
ローカルで作るファイルに直に必要があります。**


まずはこの状態で問題なくlambda が動作するのか確認しておいたほうがよいです。
右上のテストボタンを押して、エラーなく正常終了して、slack に通知が飛べばOK

# 最後にLambdaの起動トリガーをCloudWacth Events のスケジュールにする
あとは、CloudWatchEvents を使って、定刻に呼び出すようにしていきます。

![lambda.png](https://qiita-image-store.s3.amazonaws.com/0/137532/104ed7c4-f422-451b-277a-db60653dcb2c.png)

ルールを新規作成して、
スケジュールで実行を選んで、Cron式を任意の時間に設定します。

Cron式：`0 1 ? * MON-FRI *`
毎週月曜から金曜の１０時の場合だと上記のように設定になります。

# 最後に
これでEC2など立ち上げることなく、定刻になったら指定したslackチャネルに
通知が来るようになります。

お弁当の注文しわすれがなくなりますね！

#参考
- [【AWS】Lambdaでpipしたいと思ったときにすべきこと](https://qiita.com/Hironsan/items/0eb5578f3321c72637b4)

- [ 練習を兼ねてAWS LambdaからSlackにPOSTするプログラムを組んだ](https://geeknavi.net/aws/auto-post-to-slack)