Récemment, je suis exclusivement en charge de projets liés à l'IoT. Depuis que j'utilise AWS, je stocke souvent les données des appareils dans DynamoDB, j'acquiers ces données et je les visualise, et Lambda est très actif dans ce cas. J'utilise principalement Node.js, et je l'ai implémenté en Python en fonction du projet, et je pensais que je l'avais moi-même transformé en modèle, je vais donc le résumer.
Il écrit principalement les données reçues de l'appareil sur DynamoDB. Normalement, il est nécessaire de traiter les données, mais comme il existe différents types en fonction de l'appareil, je vais l'omettre. L'important ici est de spécifier la clé de partition et la clé de tri. Si vous faites une erreur ici, vous obtiendrez une erreur. (Les informations clés sont fausses! Sentiment)
Node.js
const AWS = require("aws-sdk");
const dynamoDB = new AWS.DynamoDB.DocumentClient({
region: "ap-northeast-1" //Région DynamoDB
});
exports.handler = (event, context, callback) => {
const params = {
TableName: "table-name" //Nom de la table DynamoDB
Item: {
"PartitionKey": "your-partition-key-data", //Données de la clé de partition
"SortKey": "your-sort-key-data", //Trier les données clés
"OtherKey": "your-other-data" //Autre informations
}
}
//Exécution du traitement Put vers DynamoDB
dynamoDB.put(params).promise().then((data) => {
console.log("Put Success");
callback(null);
}).catch((err) => {
console.log(err);
callback(err);
});
}
Python
import boto3
def lambda_handler(event, context):
try:
dynamoDB = boto3.resource("dynamodb")
table = dynamoDB.Table("table-name") #Nom de la table DynamoDB
#Exécution du traitement Put vers DynamoDB
table.put_item(
Item = {
"PartitionKey": "your-partition-key-data", #Données de la clé de partition
"SortKey": "your-sort-key-data", #Trier les données clés
"OtherKey": "your-other-data" #Autre informations
}
)
except Exception as e:
print e
Nous utilisons principalement la requête pour obtenir les données dans DynamoDB. Si vous avez SortKey dans DynamoDB ainsi que PartitionKey, vous pouvez définir ScanIndexForward sur false et spécifier le nombre d'observations acquises par Limit, et vous pouvez acquérir un nombre fixe à partir des données dans l'ordre décroissant (le plus récent). Un modèle courant est que vous souhaitez obtenir les dernières données envoyées par un certain ID de périphérique (clé de partition).
Node.js
const AWS = require("aws-sdk");
const dynamoDB = new AWS.DynamoDB.DocumentClient({
region: "ap-northeast-1" //Région DynamoDB
});
exports.handler = (event, context, callback) => {
const params = {
TableName: "table-name" //Nom de la table DynamoDB
KeyConditionExpression: "#PartitionKey = :partition-key-data and #SortKey = :sort-key-data", //Informations clés à obtenir
ExpressionAttributeNames: {
"#PartitionKey": "your-partition-key", //Nom d'attribut de la clé de partition
"#SortKey": "your-sort-key" //Nom d'attribut SortKey
},
ExpressionAttributeValues: {
":partition-key-data": "your-partition-key-data", //Nom de la clé de partition que vous souhaitez obtenir
":sort-key-data": "your-sort-key-data" //SortKey nom que vous souhaitez obtenir
}
ScanIndexForward: false //Ordre croissant ou décroissant(La valeur par défaut est true=ordre croissant)
Limit: 1 //Nombre de données à acquérir
}
//Exécuter le traitement des requêtes vers DynamoDB
dynamoDB.query(params).promise().then((data) => {
console.log(data);
callback(data);
}).catch((err) => {
console.log(err);
callback(err);
});
}
Python
import boto3
from boto3.dynamodb.conditions import Key
def lambda_handler(event, context):
try:
dynamoDB = boto3.resource("dynamodb")
table = dynamoDB.Table("table-name") #Nom de la table DynamoDB
#Exécuter le traitement des requêtes vers DynamoDB
queryData = table.query(
KeyConditionExpression = Key("your-partition-key").eq("your-partition-key-data") & Key("your-sort-key").eq("your-sort-key-data"), #Informations clés à obtenir
ScanIndexForward = false, #Ordre croissant ou décroissant(La valeur par défaut est true=ordre croissant)
Limit: 1 #Nombre de données à acquérir
)
return queryData
except Exception as e:
print e
Étant donné que DynamoDB gère souvent les données avec Put et query, j'ai résumé deux méthodes. Dans certains cas, il doit s'agir de Update au lieu de Put, ou scan est utilisé lorsque vous souhaitez obtenir tous les enregistrements pour le moment. N'oubliez pas d'avoir une politique qui permet à *** Lambda de faire fonctionner DynamoDB correctement! *** *** En outre, cela se produit parfois lors de l'exécution d'une requête, mais parfois je veux voir "DynamoDB ne contient pas de données même si le processus semble être terminé sans aucune erreur." Dans un tel cas, suspectez un *** timeout. *** La valeur par défaut est de 3 secondes, donc si le nombre de données récupérées par requête est important, il expirera. J'ai écrit ceci pour être utilisé dans Lambda, mais comme je n'utilise normalement que le SDK, je pense qu'il peut être utilisé en modifiant le code source ci-dessus même lors du traitement des données d'une application Web ou d'un appareil capable de charger le SDK. ..
En passant, un de mes soucis récents est que si j'écris Node et écris Python, la grammaire, etc. sera confuse ...
(Veuillez me pardonner s'il y a une partie sale dans le code source ...)
à plus!
Recommended Posts