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

はじめに

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

まずは単純にSlackへのpostを成功させる

slack chat.postMessage API がスタンダードなメッセージをPOST するAPIがあると思いますが、帯をつけたメッセージにしたいなと思う時、attachementが使えます。

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

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 かけないとだめのようです。
ちゃんとドキュメントにもかいてありますね。
そのほかのパラメータについては公式ドキュメント を参照してください。

今回はおべんと注文サイトのおべんとねっとさんへタイトルを押したら遷移できるようにしています。

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

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

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

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


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

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

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

最後にLambdaの起動トリガーをCloudWacth Events のスケジュールにする

あとは、CloudWatchEvents を使って、定刻に呼び出すようにしていきます。

lambda.png

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

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

最後に

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

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

参考