无法从 lambda 发布 SNS 主题
Can't publish an SNS topic from lambda
我正在编写一个发布到 SNS 主题的 lambda 函数,但它在返回任何结果之前超时,这是我的函数:
var AWS = require('aws-sdk'); // Used for calling SNS
var pg = require ('pg'); // Used to connect to Postgre
exports.handler = function (event, context) {
'use strict';
// Step 1 call database to get school hours
var conn = "postgres://OMITTED:OMITTED@sOMITTED.ap-southeast-2.rds.amazonaws.com/slm_appdb"; // Save this in env variable
var client = new pg.Client(conn);
client.connect();
// Step 1 call the database to get the hours
const query = client.query("select * from find_all_students_school_hours();", (err,res) => {
console.info('Query made',res.rows);
res.rows.forEach(function(row){
var command = {
username: row.username,
commands: {
working_days: row.working_days || 'Mon-Fri',
school_start_time: row.school_start_time || '08:00:00', // Save this in env variable
school_end_time: row.school_end_time || '17:00:00' // Save this in env variable
}
};
// Step 2 add command for agent by calling another lambda function through SNS
var sns = new AWS.SNS();
var params = {
Message: JSON.stringify(command),
Subject: 'Agent School Hours',
TopicArn: 'arn:aws:sns:ap-southeast-2:OMITTED:add-command-for-agent-topic'
}
console.log('params',params);
sns.publish(params, function(err,snsres){
if(err){
console.error('error',err);
} else {
console.info('published to sns',snsres);
}
});
});
context.done();
});
};
并且我已将此策略附加到 lambda 函数:
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"sns:*"
],
"Effect": "Allow",
"Resource": "*"
}
]
}
我在日志中得到的是 params
数据,但之后什么都没有,所以我从未达到 console.error('error',err);
或 console.info('published to sns',snsres);
,我给了它一分钟的超时时间,但它仍然在它发布之前超时并且在日志中没有来自 SNS 的错误(见下图),有没有一种方法可以调试它以找出发生了什么?
您正在调用 context.done()
,而没有等待 sns.publish
完成。
请记住 Javascript 是异步的,因此当您在 res.rows.forEach()
循环中执行 I/O 事件 (sns.publish
) 时,context.done()
将终止您的立即执行处理程序(和 return),无需等待您的 SNS 主题发布。
我正在编写一个发布到 SNS 主题的 lambda 函数,但它在返回任何结果之前超时,这是我的函数:
var AWS = require('aws-sdk'); // Used for calling SNS
var pg = require ('pg'); // Used to connect to Postgre
exports.handler = function (event, context) {
'use strict';
// Step 1 call database to get school hours
var conn = "postgres://OMITTED:OMITTED@sOMITTED.ap-southeast-2.rds.amazonaws.com/slm_appdb"; // Save this in env variable
var client = new pg.Client(conn);
client.connect();
// Step 1 call the database to get the hours
const query = client.query("select * from find_all_students_school_hours();", (err,res) => {
console.info('Query made',res.rows);
res.rows.forEach(function(row){
var command = {
username: row.username,
commands: {
working_days: row.working_days || 'Mon-Fri',
school_start_time: row.school_start_time || '08:00:00', // Save this in env variable
school_end_time: row.school_end_time || '17:00:00' // Save this in env variable
}
};
// Step 2 add command for agent by calling another lambda function through SNS
var sns = new AWS.SNS();
var params = {
Message: JSON.stringify(command),
Subject: 'Agent School Hours',
TopicArn: 'arn:aws:sns:ap-southeast-2:OMITTED:add-command-for-agent-topic'
}
console.log('params',params);
sns.publish(params, function(err,snsres){
if(err){
console.error('error',err);
} else {
console.info('published to sns',snsres);
}
});
});
context.done();
});
};
并且我已将此策略附加到 lambda 函数:
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"sns:*"
],
"Effect": "Allow",
"Resource": "*"
}
]
}
我在日志中得到的是 params
数据,但之后什么都没有,所以我从未达到 console.error('error',err);
或 console.info('published to sns',snsres);
,我给了它一分钟的超时时间,但它仍然在它发布之前超时并且在日志中没有来自 SNS 的错误(见下图),有没有一种方法可以调试它以找出发生了什么?
您正在调用 context.done()
,而没有等待 sns.publish
完成。
请记住 Javascript 是异步的,因此当您在 res.rows.forEach()
循环中执行 I/O 事件 (sns.publish
) 时,context.done()
将终止您的立即执行处理程序(和 return),无需等待您的 SNS 主题发布。