1. tottu22

    No comment

    tottu22
Changes in body
Source | HTML | Preview
@@ -1,134 +1,137 @@
# はじめに
お昼にお弁当の注文を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 を設定する
続いて毎朝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
+# 最後に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 *
```
毎週月曜から金曜の10時の場合なので上記のように設定しました。
これでEC2など立ち上げることなく、定刻になったら指定したslackチャネルに
通知が来るようになります。
お弁当の注文しわすれがなくなりますね!
#参考
- [【AWS】Lambdaでpipしたいと思ったときにすべきこと](https://qiita.com/Hironsan/items/0eb5578f3321c72637b4)
- [ 練習を兼ねてAWS LambdaからSlackにPOSTするプログラムを組んだ](https://geeknavi.net/aws/auto-post-to-slack)