How to Send Aws Iot MQTT message to dynamo db table? - amazon-web-services

I want to get the mqtt message and put into dynamodb table for that i created a rule and actions for that but i am getting another value when the data is inserted into a dynamo db table . Can you please how can i get the mqtt messsage value to dynamodb table ?

If you could provide more information on where and what wrong data you are getting I can help you out with the first part of the question.
How can I keep MQTT messages in DynamoDB?
You can keep a trigger with a lambda function. Whenever there is a change you can trigger the function to store the data in DynamoDB.
UPDATE
You can get more information here. It is explained in detail and solves your exact problem.

Related

Can dynamodb send to sns based on some row of data it holds

Trying to design a solution for error handling. We have a lambda that receives data from an sns topic and sends data to a legacy service that has been known to be unavailable at times.
When the legacy service is down I want to send the messages to a dyanmodb table to be replayed.
I want to use a circuit breaker pattern. So at the minute I am thinking of spinning up a service that will constantly poll the legacy service then some pseudo code that looks like this
If (legacy service changes from dead to alive){
Send all entries from dynamo to sns topic;
//This will trigger the lambda again which will hit legacy service which we know is now up
}
The thing is, we like using serverless technologies and not sure I can have a serverless service that constantly polls, it makes sense for that to run on a server.
I am looking for a nice way to do this so I am wondering is it possible to configure dynamodb to poll the legacy service and on the condition it changes from dead to alive populate the sns topic. Or any other solutions using serverless technologies.
P.s I don't like the idea of running a lambda in intervals to check the dB as we could miss some down time, also reading data from dB and sending to sns could be a lengthy operation.
Update: been reading into circuit pattern more and realise I don't need to constantly poll I can just check amount of failed calls in last XX seconds in my dynamodb table so a new question has arose, can I send message from dynamodb to sns depending on a condition on one of its entries. Eg. FailsInLastMinute changes from 3 to below 3 we send all the messages from a column in dynamo to sns or do I need a service for this part
I don't think DynamoDB can do this, it's a database after all not an integration platform.
That said, a possible solution would be to use DynamoDB as a queue between SNS and the legacy app using DynamoDB streams. Any message from SNS gets inserted into DynamoDB using a Lambda. DynamoDB streams then triggers another Lambda that sends the message to the legacy app.
If the legacy app is down the Lambda function generates a failure as it cannot connect. DynamoDB will then retry the Lambda until it succeeds.
Note that you are probably better off using an SQS queue with fifo enabled. This will do the same but without the overhead of DynomoDB.

AWS Real time data fetching

