允许 AWS lambda 函数从内部访问 SAAS
Allow AWS lambda function to access SAAS from inside
我有一个完整的 AWS HTTPS Web 服务,包含所有需要的组件,即 VPC 包含:
- 私有 ec2 实例
- 自动缩放组
- 一个负载均衡器(有一个 public 域 xxxxx.eu-west-1.elb.amazonaws.com ,甚至还有一个官方 public 域 xxxxx.com )
- 安全组
所有这些都有效,我可以从亚马逊云外部访问 xxxxx.com(例如,使用基于“net/http”的我的 Golang HTTP 客户端代码),前提是我把我的负载均衡器安全组的入站规则中的客户端 IP 地址(我过滤 IP,因为它是 B2B 服务,所以我不想让任何人进来)。
我还有一个 lambda 函数,我想从那个 lambda 函数访问这个 Web 服务。问题是,lambda 函数没有稳定的 IP 地址。我的请求与 this one 类似,只是我不想直接访问 EC2 实例(因为该服务是可扩展的,所以不建议这样做),只需像亚马逊外部的人一样访问 public 服务云.
目前,我的 lambda 函数可以访问互联网上的任何网站,除了我的 HTTP 网络服务。当我访问我的 HTTP Web 服务时,我的 Golang lambda 客户端(与上面的代码相同,所以这不是客户端问题)在此函数调用中挂起,直到 lambda 超时(如果我在客户端中配置超时,则我的客户端超时):
response, err = client.Do(req) // <--- hangs (client is a http.Client)
我尝试应用推荐的解决方案:
- 允许VPC安全组入站规则中的所有(0.0.0.0/0)。它 有效 ,但正如我所说,我想最终过滤 IP 以仅允许特定客户端(除了我的 lambda)。
- 在VPC(与web服务相同的VPC)中添加lambda函数,为lambda创建一个安全组(没有入站规则,all/default出站规则),并允许该安全组进入在VPC安全组的入站规则中。由于某种原因,它 不起作用 。
是否有解决方案可以满足我的要求?
Add the lambda function in the VPC (the same VPC that the web
service), create a security group for the lambda (with no inbounds
rules, all/default outbounds rules), and allow that security group
into in the inbound rules of the VPC security group. It doesn't work
for some reason.
您在这里的方向是正确的,但不幸的是,您的 public 负载均衡器将由 Lambda 函数解析为它的 public IP 地址,该地址存在于 VPC 之外。因此,Lambda 随后会尝试从 VPC 伸出来访问负载均衡器,此时流量与 Lambda 函数的安全组断开关联。
您有两个选择:
向您的基础架构添加一个内部负载均衡器,并添加一个 Route53 私有托管区域以从您的 VPC 中将域名解析到内部负载均衡器。
在具有到 NAT 网关的路由的 VPC 子网中部署 Lambda 函数,并允许 public 负载均衡器的安全组中的 NAT 网关的弹性 IP 地址。
我有一个完整的 AWS HTTPS Web 服务,包含所有需要的组件,即 VPC 包含:
- 私有 ec2 实例
- 自动缩放组
- 一个负载均衡器(有一个 public 域 xxxxx.eu-west-1.elb.amazonaws.com ,甚至还有一个官方 public 域 xxxxx.com )
- 安全组
所有这些都有效,我可以从亚马逊云外部访问 xxxxx.com(例如,使用基于“net/http”的我的 Golang HTTP 客户端代码),前提是我把我的负载均衡器安全组的入站规则中的客户端 IP 地址(我过滤 IP,因为它是 B2B 服务,所以我不想让任何人进来)。
我还有一个 lambda 函数,我想从那个 lambda 函数访问这个 Web 服务。问题是,lambda 函数没有稳定的 IP 地址。我的请求与 this one 类似,只是我不想直接访问 EC2 实例(因为该服务是可扩展的,所以不建议这样做),只需像亚马逊外部的人一样访问 public 服务云.
目前,我的 lambda 函数可以访问互联网上的任何网站,除了我的 HTTP 网络服务。当我访问我的 HTTP Web 服务时,我的 Golang lambda 客户端(与上面的代码相同,所以这不是客户端问题)在此函数调用中挂起,直到 lambda 超时(如果我在客户端中配置超时,则我的客户端超时):
response, err = client.Do(req) // <--- hangs (client is a http.Client)
我尝试应用推荐的解决方案:
- 允许VPC安全组入站规则中的所有(0.0.0.0/0)。它 有效 ,但正如我所说,我想最终过滤 IP 以仅允许特定客户端(除了我的 lambda)。
- 在VPC(与web服务相同的VPC)中添加lambda函数,为lambda创建一个安全组(没有入站规则,all/default出站规则),并允许该安全组进入在VPC安全组的入站规则中。由于某种原因,它 不起作用 。
是否有解决方案可以满足我的要求?
Add the lambda function in the VPC (the same VPC that the web service), create a security group for the lambda (with no inbounds rules, all/default outbounds rules), and allow that security group into in the inbound rules of the VPC security group. It doesn't work for some reason.
您在这里的方向是正确的,但不幸的是,您的 public 负载均衡器将由 Lambda 函数解析为它的 public IP 地址,该地址存在于 VPC 之外。因此,Lambda 随后会尝试从 VPC 伸出来访问负载均衡器,此时流量与 Lambda 函数的安全组断开关联。
您有两个选择:
向您的基础架构添加一个内部负载均衡器,并添加一个 Route53 私有托管区域以从您的 VPC 中将域名解析到内部负载均衡器。
在具有到 NAT 网关的路由的 VPC 子网中部署 Lambda 函数,并允许 public 负载均衡器的安全组中的 NAT 网关的弹性 IP 地址。