ThingsBoardからSNS経由でLambdaを動かす
やりたいこと
ThingsBoardのDeviceProfileでのアラートを契機にAmazon SNSを経由して、AWS Lambdaで処理をさせたい
構成
次のような構成を準備する。
AWS SNSの準備とLambdaの準備は割愛します。
RuleChainで使用するNode
ThingsboadのRuleChainからSNSに通知するNodeはAWS SNS Nodeを使用します。
以下が公式のドキュメントです。
記載されているように専用のIAMユーザを作ってAWS Access Key ID と AWS Secret Access Keyを設定しましょう。
ARNはAWS SNSのトピックのARNを設定します。
送受するデータの形式
ThingsboardからSNSに送信するMessageデータの形式は以下のようになります。
Messageにテレメトリなどの情報を追加しても良いでしょう。
{
"tenantId": {
"entityType": "TENANT",
"id": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
},
"customerId": {
"entityType": "CUSTOMER",
"id": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
},
"type": "Alarm Rule名",
"originator": {
"entityType": "DEVICE",
"id": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
},
"severity": "CRITICAL",
"status": "ACTIVE_UNACK",
"startTs": 1706073197715,
"endTs": 1706073197715,
"ackTs": 0,
"clearTs": 0,
"details": null,
"propagate": false,
"propagateToOwner": false,
"propagateToOwnerHierarchy": false,
"propagateToTenant": false,
"propagateRelationTypes": [],
"id": {
"entityType": "ALARM",
"id": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
},
"createdTime": 1706073197722,
"name": "Alarm Rule名",
}
同じくAWS SNSで送信する(Lambdaで受け取る)データの形式は以下のようになります。
{
"Records": [
{
"EventSource": "aws:sns",
"EventVersion": "1.0",
"EventSubscriptionArn": "arn:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"Sns": {
"Type": "Notification",
"MessageId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"TopicArn": "arn:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"Subject": null,
"Message": "{\"tenantId\":{\"entityType\":\"TENANT\",\"id\":\"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\"},\"customerId\":{\"entityType\":\"CUSTOMER\",\"id\":\"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\"},\"type\":\"Alarm Rule名\",\"originator\":{\"entityType\":\"DEVICE\",\"id\":\"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\"},\"severity\":\"CRITICAL\",\"status\":\"ACTIVE_UNACK\",\"startTs\":1706073197715,\"endTs\":1706073197715,\"ackTs\":0,\"clearTs\":0,\"details\":null,\"propagate\":false,\"propagateToOwner\":false,\"propagateToOwnerHierarchy\":false,\"propagateToTenant\":false,\"propagateRelationTypes\":[],\"id\":{\"entityType\":\"ALARM\",\"id\":\"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\"},\"createdTime\":1706073197722,\"name\":\"Alarm Rule名\"}",
"Timestamp": "2024-01-24T04:11:30.061Z",
"SignatureVersion": "1",
"Signature": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
"SigningCertUrl": "https://sns.ap-northeast-1.amazonaws.com/SimpleNotificationService-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.pem",
"UnsubscribeUrl": "https://sns.ap-northeast-1.amazonaws.com/?Action=Unsubscribe&SubscriptionArn=arn:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"MessageAttributes": {}
}
}
]
}
つまりLambdaで受け取るデータの以下の中に、Thingsboardが送信するデータがあります。
Message内の”(ダブルコーテーション)はエスケープされています。
Records[0].Sns.Message
受け取ったMessageはLambda内で好きに使いましょう。
おわりに
データがどのような形式で送受されるのかどこにも記載されていなかったためメモ代わりに残します。