AWS Node.js Lambda调用SNS Publish超时无响应排查求助
问题:Node.js 18 AWS Lambda 向SNS发布消息超时无日志
我在使用Node.js(v18)版本的AWS Lambda,尝试向SNS主题发布消息,但遇到了问题:Lambda日志仅输出before publish、topicArn=<我的主题ARN>和publish command created,之后没有成功或错误日志,消息也未送达订阅邮箱。通过AWS控制台手动发布测试消息可正常送达订阅者。
已将Lambda超时时间调至3分钟、内存调至2048MB,但仍会超时,且内存占用远低于初始的128MB上限。
相关代码片段
try { //const sns = new SNS(); const snsClient = new SNSClient({ region: process.env.AWS_REGION }); //const topicArn = 'arn:aws:sns:region:account-id:topic-name'; const topicArn = process.env.LABEL_MESSAGES_TOPIC_ARN; // Publish to the SNS Topic console.log('before publish'); console.log('topicArn='+topicArn); /* await publishResponsePromise = sns.publish({ Message: JSON.stringify(My50LineJsonBlock), TopicArn: topicArn }).promise(); */ const publishCommand = new PublishCommand({ Message: JSON.stringify(My50LineJsonBlock), TopicArn: topicArn, }); console.log('publish command created'); const response = await snsClient.send(publishCommand); console.log('Message published to topic') } catch (error) { console.error('error on publish '); }
已配置的Lambda角色权限策略
{ "Statement": [ { "Action": [ "sns:publish", "sns:subscribe" ], "Effect": "Allow", "Resource": "arn:aws:sns:us-west-2:<我的账号>:<我的主题>" } ], "Version": "2012-10-17" }
排查与解决方法
1. 检查JSON序列化问题
代码中用JSON.stringify(My50LineJsonBlock)生成消息内容,如果这个对象存在循环引用或无法序列化的类型(如函数、Symbol、BigInt等),会导致序列化卡住或静默失败,进而让整个请求挂起超时。
先替换为简单测试消息验证:
Message: JSON.stringify({ test: "hello world" })
如果测试消息正常,再给序列化步骤加单独的错误捕获:
let message; try { message = JSON.stringify(My50LineJsonBlock); console.log("Message serialized successfully"); } catch (serializationError) { console.error("Serialization failed:", serializationError); throw serializationError; }
2. 完善错误日志输出
当前catch块仅输出固定文本,无法定位具体错误,修改为:
catch (error) { console.error('Publish failed:', error.stack || error); }
通过完整错误栈信息快速定位问题。
3. 验证SNS客户端配置
- 确认
process.env.AWS_REGION的值与SNS主题所在区域完全一致,跨区域请求可能导致超时或权限验证失败。 - 若Lambda在VPC内运行:需配置NAT网关或SNS VPC端点,同时确保安全组允许HTTPS(443端口)出站流量,否则Lambda无法访问SNS服务。
4. 检查Lambda角色信任关系
确保角色的信任策略允许Lambda服务扮演该角色,否则无法获取调用SNS的凭证:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "lambda.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
内容的提问来源于stack exchange,提问作者Woodsman
相关产品推荐
相关产品推荐

