代码之家  ›  专栏  ›  技术社区  ›  Brian

为什么专有网络中的公用子网内的AWS lambda函数不能连接到互联网?

  •  0
  • Brian  · 技术社区  · 6 年前

    我遵循了教程 here 创建具有公共和私有子网的专有网络。

    import requests
    
    def lambda_handler(event, context):
        r = requests.get('http://www.google.com')
        print(r)
    

    上面的函数无法获取 http://www.google.com 当我把它设置在专有网络的公共子网中时。

    错误信息如下:

    url:/(由以下原因引起)超过了最大重试次数 NewConnectionError(':建立新连接失败:[Errno 110]

    我不明白为什么。

    enter image description here

    GET 请求到 http://www.google.com igw-XXXXXXXXX 目标。为什么internet网关(igw)不能将请求传递给 把网站内容拿回来?

    这个 article 说我必须在私有子网内设置lambda函数才能访问internet。

    如果Lambda函数需要访问私有专有网络资源(例如 例如,Amazon RDS DB实例或Amazon EC2实例),您必须 将函数与专有网络相关联。如果您的功能还需要

    但这并不能解释为什么我不能在公共子网内设置lambda函数。

    1 回复  |  直到 6 年前
        1
  •  88
  •   jarmod    4 年前

    尽管Lambda函数连接到VPC的公共子网,但Lambda函数无法访问internet的原因是Lambda函数没有、也不能有公共IP地址。除非你有一个公共IP,否则你不能通过专有网络的互联网网关向互联网发送流量。

    公众的 子网是 Internet Gateway (IGW) 不是NAT,因为Lambda函数只有一个私有IP,所以从Lambda函数到internet的所有数据包都将在IGW上丢弃。

    如果Lambda函数实际上不需要访问专有网络中的私有资源,那么通常不需要将Lambda附加到专有网络。但如果确实需要,则将Lambda函数附加到私有子网,并确保从该子网到公用子网中的NAT实例或NAT网关的默认路由。并配置一个IGW,没有它就无法访问互联网。

    NAT gateway charges how to reduce data transfer costs for NAT gateway .

    VPC Endpoint 那你根本不需要通过NAT。