Alerting von IoT-Devices über AWS IoT und SNS
Der Einsatz von IoT bietet vielseitige Chancen durch Auswertung der Sensordaten. In unserem Beispiel zeigen wir, wie das Alerting, also die Benachrichtigung bei einem Fehler oder einer Werteüberschreitung, mit den Cloudprodukten von AWS und einem ESP32 als Sensor funktionieren kann.
Amazon Web Services bietet als Cloudservices-Anbieter eine große Vielfalt von verschiedenen Diensten auf verschiedenen Abstraktionsebenen an, darunter die Platform-as-a-Service AWS IoT Core. Sie dient als Rückgrat für die Anbindung von Geräten (innerhalb von AWS Things genannt) in die Cloud.
Übersicht
IoT Core ist im Kern eine Nachrichtenorientierte Middleware, an welche Geräte/Things über HTTP oder vorzüglich MQTT angebunden werden. Zusätzlich stellt IoT Core eine Rule Engine zur Verfügung, welche Nachrichten über definierbare Filter an weitere AWS- oder externe Dienste weiterleitet. Für die persistente Darstellung des Gerätezustands bietet IoT Core eine Shadow-Funktionalität an, welche wir bei unserem Aufbau jedoch nicht benötigen.
Die MQTT-Verbindung zwischen Thing und IoT Core wird über TLS abgesichert, die Zertifikate dafür werden im integriertem Certificate Manager verwaltet. Dabei wird für jedes Device ein eigenes Zertifikat ausgestellt, mit welchem es sich auch gleichzeitig authentifizieren kann.
Um einen unberechtigten Zugriff zu vermeiden, wird an jedes Zertifikat eine Policy gebunden, welche klar definiert, welche Aktionen das mit dem Zertifikat assoziierte Thing, also zum Beispiel ein Sensor, ausführen darf.
Einrichten von IoT Core
Für die folgenden Schritte verwenden wir die AWS CLI. Alternativ kann dies jedoch auch per GUI auf der Web-Console erfolgen.
Zuerst legen wir das Thing an, diesem geben wir den Namen sensor01
1 |
aws iot create-thing --thing-name sensor01 |
Damit das Thing sich bei Start der Verbindung authentifizieren kann und die Verbindung verschlüsselt wird, legen wir ein Zertifikat an. In der Antwort, sind für uns certificatePem
und PrivateKey
später noch von Bedeutung.
1 |
aws iot create-keys-and-certificate --set-as-active |
1 2 3 4 5 6 7 8 9 |
{ "certificateArn": "arn:aws:iot:eu-central-1:190625634758:cert/5bf830193f2893ee816fadbc1531cfa1e7b73e6d2b08710a7392252f817df289", "certificateId": "5bf830193f2893ee816fadbc1531cfa1e7b73e6d2b08710a7392252f817df289", "certificatePem": "-----BEGIN CERTIFICATE-----\nMIIDWj ... VlKpFnw==\n-----END CERTIFICATE-----\n", "keyPair": { "PublicKey": "-----BEGIN PUBLIC KEY-----\nMIIBAAWZ ... AB\n-----END PUBLIC KEY-----\n", "PrivateKey": "-----BEGIN RSA PRIVATE KEY-----\nMIIEpAI ... Ge32+zOg==\n-----END RSA PRIVATE KEY-----\n" } } |
Im nächsten Schritt binden wir das Zertifikat an das Thing. Der „principal“ ist dabei die certificateArn
welche wir im vorherigen Schritt erhalten haben.
1 |
aws iot attach-thing-principal --thing-name sensor01 --principal arn:aws:iot:eu-central-1:190625634758:cert/5bf830193f2893ee816fadbc1531cfa1e7b73e6d2b08710a7392252f817df289 |
Um die Berechtigungen des Things festzulegen, legen wir eine „policy“ an. Diese legt in diesem Fall fest, dass sich das Gerät verbinden darf und in die Topics <thing-name>/*
senden und lesen darf. So darf das Thing „sensor01“ in z.B. sensor01/status
Nachrichten senden. (Dies ist keine IAM-Policy!)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "iot:Connect", "Resource": "arn:aws:iot:eu-central-1:190625634758:client/${iot:Connection.Thing.ThingName}" }, { "Effect": "Allow", "Action": [ "iot:Publish", "iot:Subscribe" ], "Resource": "arn:aws:iot:eu-central-1:190625634758:topic/${iot:Connection.Thing.ThingName}/*" } ] } |
1 |
aws iot create-policy --policy-name sensor-policy --policy-document file://sensor_policy.json |
Anbindung an SNS
Amazon Webservices bietet mit AWS Simple Notification Service eine einfache Möglichkeit an, Benachrichtigungen an verschiedene Interessenten zu versenden. Diese Benachrichtigungen werden über E-Mail, SMS oder Push-Notification (FCM, APNS) zugestellt.
Zuerst legen wir dafür ein Topic an, welches für die Benachrichtigungen von sensor01
dient.
1 |
aws sns create-topic --name sensor01_alerts |
1 2 3 |
{ "TopicArn": "arn:aws:sns:eu-central-1:190625634758:sensor01_alerts" } |
Um Benachrichtigungen an eine E-Mail-Adresse zuleiten, muss diese vorab registriert werden. SNS sendet daraufhin eine Aktivierungsmail welche der Benutzer bestätigen muss, um zukünftig Benachrichtigungen empfangen zu können.
1 |
aws sns subscribe --topic-arn arn:aws:sns:eu-central-1:190625634758:sensor01_alerts --protocol email --notification-endpoint "christoph.walcher@novatec-gmbh.de" |
Das nächste Ziel ist nun, eine Regel zu erstellen, welche aus AWS IoT Core heraus, an AWS SNS eine Benachrichtigung sendet, falls der Sensor einen Alarm signalisiert.
Damit AWS IoT auf SNS zugreifen darf, ist zuerst eine IAM Role notwendig.
1 2 3 4 5 6 7 8 9 10 |
{ "Version":"2012-10-17", "Statement":[{ "Effect": "Allow", "Principal": { "Service": "iot.amazonaws.com" }, "Action": "sts:AssumeRole" }] } |
1 |
aws iam create-role --role-name iot_to_sns --assume-role-policy-document file://iot_to_sns_assume_role.json |
1 2 3 4 5 6 7 8 |
{ "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Action": "sns:Publish", "Resource": "arn:aws:sns:eu-central-1:190625634758:sensor01_alerts" } } |
1 |
aws iam put-role-policy --role-name iot_to_sns --policy-name iot_to_sns --policy-document file://iot_to_sns_policy.json |
Zu guter Letzt kann die Regel gesetzt werden. Sie schickt eine Benachrichtigung mit dem Inhalt „Sensor 01 Alarm“ an den SNS, wenn das Thing als Status alert
sendet.
1 2 3 4 5 6 7 8 9 10 11 12 |
{ "sql": "SELECT 'Sensor 01 Alarm' as default FROM 'sensor01/status' WHERE status = 'alert'", "actions": [ { "sns": { "targetArn": "arn:aws:sns:eu-central-1:190625634758:sensor01_alerts", "roleArn": "arn:aws:iam::190625634758:role/iot_to_sns", "messageFormat": "JSON" } } ] } |
1 |
aws iot create-topic-rule --rule-name sensor01_alert --topic-rule-payload file://sensor01_alert_rule.json |
Test von AWS IoT
Der einfachste Weg IoT Core zu testen, ist über die Web-Console. Hier können Nachrichten direkt in IoT Core gesendet und empfangen werden.

Beim Absenden dieser Nachricht, wird die Regel ausgelöst und eine Benachrichtigung versendet.
Da IoT Core einen MQTT-Endpoint bereitstellt, kann sich darauf auch jeder MQTT-Client verbinden, welcher MQTTS unterstützt. Die Adresse des Endpoint lässt sich über aws iot describe-endpoint
ermitteln. Das CA-Zertifikat stellt AWS online bereit, das Clientzertifikat und der dazugehörige Schlüssel haben wir vorhin schon erhalten. (Diese müssen bei einem grafischem Client wie MQTT.fx oder mqtt-spy in eine Textdatei gespeichert werden.)
Integration in ESP32
Um den Show-Case „anfassen“ zu können, habe ich einen ESP32 als Thing integriert. Am ESP ist ein DHT-Temperatursensor angeschlossen. Bei einer Überschreitung von 30°C sendet dieser eine Nachricht über MQTT an AWS IoT. Die benötigten Bibliotheken stehen für die Arduino-Umgebung zur Verfügung -optimal für schnelles Prototyping-. Der Quellcode dafür ist auf GitHub Gist.
Fazit
Wenn es um einfaches und skalierbares Alerting
geht, sind die Services AWS IoT Core und AWS SNS schnell eingerichtet, funktionstüchtig und produktionsreif. Die Anbindung der Things an IoT Core kann natürlich auch für weitere Use-Cases verwenden werden, z.B. eine anschließende Analyse oder eine Aufbereitung für Dashboards. Sollte es ein feingranulareres Regelwerk benötigt werden, empfiehlt sich zwischen IoT Core und SNS zusätzlich IoT Events einzusetzen.
Für alle, die gerne mehr über die Datenauswertung von IoT-Daten wissen möchten: https://www.novatec-gmbh.de/beratung/datenauswertung/
Aktuelle Beiträge




Artikel kommentieren