为什么VPC的公共子网内的AWS Lambda功能无法连接到互联网?

时间:2018-10-25 14:43:53

标签: amazon-web-services aws-lambda vpc

我已经按照教程here来创建具有公共和私有子网的VPC。

然后,我在公共子网中设置了一个AWS lambda函数,以测试它是否可以连接到外部互联网。

这是我用python3编写的lambda函数

import requests

def lambda_handler(event, context):
    r = requests.get('http://www.google.com')
    print(r)

当我在VPC的公共子网中设置http://www.google.com的内容时,上述函数无法获取内容。

这是错误消息:

  

“ errorMessage”:“ HTTPConnectionPool(主机='www.google.com',端口= 80):   URL超过最大重试次数:/(由引起   NewConnectionError(':无法建立新的连接:[Errno 110]   连接超时',))“,” errorType“:” ConnectionError“,

我不明白为什么。

公共子网的路由表如下:

enter image description here

GET的{​​{1}}请求应与http://www.google.com目标匹配。为什么Internet网关(igw)无法将请求传递到igw-XXXXXXXXX并取回网站内容?

article说,我必须在私有子网中设置lambda函数才能访问Internet。

  

如果您的Lambda函数需要访问私有VPC资源(对于   例如Amazon RDS数据库实例或Amazon EC2实例),您必须   将功能与VPC相关联。如果您的功能还需要   互联网访问(例如,到达公共AWS服务终端节点),   您的功能必须使用NAT网关或实例。

但这并不能解释为什么我不能在公共子网中设置lambda函数。

1 个答案:

答案 0 :(得分:4)

即使Lambda函数在公共子网中运行,您的Lambda函数也无法访问Internet的原因是,在VPC中运行时,Lambda函数不能具有公共IP地址。

公共子网中的默认路由目标是IGW,而不是NAT设备,Lambda功能仅具有一个专用IP地址,因此将从Lambda功能通过IGW到Internet的所有数据包都将被丢弃。

如果您的Lambda函数实际上不需要访问VPC内部的私有资源,则通常不需要将Lambda部署到VPC中。但是,如果确实需要,则可以在专用子网中运行Lambda函数,并确保到公用子网中NAT实例或NAT网关的默认路由。