LINEとAWS lambda + IoT Coreでラズパイを制御する

今回の記事はAWS lambda + IoT Coreを連携させ、
LINEでRaspberryPi(ラズパイ)を制御するための環境構築方法について

やりたいことはざっと、以下の図のイメージ

構成図

AWS IoT Coreとラズパイの連携については以下の記事で事前に準備ください。

目次

AWS Lambda環境

まずは、lambdaの環境を構築します。lambdaの関数を新規作成します。

lambda関数作成

関数名: 任意
ランタイム: Pythonであればバージョンは任意
実行ロール: 新しいロールを作成

AWS Lambda関数作成

Lambda関数の作成とともに新規でロールが作成されます。
このロールに対してポリシーをアタッチしていきましょう。

lambdaのロールへポリシーをアタッチ

ポリシーアタッチの前にまずは、AWS IAMからポリシーを作成します。

AWS IAMポリシー作成

JSONタブに以下のJSONを貼り、次へ進みます
(lambdaからIoT CoreへのPublishを許可するためのポリシーです)

{
    "Version": "2012-10-17",
    "Statement": {
        "Effect": "Allow",
        "Action": "iot:Publish",
        "Resource": "*"
    }
}
AWS IAMポリシー作成 JSON

タグの作成は任意です。必要なければ次へ進みます

ポリシー名は任意で構いません。後ほどこのポリシーにlambdaをアタッチします。

AWS IAMポリシー作成 ポリシー名

ポリシーの作成が終わったら、先程Lambda関数を作成した際に生成されたロールをポリシーにアタッチしていきましょう。

AWS IAMポリシー作成 アタッチ
AWS IAMポリシー作成 lambdaロールアタッチ

ロール名は自動作成のため、図と異なりますが、先程lambda関数を作成した際に生成されたロールをアタッチすればOKです。

以上で、Lambda関数からIoTCoreへのPublish許可を設定できました。
次は実際のlambdaの処理を書いていきます。

lambda関数の処理

今回はLINEを受信した際にAWS IoT Coreへ送信(Publish)するためのコードを書きました。

import json
import os
import urllib.request
import boto3

# LINEのチャンネルトークンは環境変数に設定しておく
LINE_CHANNEL_ACCESS_TOKEN   = os.environ['ChannelAccessToken']

# LINEの応答用のheaderを作成
REQUEST_URL = 'https://api.line.me/v2/bot/message/reply'
REQUEST_METHOD = 'POST'
REQUEST_HEADERS = {
    'Authorization': 'Bearer ' + LINE_CHANNEL_ACCESS_TOKEN,
    'Content-Type': 'application/json'
}


iot = boto3.client('iot-data')

def lambda_handler(event, context):
    
    reply_token = json.loads(event['body'])['events'][0]['replyToken']
    
    message_text = json.loads(event['body'])['events'][0]['message']['text']
    
    reply_message = "Failed."


    # トピックを指定
    topic = '受信するtopic名へ変更'
    # publishメッセージペイロード
    payload = {
        "message": message_text
    }

    try:
        # メッセージをPublish
        iot.publish(
            topic=topic,
            qos=0,
            payload=json.dumps(payload, ensure_ascii=False)
        )
    
        reply_message = "Succeeeded."
        
    except Exception as e:
        reply_message = "Failed at Except."


    REQUEST_MESSAGE = [
        {
            'type': 'text',
            'text': reply_message
        }
    ]

    params = {
        'replyToken': reply_token,
        'messages': REQUEST_MESSAGE
    }
    request = urllib.request.Request(
        REQUEST_URL, 
        json.dumps(params).encode('utf-8'), 
        method=REQUEST_METHOD, 
        headers=REQUEST_HEADERS
        )
    response = urllib.request.urlopen(request, timeout=10)

    return 0

コード内のトピックの名前は適宜、自分の環境でSubscribeするトピック名を指定しておきます。

topic = '受信するtopic名へ変更'

また、lambdaの環境変数には連携するLINEのチャンネルトークン設定も必要です。(手順は後ほど)

AWS API Gateway環境

LINEとlambdaを連携するためのエンドポイントの設定をしておきます。
Lambda関数へトリガーを追加します。

AWS Lambda トリガー追加

以下の設定でAPIGateWayを作成します
Intent: Create a new API
API Type: HTTP API
Security: Open

AWS API Gateway作成

作成されたAPIのエンドポイントは後ほどLINE連携時に使用します。

AWS API Gateway エンドポイント

LINE Bot環境

LINE DEVELOPERへログインを行います。無料登録が必要です。
https://developers.line.biz/

ログイン後、Messageing APIの作成を行います

LINE MessagingAPIの作成

Messaging APIのチャンネル設定を行います。
ここではチャンネル名やアイコン、カテゴリー等の設定を行います。(作成するチャンネル情報を入力してください)

チャンネル設定が終わりましたらMessagingAPI設定から以下を設定

Webhook URL: 先程作成したAPIGatewayのエンドポイントを設定
Use Webhook: ONにする
Channel Access token: アクセストークンはlambdaの環境変数へ設定するため控えておく

LINEチャンネルトークン設定

上記で取得したチャンネルアクセストークンをlambdaの環境変数へ設定しておきます。

lambdaの設定から環境変数を設定
キー: ChannelAccessToken
値: 上記で取得したチャンネルアクセストークン

lambda環境変数設定

これでLINEとlambdaの連携ができました。

今回作成したLINEBOTへメッセージを送るとlambdaが発火します。
LINEBOTの友だち追加はLINEチャンネル設定のQRコードを読み取り追加を行います。

LINEを送信し、Iot Coreをでラズパイを制御

QRコードから追加したLINEBOTに対して何らかのメッセージを送るとIoT Coreへpublishされます。
これをラズパイからSubscribeしておけば、ラズパイへメッセージ送信が可能になります。
(lambdaから送信するtopicとラズパイから受信するtopicは同じに合わせましょう。)

ラズパイのSubscribe手順は以下の記事を参考に

自動応答メッセージを無効にしたい

デフォルトではLINEBOTへメッセージを送信すると応答として自動応答メッセージが表示されます。
これを無効にする手順について

チェンネル基本設定からアカウントマネージャーへ遷移します。

自動応答メッセージタブから応答メッセージのステータスオフにします

LINEBOT自動応答メッセージOFF

これでLINEからAPI Gateway-lambda-IoT Core-ラズパイへの連携が見事可能になりました。

この記事が気に入ったら
フォローしてね!

よかったらシェアしてね!

コメント

コメントする

目次
閉じる