无服务器公共访问

时间:2019-09-17 12:43:08

标签: python amazon-web-services aws-lambda serverless-framework

我正在使用无服务器框架在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网关

Subnet having Internet connectivity

这是我的安全组配置的样子

Security Group allows outbound traffic

here所示,如果子网具有igw路由,则它应该可以访问Internet。我已经通过启动EC2实例并尝试从那里ping进行了验证,我成功地做到了。

我在这里想念什么?如何通过Lambda代码启用Internet访问?

2 个答案:

答案 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网关。