【问题标题】:Serverless public access无服务器公共访问
【发布时间】:2020-01-18 07:57:00
【问题描述】:

我正在使用无服务器框架在 AWS 上创建 Lambda。

我添加了这个简单的代码来测试我的 lambda 中的互联网连接

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))

此代码始终无法连接到 Internet,提示为 timed out。我正在我自己的 VPC 中启动我的 lambda(具体而言,我正在重新使用 RDS VPC)

我创建了自己的 VPC,它有几个子网,每个子网都连接到 Internet 网关

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

如给定的here,如果子网有 igw 路由,那么它应该可以访问 Internet。我已经通过启动 EC2 实例并尝试从那里 ping 来验证这一点,并且我成功地这样做了。

我在这里缺少什么?如何通过我的 Lambda 代码启用 Internet 访问?

【问题讨论】:

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


    【解决方案1】:

    您已经理解正确,但 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 的路由表的子网中启动)

    【讨论】:

    • 感谢您的回答。我遵循了文档中提到的过程。但我遇到了同样的错误。
    • 以下步骤后,我忘记将公共路由表与公共网络关联。对于私有网络,我已经完成了。谢谢詹姆斯的回答。
    【解决方案2】:

    Lambda 不会获得公共 IP,因此您需要公共子网中的 NAT 网关。到 Internet 网关的路由表不是有效选项。当您在 Lambda 函数中打开 VPC 时,将显示信息消息。

    启用 VPC 后,您的 Lambda 函数将失去默认的互联网访问权限。如果您的函数需要外部 Internet 访问权限,请确保您的安全组允许出站连接并且您的 VPC 具有 NAT 网关。

    【讨论】:

    • 我尝试创建 NAT 网关,但仍然遇到同样的错误。
    猜你喜欢
    • 1970-01-01
    • 2020-08-12
    • 2011-05-08
    • 2014-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多