AWS Lambdaを使ってSlack botを作る方法 

# はじめに
AWS Lambdaを使って、簡単にSlack botを作られる方法をご紹介します。
- お昼ご飯を選ぶBot (ランダム)
![random.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2531401/3b9bb9c9-97e5-e058-af45-afecbaa7d2df.png)
- 当番ローテーションBot (シーケンシャル) 
![sequence.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2531401/cb62cab4-50d9-2dd6-a6e9-fc64f7d03f8e.png)
# 前提
以下はすでに準備されている前提となります。
- AWSアカウント
# 手順
# 1. Slack
## 1.1 Slack App 作成
https://api.slack.com/

Slack APIからアプリを作ります。
![nagare1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2531401/99b2f350-761d-1d5e-74e4-a71f523fa158.png)
![nagare 2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2531401/1b0aa43a-c418-ccdf-f46a-d25846cf29d3.png)
![nagare 3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2531401/5562e8c1-d74d-5da0-cb25-6231fd515364.png)
作成したアプリは後でも、名前、画像など修正ができます。
## 1.2 Slack アプリ パーミッション追加
上記で追加したアプリを使って、Slackチャンネルに飛べるようにパーミッションを与えます。
![nagare 4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2531401/93a902c9-68fa-7525-78ca-7480b650cb59.png)
![nagare 5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2531401/144aa68d-c0d8-84ea-47d6-ebb8b32dffe7.png)
![nagare 7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2531401/9f68256b-cbfc-a050-a1d8-3f3e6babd780.png)
![nagare 8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2531401/cebfca94-53ff-6d26-ffa0-0ff0b19cd1eb.png)
![nagare 9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2531401/51e968b8-59b2-d426-e40d-c78c60baa9a6.png)
![nagare 10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2531401/8225b5e9-704e-c473-781f-98c39ed959ae.png)
![nagare 11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2531401/6d5410ee-20f5-bb81-7664-a61c1eba8df6.png)
![nagare 12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2531401/fb820945-295f-b42f-242b-26c2a0e9dac4.png)
Slackチャンネルに作成したアプリ(bot)が追加されました。
# 2. AWS Lambda
## 2.1 AWS Console
AWSにログインして、`Lambda関数`を作成します。
今回は`Python`コードを使うので、`Python`を選びます。
![nagare 13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2531401/3906c04a-d039-82c6-6ed8-9e65b52b0cf3.png)
![nagare 14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2531401/175910c2-69b3-d238-fd81-4d7bd2229cf7.png)
## 2.2 Git hub（ソースをダウンロード)
https://github.com/momotonton/slack-lambdabot

上記の`github`でコードファイルをダウンロードします。
![nagare 15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2531401/7ea643e1-d64b-e61c-a9aa-206bdf08064d.png)
![nagare 16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2531401/4fe95314-e373-1c5f-8703-8f9fe8caffdd.png)
`Lambda`にダウンロードしたzipファイルをアップロードします。
![nagare 17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2531401/8826da16-ee1c-6c70-cc0e-c6bb0a04f60a.png)
上記のようにファイルがアップされます。
## 2.3 お昼ご飯Bot(Random Bot)作成
![nagare 17.5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2531401/95b81e69-c86b-0edc-f03c-f5890171c087.png)
`slack-lambdabot-main`(上記でダウンロードしたzipファイル)を中身にある、
`slack` `slack_sdk`  `lambda-random.py`を`lambda-test`(最上位ディレクトリ)にドラッグ&ドロップします。
![nagare 18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2531401/8aee8040-ebdd-807d-e84d-df545858f26e.png)
`lambda-random.py`ファイルの名前を変更します。
(```lambda-sequence.py```は下記の手順で使いますので、残しておきます)
### 2.3.1 環境変数設定
コードを利用するため、環境変数を追加します。
![nagare 19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2531401/22238505-f292-e2ec-01ef-0f40a652deac.png)
![nagare 20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2531401/36216981-f17d-0e6b-8815-558cd56b5f6d.png)
Slack Apiの```Bot User OAuth Token```をコピーします。
![nagare 21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2531401/80bd3c9f-7a54-58b4-0951-fea9d4321120.png)
Slack チャンネルから```チャンネルID```をコビーします。
![nagare 22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2531401/4f4551ba-1417-0469-a79a-be42ba1e4583.png)
![nagare 23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2531401/38148c0b-1cc4-a5e3-eebb-a888e773ce54.png)
上記のように環境変数の編集をクリックして、```キー```と、```値```を入力します。
```LUNCH```の```値```は```,```で```値```を認識します。
![nagare 24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2531401/682c630c-18fd-cc60-bf03-28bc596460fa.png)
コーピタブーでコードを```Deploy```して、テストをしてみます。
![nagare 25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2531401/041f5918-d422-17ae-5670-90862b7c50ea.png)
上記のようにランダムで```値```に入力した、```Lunchメニュー```が飛んでくると、成功です。
## 2.4 当番ローテーションBot 
```
def lambda_handler(event, context):
    
    from os import environ
    from slack_sdk import WebClient
    from slack_sdk.errors import SlackApiError
    from datetime import datetime

    client = WebClient(token=environ['SLACK_TOKEN'])
    touban_list = ["オンジョ","チョンサン","ナムラ","スヒョク","グィナム"]
    today = datetime.now() 
    start_day = datetime(2022,3,13)
    try:
        response = client.chat_postMessage(
            channel=environ['SLACK_CHANNEL'],
            text=f"今日の当番は{(touban_list[ (today-start_day).days % len(touban_list) ])}さんです")
        print(response)
    except SlackApiError as e:
        # You will get a SlackApiError if "ok" is False
        assert e.response["error"]    # str like 'invalid_auth', 'channel_not_found'
    return 0
```
`touban_list`に当番を方の名前を、`start_day`の`datetime`を当番が始まる日に変更すると当番を特定な時間に飛べるようにできます。
![nagare 26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2531401/223dab5a-4288-d87b-0a57-1f87189259c0.png)
`lambda_random`の代わりに`lambda_sequence`を`lambda-test`にドラッグ&ドロップして、先と同じように名前も`lambda_function`に変更します。
![nagare 27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2531401/08a747f1-a43a-8902-e3bc-b448ffb1e334.png)
修正しましたら、コードをDeployして、テストしてみます。
![nagare 28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2531401/5e5daba9-6301-817d-658c-9b1141003f9f.png)
当番の方の名前が飛んでくると、成功です。
## 2.5 トリガーを追加
上記で作成した、アプリをアラートを欲しい時間に飛んで来れるように設定します。
![nagare 29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2531401/ceab9ccc-01f6-6347-3fc8-195adac15290.png)
トリガーを追加をクリックして、EventBridgeを追加します。
![nagare 30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2531401/cb84d002-f248-4dac-c7ab-418e43eb6f29.png)
今回は毎週月曜日から金曜日まで午前10時にトリガーを設定します。
https://docs.aws.amazon.com/ja_jp/eventbridge/latest/userguide/eb-create-rule-schedule.html
Cron式の設定は上記のURLをから確認できます。
 *AWSはUTC時間を使用しているため、JST(UTC時間+9)に変更する必要があります。
## 2.6 設定完了
![nagare 31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2531401/b1f9ab9a-a961-4ac3-c605-1ce113194b51.png)
設定済みになります。
# まとめ
AWS LambdaでSlack Botを簡単に作ってみました。
テストを書く際は`lambda-random.py` `lambda-sequence.py`を編集して、ご利用ください。
# 参考
https://aws.amazon.com/jp/lambda/
https://slack.dev/python-slack-sdk/