我正在使用无服务器框架在AWS上创建Lambda。
我添加了以下简单代码来测试lambda中的Internet连接
try:
# see if we can resolve the host name -- tells us if there is
# a DNS listening
host = socket.gethostbyname('www.google.com')
# connect to the host -- tells us if the host is actually
# reachable
s = socket.create_connection((host, 80), 2)
s.close()
logging.info('Internet connectivity is present')
except Exception as e:
logging.info('Internet connectivity is not present: {}'.format(e))
此代码始终无法连接到互联网,提示timed out
。我正在自己的VPC中启动lambda(我将重新使用RDS VPC)
我已经创建了自己的VPC,它的子网很少,每个子网都可以连接到Internet网关
这是我的安全组配置的样子
如here所示,如果子网具有igw路由,则它应该可以访问Internet。我已经通过启动EC2实例并尝试从那里ping进行了验证,我成功地做到了。
我在这里想念什么?如何通过Lambda代码启用Internet访问?
答案 0 :(得分:2)
您已经理解它是正确的,但是VPC中的Lambda的工作方式略有不同。要从VPC中的Lambda获得Internet访问权限,您需要具有NAT网关,NAT实例等,您不能将IGW与Lambda一起使用,因为用于Lambda的ENI未被分配公共IP地址,因此IGW路由不会工作。
以下是文档: https://aws.amazon.com/premiumsupport/knowledge-center/internet-access-lambda-function/
您可以将NAT网关附加到“子网路由”表,它将起作用。 (NAT网关应在具有IGW路由表的子网中启动)
答案 1 :(得分:1)
Lambda无法获得公共IP,因此您需要在公共子网中使用NAT网关。到Internet网关的路由表不是有效的选项。在Lambda功能中打开VPC时,将显示信息消息。
启用VPC时,您的Lambda功能将失去默认的Internet访问。如果您需要外部Internet访问功能,请确保安全组允许出站连接,并且您的VPC具有NAT网关。