I have an application which needs to read data from AWS dynamodb table every 5 seconds.
Currently I fetch the data using lambda, and then getting the data from dynamodb back to the user.
The problem with querying the table every 5 seconds is that it can have performance affect and moreover there is a pricing issue. (Most of the time the data might not even be changed at all but when it is changed I want to be notified it immediately).
An important clarification is that my app sits outsite of AWS, and only access the AWS dynamodb to get data (using simple http request built with c#).
Is there any way I can get a notification to my app when a new data is inserted into dynamodb?
Just to add something on top of #john-rotenstein answer:
Once you have properly configured a Lambda function to be triggered by an event from a DynamoDB Stream, you could have your Lambda function notify your Web Application via an HTTP Request.
Another option is to use Lambda to put this notification in a Queue you may be using outside AWS and then have your C# code be a consumer of this Queue. There are several possibilities to notify your application, you just need to see which one is the best / most cost effective for your current scenario.
A data update in DynamoDB can trigger a DynamoDB Stream, which can trigger an AWS Lambda function.
The Lambda function could notify your application in some way.
See: DynamoDB Streams and AWS Lambda Triggers
Streams is the right answer in terms of engineering, but just to say your concern about the polling option being expensive is unfounded. Therefore if you have a working solution I would be tempted to leave it.
If you queried a table every 5 seconds, it would cost you $0.25 every 2 months.
This assumes your table has on-demand pricing, and the query returns less than 4KB of data.
https://aws.amazon.com/dynamodb/pricing/on-demand/

How to get notified when a AWS Dynamo DB entry are updated?

I would like to be notified when a DynamoDB table changes, the same way as Google Firebase Realtime Database.
I consuming this service in a frontend javascript application.
DynamoDB doesn't have realtime notification/trigger for update on table.
But in this case you can try to use DynamoDB Streams for Capturing Table Activity.
Here are some example use cases:
An application in one AWS region modifies the data in a DynamoDB
table. A second application in another AWS region reads these data
modifications and writes the data to another table, creating a replica
that stays in sync with the original table.
A popular mobile app modifies data in a DynamoDB table, at the rate of
thousands of updates per second. Another application captures and
stores data about these updates, providing near real time usage
metrics for the mobile app.
A global multi-player game has a multi-master topology, storing data
in multiple AWS regions. Each master stays in sync by consuming and
replaying the changes that occur in the remote regions.
An application automatically sends notifications to the mobile devices
of all friends in a group as soon as one friend uploads a new picture.
A new customer adds data to a DynamoDB table. This event invokes
another application that sends a welcome email to the new customer.
more details in this DynamoDB Streams document.
And here is how to you can integrate DynamoDB Streams with AWS Javascript SDK:
var dynamodbstreams = new AWS.DynamoDBStreams();
dynamodbstreams.describeStream(params, function (err, data) {
if (err) console.log(err, err.stack); // an error occurred
else console.log(data); // successful response
});
We have some Event supported by DynamoDB Streams
eventName — (String) The type of data modification that was performed
on the DynamoDB table:
INSERT - a new item was added to the table.
MODIFY - one or more of an existing item's attributes were modified.
REMOVE - the item was deleted from the table.
By the way, if you want to notify to your client via another way instead of DynamoDB Streams you can try to using Lambda Function follow this article.
Hope this can help you solving your issue.
DynamoDB and Firebase/Firestore are really different.
Firebase/Firestore is a realtime database where you scan subscribe to changes on the client.
DynamoDB is a NoSQL Database to Store Key/Value Pairs.
More suitable for a similar use case is "AWS AppSync" which provides live updates like Firebase/Firestore does.
If you want to use DynamoDB nonetheless have a look at DynamoDB Streams to trigger an event on update of the table.
The questions is then how do you get the update to the client.
You could send a message to an SNS Topic, sending Push Notifications to the client if necessary.
But in the end you will build with DynamoDB Streams and SNS and maybe Lambda what Firebase/Firestore or "AWS AppSync" provides out of the box.
I normally see the DynamoDB -> SNS topic pattern -> (With custom lambda).
If your application is for mobile have you taken a look at AWS SNS Mobile Push and seen if it would not be a better fit for your architecture.

How do we send notification to AWS SNS , for a record insert into Mysql Rds table?

I have a requirement where I need to send SNS notification based on data insert into Mysql RDs table?
The "automatic" triggering is usually achieved by AWS Lambda or CloudWatch alerts. Lambda event sources are described here, however RDS is not among them.
I'd suggest the logic inserting data into RDS should send an SNS message
There is nothing built into mysql/rds that will do this for you. If this is a requirement I would suggest a custom layer that receives the insert request and does the insert and also sends the notification.
An API gateway request to a lambda function that does both tasks would probably work, but I wouldn't recommend it for a high velocity inputs (your writes to the db will be slowed).
For a low volume scenario it might work OK.
You can achieve this with RDS Trigger, Stored procedure.
Follow the steps below
Create a stored procedure like below which points to your AWS Lambda function which can send the SNS.
DELIMITER $$ CREATE DEFINER=admin#% PROCEDURE procedure name(IN 'column name' 'column data type') BEGIN CALL
> mysql.lambda_async('lambda ARN',
> CONCAT('{ "val" : "', val, '"}')); END$$ DELIMITER ;
Create a trigger which triggers the above procedure based on the scenario needed.
In the given eg below, The stored procedure will be triggered when specified column value is equal or greater than 10
DELIMITER $$ CREATE DEFINER=admin#% trigger 'trigger name' AFTER
INSERT ON 'database.table' for each row begin IF (NEW.'column name','
','')>=10 THEN CALL 'procedure name'(NEW.'column name'); END IF; END$$ DELIMITER ;
Make sure you have enough access to create a trigger and procedure. If not, grant the necessary access and try.

Store AWS IoT data and request real-time and bulk data?

Currently i'm working on a project where i have 7 of the same sensors (temperature, light, movement) in the AWS IoT. These sensors are placed in different rooms of the building. These sensors send an update every 5 minutes.
I need a secure way to store the data in AWS and get this to an external customer.
To showcase this i want do create a dashboard showing a floor map of the building with following features:
Get latest data of each sensor
Show the temperature on the correct place on the image
Update the data in realtime when an update of the sensor happened
Show a graph and all data of a selected sensor
I currently saved the data of all the sensors in 1 DynamoDB Table and created a working API in this manner:
API Gateway -> AWS Lambda -> DynamoDB <- AWS IoT <- Sensors
But problems with this are the fact that it does not update realtime. And it is hard to only get the latest value out of DynamoDB. So i need a better way.
2 questions:
What is the best way to store the data in AWS for this purpose? And how to create a userfriendly and secured API to request realtime and bulk data?
Does there exist a dashboard tool that can show sensor data on a static image?
The best way to store your data in AWS depends in a large part on how you want to access the data. From the use case you have described Dynamodb will work along with a web socket connection to the AWS IOT MQTT message broker.
For Dynamodb I would consider creating a table with a partion key that is your sensor id, and a sort key that is the timestamp. Then you can easily query the table to get the newest records for each sensor. Set the ScanIndexForward parameter to false to return the record in descending order in the query.
For Realtime messages you can connect to the AWS IOT MQTT message broker from your browser using a MQTT over web sockets. You can subscribe to the same topics that your sensors publish to and receive realtime updates.