我已经按照教程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“,
我不明白为什么。
公共子网的路由表如下:
对GET
的{{1}}请求应与http://www.google.com
目标匹配。为什么Internet网关(igw)无法将请求传递到igw-XXXXXXXXX
并取回网站内容?
此article说,我必须在私有子网中设置lambda函数才能访问Internet。
如果您的Lambda函数需要访问私有VPC资源(对于 例如Amazon RDS数据库实例或Amazon EC2实例),您必须 将功能与VPC相关联。如果您的功能还需要 互联网访问(例如,到达公共AWS服务终端节点), 您的功能必须使用NAT网关或实例。
但这并不能解释为什么我不能在公共子网中设置lambda函数。
答案 0 :(得分:4)
即使Lambda函数在公共子网中运行,您的Lambda函数也无法访问Internet的原因是,在VPC中运行时,Lambda函数不能具有公共IP地址。
公共子网中的默认路由目标是IGW,而不是NAT设备,Lambda功能仅具有一个专用IP地址,因此将从Lambda功能通过IGW到Internet的所有数据包都将被丢弃。
如果您的Lambda函数实际上不需要访问VPC内部的私有资源,则通常不需要将Lambda部署到VPC中。但是,如果确实需要,则可以在专用子网中运行Lambda函数,并确保到公用子网中NAT实例或NAT网关的默认路由。