J'ai une fonction Lambda simple qui est censée prendre des données d'événement et envoyer un message à un sujet SNS.
Le runtime est Node.js 8.10.
Voici mon code Lambda dans son intégralité:
const AWS = require("aws-sdk");
exports.handler = async (event) => {
const sns = new AWS.SNS();
const emailBody =
`
New Message
From: ${event.name}
Contact: ${event.contact}
Message: ${event.message}
`;
const snsMessageParams = {
TopicArn: process.env.snsTopicArn,
Message: emailBody
};
sns.publish(snsMessageParams, (err, data) => {
if(err) {
return err;
} else {
return data;
}
});
};
Chaque fois que j'exécute la fonction, je reçois toujours null en réponse. Aucune erreur n'est renvoyée, mais je ne reçois jamais de message dans mon e-mail de SNS, il y a donc quelque chose qui ne va pas ici. Je n'arrive pas à comprendre quoi.
Je peux publier avec succès un message sur ma rubrique SNS à partir de la console SNS et du SDK Node sur mon ordinateur local. Ceux-ci fonctionnent parfaitement. J'ai vérifié que le snsTopicArn dans mes variables env est correct en le copiant et en le collant directement à partir de mon code local réussi et de la console SNS.
J'ai un rôle d'exécution sur ma fonction Lambda qui devrait me permettre de publier sur SNS sur n'importe quel sujet de mon compte. J'ai choisi l'option par défaut "SNSPublish" lors de la configuration du rôle pour Lambda juste pour tout tester. Mais pour référence, voici la politique de mon rôle d'exécution:
{
"roleName": <MyRoleName>,
"policies": [
{
"document": {
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"sns:Publish"
],
"Resource": "arn:aws:sns:*:*:*"
}
]
}
...
}
Qu'est-ce qui ne va pas ici? Toute aide est certainement appréciée.
Ok, donc je l'ai compris.
Il y avait deux problèmes. Le premier est que je n'utilisais pas le paramètre "callback" qui est utilisé implicitement par Lambda pour Node. La seconde était que la fonction était asynchrone par défaut, donc elle s'attendait à un "attente" quelque part plus tard. J'ai simplement décidé de supprimer "async" et de le laisser s'exécuter de manière synchrone car il s'agit simplement d'une fonction simple et n'en a pas besoin de toute façon.
Voici mon code de travail mis à jour:
const AWS = require("aws-sdk");
const sns = new AWS.SNS();
exports.handler = (event, context, callback) => {
const emailBody =
`
Message
From: ${event.name}
Contact: ${event.contact}
Message: ${event.message}
`;
const snsMessageParams = {
TopicArn: process.env.snsTopicArn,
Message: emailBody
};
sns.publish(snsMessageParams, (err, data) => {
if(err) {
return err;
} else {
callback(null, JSON.stringify(data));
}
});
};