AWS IoT CoreとAWS Lambdaを連携して温度データをslackに送信する

# はじめに
> raspberryPiで温度センサーのデータをAWS IoT Coreで受信してlambdaと連携しslackに送信する所までやってみようと思います。

AWS IoT Coreの作り方などは、前の記事で書いています.

- [AWS IoT Coreを使ってみた](https://qiita.com/arakirai1128/items/8d2b790d10d3b1b1ee32)


# 開発構成
- 構成イメージとしては、こんな感じです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533263/39185cbf-8f4a-7e28-ec75-7765af1c3aa3.png)



# 検証環境

- raspberryPi3B+
- 温湿度センサー(DHT22)
- AWS IoT Core
- AWS Lambda

# 前提
- デバイスから送られてくるデータをAWS IoT Coreで受信出来ていること

# Lambdaの作成

1) マネージメントコンソールにログインしてLambdaサービスを開き、「**関数**」→ 「**関数の作成**」をクリックします

[マネージメントコンソール](https://aws.amazon.com/jp/console/)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533263/7245a869-9a31-5084-9cc8-db0b7f137a64.png)

2) lambda作成に必要な項目を入力して「**関数の作成**」をクリックします

- オプション：**一から作成**
- 関数名：**任意の名前**
- ランタイム：**今回は、node.js 14x**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533263/817a8f09-b090-9a3e-81f5-89924b6ac606.png)

3) 「**関数の概要**」をクリックして「**トリガーを追加**」をクリックします

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533263/1e675b2a-48ff-f470-8d92-06dcba4b0e6a.png)

4) トリガーの追加で「**AWS IoT**」を追加します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533263/304a62e2-6e39-d820-7b90-fc08fd7a710c.png)

5) トリガーの設定で必要な項目を入力して「**追加**」をクリックします

- IoTタイプ：**カスタムIoTルール**
- ルール：**新規ルールの作成**
- ルール名：**任意の名前**
- ルールクエリステートメント：**SELECT * FROM 'iot/topic'**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533263/10fbad64-6aed-1877-fbc0-9af027c20e54.png)

- これでIoT Coreとlambdaの紐づけることができました。
  - IoT Coreサービスを開いてルールに作成したルールが作成されている事が確認できます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533263/eeaa744f-434e-ba8c-2dca-01c457083d1f.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533263/75f93886-0a20-8449-d55d-978dd71450b0.png)

# slack webhook作成

6) slackを開き「**slackをブラウズする**」→ 「App」をクリックする

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533263/362aaa10-060e-0de9-9da8-cf529d431892.png)

7) 検索欄に「**Incoming Webhook**」で検索して**Incoming Webhook**を追加します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533263/5a6f65d7-af50-e57a-0736-828f26bfc759.png)

8) ブラウザーが立ち上がるので、「**追加**」をクリックします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533263/06f49a02-f6e2-23ad-c118-a9631b39508c.png)

9) 「**チャンネルへの投稿**」で**#general**を選択します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533263/9b59aeba-95f7-71b7-d1b5-2b4c25e48d5e.png)

10) 「**Incoming Webhook インテグレーションの追加**」をクリックします

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533263/394183ec-dfe9-ef07-4b4a-b7b8bd05b137.png)

11) 「**Webhook URL**」をコピーしておきます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533263/a51305fa-0f99-6c17-b808-398f992a6f03.png)


# プログラム開発

12) フォルダーを作成します

```
$ mkdir slack
```

13) プロジェクトを作成します

```command
$ cd slack
$ npm init -y
$ npm install
```

14) モジュールのインストール

```command
$ npm install --save-dev @slack/webhook
```

15) ファイルを作成します

```
MACの場合
$ touch index.js

Windowsの場合
$ type nul > index.js
```

16) index.jsファイルに以下のソースをペーストしてください

```index.js
const { IncomingWebhook } = require('@slack/webhook');


exports.handler = async (event) => {

    const Channel = '#general';

    const hostName = event.deviceid;

    const text = `温度: ${event.temp} 湿度: ${event.humid}`;
    
    const webhook = new IncomingWebhook('-- web hook URL --');  //WebHook URLをペーストしてください
    
    const res = await webhook.send({
      text: text, //通知内容
      channel: Channel, //通知先チャンネル
      username: hostName, //通知時ユーザー名
      icon_emoji: ":ghost:", //アイコン絵文字
    });

    return res;
};

```

17) 作成したプロジェクトをzipにして圧縮します

```
# 完成フォルダー
slack.zip
```

18) lambdaを開き「**アップロード元**」をクリックして先ほど、zipフォルダーをアップロードします

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533263/2046513d-dc5c-e1f0-b948-7b4a2025c996.png)


19) 「**Deploy**」をクリックします

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533263/cce334fe-889c-f99c-8b23-0de3818a5d0f.png)

# 動作テスト

20) 実際にraspberryPiからデータをIoT Coreに送ってlambdaが正常に動作するか確認します。

#### raspberryPi側

```
pi@raspberrypi:~/sensor_aws $ node main.js 
connect
published message for 1 time
published message for 2 time
published message for 3 time
published message for 4 time
published message for 5 time


```

- Lambda実行によりセンサーのデータがslackに送信されている事が確認できました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533263/0dff99c3-b3ed-5b09-b9c9-82cea7a71387.png)

# まとめ
lambdaを使ってみましたが、使いやすくて他のAWSサービスとの連携もしやすいなと感じました。
今回は、IoT Coreとlambdaを連携してみましたが、他のサービスとも連携させてみたいと思います。