AWS SNS创建超时。

8

我有一个Lambda函数,当被调用时,它会创建SNS主题,在其中添加订阅者,然后向其发布消息。发布消息后,它将删除主题。主题的名称和订阅者作为有效载荷传递给Lambda函数。

有时它可以正常工作,但有时会出现“在x秒后超时”的错误。我已经增加了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 }

好的,它有时候能够工作,有时候又不能。如果它一直发生这种情况,我会考虑这个问题。 - johnny
你能分享完整的代码吗?如果不能,除了你提到的SNS工作之外,这个函数还有其他功能吗?可能它确实需要超过5分钟的时间,这就是为什么它会超时,但如果它只是做一些你提到的少量SNS调用,那么根本不需要花费5分钟。从你提到的内容中没有明显的问题,因此分享代码或告诉我们更多关于你的函数所做的事情都可以帮助我们。 - alanwill
谢谢,我想我已经弄明白了。请看下面的我的答案。 - johnny
2个回答

8

我认为我解决了这个问题,我的Lambda在VPC中,并且我在Lambda配置下选择了一些子网。但是,其中一些被选择的子网没有访问互联网的权限,我认为这就是当容器在这些没有互联网连接的子网中创建时无法访问SNS并超时的原因。移除了违规的子网后,它开始正常工作。从那以后我没有再遇到这个问题。


没错,那也可以。很高兴你能够解决它。 - alanwill
2
我们遇到了同样的问题,私有VPC子网启用了NAT网关以与公共子网通信,但公共子网没有配置NAT网关,因此无法访问互联网。谢谢! - luk2302
请参阅 http://forum.serverless.com/t/solved-publishing-to-created-sns-topic/1426 了解更多详细信息。 - luk2302
谢谢!我已经找了好久的解决方案 :) - edzillion
很高兴能帮到你。 - johnny

8
为了让Lambda函数既能够连接到互联网,同时又附属于VPC,您需要:
  • 选择仅私有子网作为Lambda函数的子网
  • 安全组可以使用默认设置。
  • 将私有子网连接至一个路由表,并在该路由表中添加一条路由0.0.0.0/0指向NAT网关(X)。
  • 重要的是,NAT网关X需要连接至公共子网(AWS控制台在创建时会询问子网)。
  • 更棘手的问题是,我们刚才在步骤4中使用的公共子网需要连接至一个路由表,并在该路由表中添加一条路由0.0.0.0/0指向IGW。(这样配置的路由使其成为公共子网)
亚马逊有一段很好的视频内容介绍了上述内容,对于像我这样对AWS专用术语完全不熟悉的用户非常有帮助。 https://www.youtube.com/watch?v=JcRKdEP94jM#action=share

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接