今回の記事はAWS lambda + IoT Coreを連携させ、
LINEでRaspberryPi(ラズパイ)を制御するための環境構築方法について
やりたいことはざっと、以下の図のイメージ
AWS IoT Coreとラズパイの連携については以下の記事で事前に準備ください。
AWS Lambda環境
まずは、lambdaの環境を構築します。lambdaの関数を新規作成します。
lambda関数作成
関数名: 任意
ランタイム: Pythonであればバージョンは任意
実行ロール: 新しいロールを作成
Lambda関数の作成とともに新規でロールが作成されます。
このロールに対してポリシーをアタッチしていきましょう。
lambdaのロールへポリシーをアタッチ
ポリシーアタッチの前にまずは、AWS IAMからポリシーを作成します。
JSONタブに以下のJSONを貼り、次へ進みます
(lambdaからIoT CoreへのPublishを許可するためのポリシーです)
{
"Version": "2012-10-17",
"Statement": {
"Effect": "Allow",
"Action": "iot:Publish",
"Resource": "*"
}
}
タグの作成は任意です。必要なければ次へ進みます
ポリシー名は任意で構いません。後ほどこのポリシーにlambdaをアタッチします。
ポリシーの作成が終わったら、先程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関数へトリガーを追加します。
以下の設定でAPIGateWayを作成します
Intent: Create a new API
API Type: HTTP API
Security: Open
作成されたAPIのエンドポイントは後ほどLINE連携時に使用します。
LINE Bot環境
LINE DEVELOPERへログインを行います。無料登録が必要です。
https://developers.line.biz/
ログイン後、Messageing APIの作成を行います
Messaging APIのチャンネル設定を行います。
ここではチャンネル名やアイコン、カテゴリー等の設定を行います。(作成するチャンネル情報を入力してください)
チャンネル設定が終わりましたらMessagingAPI設定から以下を設定
Webhook URL: 先程作成したAPIGatewayのエンドポイントを設定
Use Webhook: ONにする
Channel Access token: アクセストークンはlambdaの環境変数へ設定するため控えておく
上記で取得したチャンネルアクセストークンをlambdaの環境変数へ設定しておきます。
lambdaの設定から環境変数を設定
キー: ChannelAccessToken
値: 上記で取得したチャンネルアクセストークン
これでLINEとlambdaの連携ができました。
今回作成したLINEBOTへメッセージを送るとlambdaが発火します。
LINEBOTの友だち追加はLINEチャンネル設定のQRコードを読み取り追加を行います。
LINEを送信し、Iot Coreをでラズパイを制御
QRコードから追加したLINEBOTに対して何らかのメッセージを送るとIoT Coreへpublishされます。
これをラズパイからSubscribeしておけば、ラズパイへメッセージ送信が可能になります。
(lambdaから送信するtopicとラズパイから受信するtopicは同じに合わせましょう。)
ラズパイのSubscribe手順は以下の記事を参考に
自動応答メッセージを無効にしたい
デフォルトではLINEBOTへメッセージを送信すると応答として自動応答メッセージが表示されます。
これを無効にする手順について
チェンネル基本設定からアカウントマネージャーへ遷移します。
自動応答メッセージタブから応答メッセージのステータスをオフにします
これでLINEからAPI Gateway-lambda-IoT Core-ラズパイへの連携が見事可能になりました。
コメント