>我在调用时有 Lambda 函数,它会创建 SNS 主题,向其添加订阅者,然后向其发布消息。发布消息后,它会删除主题。要创建的主题的名称和订阅者将作为有效负载提供给 lambda 函数。
有时它可以工作,有时它会失败Task timed out after x seconds
因为我增加了 lambda 超时并且仍然是相同的问题。
我挖了一点,发现
sns.createTopic(params, function(err, data) {
if(err) {
console.log('Error Creating SNS Topic:',err);
} else {
console.log('SNS Topic Created Successfully:',data);
}
}
从不返回,没有错误没有数据,我没有看到console.log()
的结果
工作时,一切都很好,但是当它失败时,我看不到找到问题。
编辑:
所以我做了更多的挖掘,我减少了SNS主题创建的超时,默认情况下是5分钟,现在是5秒。当失败发生时,我明白了">
{ [TimeoutError: Connection timed out after 5000ms]
message: 'Connection timed out after 5000ms',
code: 'NetworkingError',
time: Thu Mar 30 2017 15:35:20 GMT+0000 (UTC),
region: 'us-east-1',
hostname: 'sns.us-east-1.amazonaws.com',
retryable: true }
出了问题,我的兰巴达在 VPC 中,我在兰巴达配置下选择了几个子网。 一些选定的子网无法访问互联网,我认为这就是在这些子网(没有互联网(下创建 lambda 容器时无法访问 SNS 和超时的原因。删除违规子网后,它开始工作。从那以后我就没有看到这个问题了。
使 lambda 函数可以访问互联网(同时也连接到 VPC(
- 仅为 lambda 函数选择私有子网 安全组
- 可以是默认安全组。
- 私有子网应附加到路由表,该路由表具有到 NAT 网关 (X( 的路由 0.0.0.0/0
- 棘手的部分是 NAT 网关 X 应附加到公有子网(AWS 控制台在创建时要求子网(
- 更棘手的部分是,我们刚刚在步骤 4 中使用的公有子网应该附加到路由表,该路由表具有到 IGW 的路由 0.0.0.0/0。(此路由的配置使其成为公有子网(
亚马逊对此有一个很棒的视频,对于像我这样对所有 AWS 术语都了解 0 的人来说非常有帮助。https://www.youtube.com/watch?v=JcRKdEP94jM#action=share