Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python AWS lambda函数可以';我不能上网_Python_Amazon Web Services_Networking_Aws Lambda_Vpc - Fatal编程技术网

Python AWS lambda函数可以';我不能上网

Python AWS lambda函数可以';我不能上网,python,amazon-web-services,networking,aws-lambda,vpc,Python,Amazon Web Services,Networking,Aws Lambda,Vpc,我正在运行一个lambda函数,我想访问私有数据库服务器和internet。我可以很好地访问数据库,但我不能访问互联网 设置: VPC (10.0.0.0/16) Public-Subnet (10.0.0.0/24) NAT-Security-Group (see security groups below) NAT-Server (AMI NAT instance) Private-Subnet-1 (10.0.1.0/24) & Priv

我正在运行一个lambda函数,我想访问私有数据库服务器和internet。我可以很好地访问数据库,但我不能访问互联网

设置:

VPC (10.0.0.0/16)
   Public-Subnet (10.0.0.0/24)
      NAT-Security-Group (see security groups below)
         NAT-Server (AMI NAT instance)

   Private-Subnet-1 (10.0.1.0/24) & Private-Subnet-2 (10.0.2.0/24)
      DB-Security-Group (see security groups below)
         DB-Server (RDS PostgreSQL instance)

      Lambda-Security-Group (see security groups below)
         Lambda-Function
安全组包括:

NAT-Security-Group
   Inbound:
      HTTP & HTTPS from source: Lambda-Security-Group
      SSH from 0.0.0.0/0
   Outbound:
      All traffic

DB-Security-Group
   Inbound:
      PostgreSQL from source: Lambda-Security-Group
   Outbound:
      All traffic

Lambda-Security-Group
   Inbound:
      HTTP & HTTPS from source: NAT-Security-Group
   Outbound:
      All traffic
子网的路由表包括:

Public-Subnet:
   10.0.0.0/16 local
   0.0.0.0/0 Internet-Gateway

Private-Subnet-1 & Private-Subnet-2
   10.0.0.0/16 local
   0.0.0.0/0 NAT-Server

我在这里不知所措。为什么lambda功能不能到达internet(连接超时错误)?

您需要在公共子网中创建一个NAT网关,并将lambda所在子网的出口流量路由到NAT网关

要执行此操作,请将NAT网关设置为路由表中的默认网关,该路由表连接到Lambda所在的子网

有关更多详细信息,请参阅文档。

公共子网中的lambda 因为您只需要从lambda与DB通信,所以将lambda放入公共子网,而不需要安装NAT网关。 无论如何,不会像ELB那样直接访问lambda,如果通过API端点进行访问,则必须连接到API网关

私有子网中的lambda
  • 将NAT route out添加到与所有地址0.0.0.0/0的专用子网关联的路由表中
  • 将所有0.0.0.0/0的IGW路由输出添加到与公共子网关联的路由表中
  • 将NAT置于公共子网中

这将解决从lambda访问internet的问题。但只有当您使用安装在EC2中的DB进行将来的补丁管理或从bastion主机进行任何类型的其他访问时,它才非常有用。如果使用RDS,将lambda放入专用子网是没有意义的

问题在于安全组的入站/出站规则。通过上述配置,我更新了安全组以匹配:

NAT-Security-Group
   Inbound:
      HTTP & HTTPS from source: Lambda-Security-Group
      SSH from source: 0.0.0.0/0
   Outbound:
      HTTP & HTTPS to destination: 0.0.0.0/0

DB-Security-Group
   Inbound:
      PostgreSQL from source: Lambda-Security-Group
   Outbound:
      None

Lambda-Security-Group
   Inbound:
      None
   Outbound:
      HTTP & HTTP to destination: NAT-Security-Group
      PostgreSQL to source: DB-Security-Group

Lambda函数现在具有internet连接。

您可以将EC2实例与具有相同安全组的Lambda函数放在同一子网中并访问internet吗?不确定-即使我向Lambda-security-Group添加入站SSH规则,我也无法使用SSH访问EC2实例。问题在于安全组-如果我设置了允许所有入站/出站流量的规则一切正常。NAT网关由NAT实例负责-我使用实例来避免NAT网关的成本,除非流量需要。NAT实例可以。您仍然收到错误?是-Lambda函数没有连接。将Lambda放入公共子网是否存在安全风险?文档中甚至没有讨论这个场景,论坛中也有很多“不要这样做”的评论。没有提到这样的评论,但是从上面我提到的API网关的访问角度来看,否则需要调用API调用。从安全角度看什么都没有。