AWS lambda 函数无法访问互联网
AWS lambda function can't reach the internet
我是 运行 一个 lambda 函数,我想访问私有数据库服务器和互联网。我可以很好地连接到数据库,但是我无法连接到互联网。
设置:
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 函数无法访问互联网(连接超时错误)?
您需要在 public 子网中创建一个 NAT 网关,并通过 NAT 网关路由来自放置 Lambda 的子网的出口流量。
为此,将 NAT 网关设置为路由 table 中的默认网关,该路由 table 附加到 Lambda 所在的子网。
有关详细信息,请参阅文档中的 Internet Access for Lambda Functions。
public 子网中的 lambda
由于您只需要从 lambda 与 DB 通信,将 lambda 放入 public 子网中,您不需要安装 NAT 网关。
无论如何,不会像 ELB 那样直接访问 lambda,并且必须附加到 API 网关,以防通过 API 端点进行任何访问。
私有子网中的 lambda
- 将 NAT 路由添加到与所有地址 0.0.0.0/0
的私有子网关联的路由 table
- 为所有 0.0.0.0/0 添加到 IGW 的路由到与 public 子网关联的路由 table。
- 在 public 子网中放置 NAT
这应该可以解决从 lambda 访问互联网的问题。但是只有在您要使用安装在 EC2 中的数据库以用于将来的补丁管理或来自堡垒主机的任何其他类型的访问时才有用。如果使用 RDS,将 lambda 放在私有子网中毫无意义。
问题出在安全组的 inbound/outbound 规则上。通过上面的配置,我更新了安全组以匹配:
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 函数现在可以连接互联网。
我是 运行 一个 lambda 函数,我想访问私有数据库服务器和互联网。我可以很好地连接到数据库,但是我无法连接到互联网。
设置:
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 函数无法访问互联网(连接超时错误)?
您需要在 public 子网中创建一个 NAT 网关,并通过 NAT 网关路由来自放置 Lambda 的子网的出口流量。
为此,将 NAT 网关设置为路由 table 中的默认网关,该路由 table 附加到 Lambda 所在的子网。
有关详细信息,请参阅文档中的 Internet Access for Lambda Functions。
public 子网中的 lambda
由于您只需要从 lambda 与 DB 通信,将 lambda 放入 public 子网中,您不需要安装 NAT 网关。 无论如何,不会像 ELB 那样直接访问 lambda,并且必须附加到 API 网关,以防通过 API 端点进行任何访问。
私有子网中的 lambda
- 将 NAT 路由添加到与所有地址 0.0.0.0/0 的私有子网关联的路由 table
- 为所有 0.0.0.0/0 添加到 IGW 的路由到与 public 子网关联的路由 table。
- 在 public 子网中放置 NAT
这应该可以解决从 lambda 访问互联网的问题。但是只有在您要使用安装在 EC2 中的数据库以用于将来的补丁管理或来自堡垒主机的任何其他类型的访问时才有用。如果使用 RDS,将 lambda 放在私有子网中毫无意义。
问题出在安全组的 inbound/outbound 规则上。通过上面的配置,我更新了安全组以匹配:
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 函数现在可以连接互联网。