lambda（Node.js）からSlackにメッセージを送ってSlackアプリに発言してもらう

# 概要

- lambdaからSlackアプリのWebhook URLにリクエストを投げて紐付いているSlackアプリに発言してもらう方法を簡単にまとめる。

# 前提

- 下記の内容、もしくはそれに準ずる方法が実施され、Slackに独自のアプリ作成とWebhook URLが分かっていること。

https://qiita.com/miriwo/items/cbb4b37b3f5abecc835f

- lambda関数を作成するAWSユーザーはIAMロールを作成する権限を保有していること。
- ローカルPCでNode.js 18.xがインストールされ、npmコマンドが実行できる状態になっていること。

# 注意

- AWSを使うため料金が発生する可能性があります。高額請求にはくれぐれもご注意ください。

# 方法

1. ローカルPCの任意のディレクトリに「nodejs」ディレクトリを作成する。
1. nodejsディレクトリで下記コマンドを実行しNode.jsのバージョンが18.xになっていることを確認する。

    ```
    node -v
    ```

1. nodejsディレクトリに移動し、下記コマンドを実行する。（package nameなどを聞かれるがEnter連打でOK）

    ```
    npm init
    ```

1. nodejsディレクトリで下記コマンドを実行してnpmでaxiosをインストールする。

    ```
    npm install axios
    ```

1. nodejsディレクトリの一つ上のディレクトリに移動し、下記コマンドを実行しnodejsディレクトリをzip化する。

    ```
    cd ../
    zip -r ./nodejs.zip ./nodejs
    ```

1. AWSのコンソールにログインする。
1. lambdaのホームに遷移する。
1. 左サイドバーの「その他のリソース」の中の「レイヤー」をクリックする。
1. 「レイヤーの作成」をクリックする。
1. 下記の様に設定を行う。（特段記載されていないものはデフォルト状態）

    | 項目 | 内容 | 備考 |
    | --- | --- | --- |
    | 名前 | send_message_layer |  |
    | アップロード種別 | .zipファイルをアップロード |  |
    | アップロード | 先に作成したnodejs.zipを選択してアップロード | ファイル名が「nodejs.zip」でないと正しく動作しなかった記憶がある。 |
    | 互換性のあるアーキテクチャ | x86_64 |  |
    | 互換性のあるランタイム | Node.js 18.x |  |

1. 上記の様に設定ができたら「作成」をクリックする。
1. 「関数の作成」をクリックする。
1. 下記の様に設定を行う。（特段記載されていないものはデフォルト状態）

    | 項目 | 内容 | 備考 |
    | --- | --- | --- |
    | 関数種別 | 一から作成 |  |
    | 関数名 | send_message | 任意でOK |
    | ランタイム | Node.js 18.x |  |
    | アーキテクチャ | x86_64 |  |
    | 実行ロール | 基本的なLambdaアクセス権限で新しいロールを作成 |  |

1. 上記の様に設定ができたら「関数の作成」をクリックする。
1. 当該関数の「コード」のタブの最下部の「レイヤー」のフィールドで「レイヤーの追加」をクリックする。

    ![send_message_-_Lambda.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/a5375e9c-e696-02d4-f416-cc540cde86d7.png)

    ![send_message_-_Lambda.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/0150aeb6-4881-791b-0c41-d69451b0cd3e.png)

1. 「カスタムレイヤー」を選択し、プルダウンから「send_message_layer」を選択、「バージョン」は1を選択、し「追加」をクリックする。

    ![レイヤーを追加_-_Lambda.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/3ce139e4-0a79-beca-fcbd-4c6d212143d0.png)

1. 下記のコードをそのまま貼り付け、保存（cmd + s） → Deployをクリックする。（SlackのWebhook URLだけご自身のものに変更いただきたい。）

    ```
    import axios from 'axios';
    
    export const handler = async(event) => {
    
        const slackUrl = 'Slack Webhook URL';
    
        const data = {
            text: 'Hello, World for lambda!'
        };
    
        const config = {
            headers: {
                'Content-Type': 'application/json'
            }
        };
    
        const response = await axios.post(slackUrl, data, config)
            .then((response) => {
                console.log(response.data);
            })
            .catch((error) => {
                console.error(error);
            });
        
        return response;
    };

    ```

1. テストのタブをクリックし、下記の様に設定を行う（特段記載されていないものはデフォルト状態）

    | 項目 | 内容 | 備考 |
    | --- | --- | --- |
    | イベント名 | hello-world-test |  |
    | イベント共有の設定 | プライベート |  |
    | テンプレート | hello-world |  |

1. 上記の様に設定ができたら「保存」をクリックする。
1. 　保存できたら「テスト」をクリックする。
1. 　Slackに「Hello, World for lambda!」の文字が出力されたら完了である。
1. 　あとはよしなに当該lambda関数のトリガーを設定知れあげれば良い。

# 参考文献

https://qiita.com/miriwo/items/d132b1f8ead3677ecc0c

https://qiita.com/miriwo/items/487da5cba9a4afc27e18