AWS Lambda関数内のMQTTのトピックに何かを公開するためにbashで使用するような簡単なコマンドが欲しいです。次の行に沿って:mosquitto_pub -h my.server.com -t "light/set" -m "on"
背景:Alexaでランプのオン/オフを切り替えたいのですが。 AlexaはLambda関数を開始できます。ランプはMQTTトピックをリッスンし、そこでメッセージに反応できるため、このLambda関数の内部でMQTTパブリッシュを開始したいと思います(より簡単な解決策があるかもしれませんが、他の多くのアプローチをより困難にする複雑な(大学)ネットワーク)
Pythonを使用している場合、ハンドラー関数内で次のように使用して、AWS Lambda関数からAWS IoTにメッセージを発行することができました。
import boto3
import json
client = boto3.client('iot-data', region_name='us-east-1')
# Change topic, qos and payload
response = client.publish(
topic='$aws/things/pi/shadow/update',
qos=1,
payload=json.dumps({"foo":"bar"})
)
また、(Lambda関数構成内の)ロールにIoT公開関数へのアクセスを許可するためのポリシーがアタッチされていることを確認する必要もあります。 IAM-> Rolesの下で、次のようにインラインポリシーをLambda関数Roleに追加できます。
{
"Version": "2016-6-25",
"Statement": [
{
"Effect": "Allow",
"Action": [
"iot:Publish"
],
"Resource": [
"*"
]
}
]
}
AWS SDKには、IoTで動作する2つのクラスがあります:Iot and IotData。 IotData.publish は、探しているメソッドです。Iotオブジェクトはモノを操作するためのもので、IotDataはMQTTとシャドウを操作するためのものです。これはMQTTとシャドウに関するドキュメントで直接参照する必要がありますが、そうではありません。
このサービス(IotData)も利用できます CLIで 。
Node.jsを使用している場合、これは機能します-
var AWS = require('aws-sdk');
var iotdata = new AWS.IotData({ endpoint: '*****************.iot.us-east-1.amazonaws.com' });
exports.handler = async(event) => {
console.log("Event => " + JSON.stringify(event));
var params = {
topic: "MyTopic",
payload: JSON.stringify(event),
qos: 0
};
return iotdata.publish(params, function(err, data) {
if (err) {
console.log("ERROR => " + JSON.stringify(err));
}
else {
console.log("Success");
}
}).promise();
};
このラムダ関数で使用されるロールにiot:publish権限を追加することを忘れないでください。
Node.jsを使用する場合は、mqttライブラリをインストールする必要があります。次の手順は、mqttライブラリをAWS Lambdaにダウンロードしてインストールするのに役立ちます。
Node.jsとnpmをダウンロードしてインストール PCにインストールします。
Node.jsがインストールされているnodejsディレクトリで解凍します。 (Windows 10 x64では、nodejsディレクトリはC:\Program Files\nodejs
です)
インストールされたmqttファイルを格納するフォルダーを作成します。たとえば、D:\lambda_function
です。
管理者としてコマンドプロンプトを実行し、ディレクトリをnodejsディレクトリに変更します。
MqttライブラリをD:\lambda_function
にインストールします。
C:\Program Files\nodejs>npm install --prefix "D:\lambda_function” mqtt