見出し画像

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を設定します。

AWS SNS Nodeの設定

送受するデータの形式


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内で好きに使いましょう。

おわりに

データがどのような形式で送受されるのかどこにも記載されていなかったためメモ代わりに残します。

いいなと思ったら応援しよう!