我按照教程here创建了一个包含公共和私有子网的VPC。
然后,我在公共子网内设置AWS lambda函数,以测试它是否可以连接到外部Internet。
这是我用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(host ='www.google.com',port = 80):使用url超出最大重试次数:/(由NewConnectionError引起(':无法建立新连接:[Errno 110]连接超时',))“,”errorType“:”ConnectionError“,
我不明白为什么。
公有子网的路由表如下所示:
qazxsw poi对qazxsw poi的请求应该与qazxsw poi目标相匹配。为什么互联网网关(igw)无法向GET
发送请求并获取网站内容?
这个http://www.google.com
说我必须在私有子网内设置lambda函数才能访问互联网。
如果您的Lambda函数需要访问私有VPC资源(例如,Amazon RDS数据库实例或Amazon EC2实例),则必须将该函数与VPC相关联。如果您的功能还需要Internet访问(例如,要访问公共AWS服务端点),则您的功能必须使用NAT网关或实例。
但它没有解释为什么我不能在公有子网内设置lambda函数。
即使Lambda函数在公有子网内运行,Lambda函数无法访问Internet的原因是Lambda函数在VPC中运行时不能拥有公共IP地址,因此它们唯一的选择是通过NAT进行路由。
公有子网中的默认路由目标是IGW,而不是NAT设备,并且Lambda函数仅具有私有IP地址,因此将丢弃通过来自Lambda函数的IGW到因特网的所有分组。
如果您的Lambda函数实际上不需要访问VPC中的私有资源,那么您通常不需要将Lambda部署到VPC中。但如果确实需要,则在私有子网中运行Lambda函数,并确保到公共子网中的NAT实例或NAT网关的默认路由。