为什么VPC中的公有子网内的AWS lambda函数无法连接到Internet?

问题描述 投票:0回答:1

我按照教程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“,

我不明白为什么。

公有子网的路由表如下所示:

enter image description here

qazxsw poi对qazxsw poi的请求应该与qazxsw poi目标相匹配。为什么互联网网关(igw)无法向GET发送请求并获取网站内容?

这个http://www.google.com说我必须在私有子网内设置lambda函数才能访问互联网。

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

但它没有解释为什么我不能在公有子网内设置lambda函数。

amazon-web-services aws-lambda vpc
1个回答
6
投票

即使Lambda函数在公有子网内运行,Lambda函数无法访问Internet的原因是Lambda函数在VPC中运行时不能拥有公共IP地址,因此它们唯一的选择是通过NAT进行路由。

公有子网中的默认路由目标是IGW,而不是NAT设备,并且Lambda函数仅具有私有IP地址,因此将丢弃通过来自Lambda函数的IGW到因特网的所有分组。

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

© www.soinside.com 2019 - 2024. All rights reserved.