1. tottu22

    Posted

    tottu22
Changes in title
+お弁当の注文忘れ防止のため、定刻にslackにメッセージをAWS lambdaを使って送ってみた 
Changes in tags
Changes in body
Source | HTML | Preview
@@ -0,0 +1,128 @@
+# はじめに
+お昼にお弁当の注文をWebでいつもしているのですが、よく忘れます。
+そこでslackに毎朝通知が来るようにすれば、忘れ防止になると思い試していたらハマった箇所があったのでメモです。
+
+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://www.obentonet.jp/login.html)さんへタイトルを押したら遷移できるようにしています。
+
+毎朝10時になったらpostをするというのをAWS Lambdaを使って実装しました。
+Lambda では5,6行目の TOKEN、ACCESS_CHANNELのようなキー情報は、lambdaのソースコードには直接書かずに環境変数に書き出すことができます。
+ただし、今回はモジュールのインストールが必要になることからやめました。
+
+
+lambda_handler の中身はほぼそのままで、
+以下のようなソースになります。
+これをそのままAWS コンソールで使おうと思っても使えません。
+
+requestsモジュールはlambdaでは標準インストールされておらず、
+こういった場合は、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
+
+あとは、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)