SlackBOTからAWS Lamdbaを動かし、Slackに通知する(NodeJS)

# この記事でできること
![chat2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2510991/04a6d50e-17b0-4eef-3cf1-d83823301863.gif)
画像の通り、BOTにメンションを送るとSlackに通知が飛んできます

# 事前準備
AWSのアカウントを用意してください
Slackのアカウントがあり、appsにアクセスできる状態にしておいてください

# BOTの作成
- SlackApiのAppsにアクセスします
SlackApi
https://api.slack.com/apps/
<img width=25% src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2510991/4d1c8780-f891-7351-57ac-679aed3aa9dc.png">

- CreateNewAppから新規アプリを作成します
<img width=25% src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2510991/756d8d06-ce7c-2b27-6616-34ac55d38330.png">

    - App名
    わかりやすいもの(今回はSlackに通知するのでSlack-Post)
    - インストールするワークスペース
    そのBOTを使いたいワークスペースを選択

- OAuth & Permissions > ScopesからBOTの権限を追加
<img width=25% src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2510991/54f507e4-1b9c-d1ee-9997-5954c7ab78e5.png">

    - app_mentions:read
    BOTがメンションを受け取る事ができるようになる
    - chat:write
    Slackに書き込む事ができるようになる

- OAuth & Permissions > OAuth Tokens for Your Workspace > Bot User OAuth Tokenをメモっておく
<img width=25% src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2510991/55ac6fd6-52ec-5ed4-fe9d-6c8c497c933f.png">

- Slackにインストールする
<img width=25% src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2510991/88d7184e-ddb0-3658-6627-576be7367da2.png">

これでSlack側にBOTが登録されました
一旦、Slack側の準備はこれで置いておきます

次はAWS Lambda側に移ります

# 関数(Lamdba Function)の作成
- 検索バーからLambdaを検索し、選択します
<img width=25% src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2510991/b6d28bb2-a7c2-418a-64d7-4f7f7ed6d8a2.png">

- 左のメニュー > 関数 > 関数の作成を選択します
<img width=25% src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2510991/8bb2cbd4-d720-be50-bc29-1018288f72c7.png">

- 以下を設定し、関数の作成をします
    - 関数名
    今回はNodeJSでBOTを動かし、Slackから通知を送るのでSlack-Post-NodeJS
    - ランタイム
    Node.js 18.x
<img width=25% src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2510991/f9d69c64-e562-3c68-83f4-1cf28276b496.png">

以下のように作成できればOK
<img width=25% src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2510991/0a28cae7-de14-4775-7443-c66a2dba69f0.png">

- 作成後、設定 > 関数URL > 関数URLの作成を選択
API GateWayは使わないやり方でやりたいので関数URLの作成をします
<img width=25% src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2510991/80ac8e23-c80b-458a-533f-6ad46f222a62.png">

- 以下を設定し、関数URLの作成をします
<img width=25% src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2510991/0ea59960-5af0-5e7a-1ba1-2550177c6618.png">

認証タイプ
NONE
公開ヘッダー
date, keep-alive
許可ヘッダー
date, keep-alive
許可メソッド
\*
最大経過時間
86400
許可認証情報
チェック

- 関数URLが作られたのでメモっておきます
<img width=25% src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2510991/11b14454-aea1-cf03-7b5c-846c76d8626c.png">

次はLambdaに配置するファイルを準備します

# スクリプトの準備

- SlackAPIに必要なパッケージをインストール
@slack/web-api
```bash
$ cd [作業するディレクトリ]
$ npm init
$ npm i @slack/web-api
```

- index.jsを作り、以下の用に記載


```typescript
const { WebClient } = require('@slack/web-api');
exports.handler = async (event) => {

    const body = JSON.parse(event.body);
    // BOTの認証用、認証後は削除してもOK
    if (body.challenge) {
      return {
        statusCode: 200,
        body: {
          challenge: body.challenge
        }
      }
    }

    // Slackからの通知の再送対策
    if (event.headers.hasOwnProperty("x-slack-retry-num")) {
      return {
        statusCode: 200
      }
    }
    
    const client = new WebClient(process.env.SLACK_BOT_USER_ACCESS_TOKEN);
    const channel = body.event.channel;
    const text = "TEST";
    await client.chat.postMessage({ channel, text });

    return {
      statusCode: 200,
    }
};
```

- Lamdbaにアップロードする為にzip化します
```bash
$ zip -r lambda.zip ./index.js ./node_modules/
```

以下のような構成になったと思います
<img width=25% src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2510991/440b85f3-f4b2-85f5-8ed3-d5cbec8e4d16.png">

コードの準備はこれで完了です
Lamdba側に戻ります

# Lamdbaにスクリプトの配置

- Lamdbaの関数 > コードからzipをアップロードする
<img width=25% src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2510991/96d0b099-31f7-0a97-c0f6-876345cec5b8.png">

配置できればコード側は完了です
<img width=25% src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2510991/d0b320c3-7623-7074-7ef6-c224d3a380a6.png">

- 環境変数の設定
設定 > 環境変数からコードで使っているSLACK_BOT_USER_ACCESS_TOKENを追加します
<img width=25% src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2510991/1a146aa5-12c9-acb2-2b24-0c3d60c4feaa.png">

Lamdba側の設定は完了です
最後にSlack側の設定です

# SlackBOTとLamdbaの疎通設定

- Event Subscriptions > Enable Events をOnにし、Request URLの欄にLamdbaで設定した関数URLを張り付け認証します
<img width=25% src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2510991/55d3a8bf-2605-84e1-2d69-0978a44d8934.png">

先程index.jsに記載した、
```typescript
    if (body.challenge) {
      return {
        statusCode: 200,
        body: {
          challenge: body.challenge
        }
      }
    }
```
こちらが認証用処理となり、認証できたら削除しても大丈夫です

- Subscribe to bot eventsにapp mentionを追加
<img width=25% src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2510991/2f767d8b-1368-1293-ac7b-29fe8a003f80.png">

設定後、フッターからSaveChangeを押して保存

- SlackでBOTを呼び出し、メンションを送ってみる
<img width=25% src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2510991/4bfd286d-6b9f-655a-8d9b-c2408de5d21e.png">

BOTを通してLamdbaからSlackに通知できました！お疲れ様でした

次回はこの通知とChatGPTを使った応用例を書いていきます