You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 00:26:07