使用 ElasticBeanstalk 部署 Python Flask API 模块,该模块在 2 个私有子网中运行,连接到具有 NAT 网关的路由表,并根据需要具有出站入站访问权限。
将一个 Lambda 函数部署在与 Python 模块相同的 VPC 的另外 2 个私有子网中,并附加相同的 NAT 网关。
规则: Python 安全组 出站:0.0.0.0 -- 全部 入站:来自 Lambda 安全组的 80、443
Lambda 安全组 出站:0.0.0.0 -- 全部 入站:来自 Python 模块安全组的 80、443(不需要,但出于跟踪目的而添加) 入站:VPC 端点的 SG 访问 Secrets Manager
QUE:我可以直接使用 Elastic Beanstalk 中的自动生成的 HTTP API 链接调用 API 模块吗?直接使用 Lambda 中的请求模块,而不需要任何负载均衡器?
错误:
TTPConnectionPool(host='MY-URL.elasticbeanstalk.com', port=80):超过 url 的最大重试次数:/APIModuleNameData(由 ConnectTimeoutError 引起(
我的出站连接正常。
尝试过:为Python模块的入站和出站SG提供完整的网络访问权限。 直接登录 Ec2 进行 NAT 网关访问检查
您的 Elastic Beanstalk 安全组具有以下入站规则:
所有入站:来自 Lambda 安全组的 80、443
如果 Lambda 函数使用 EC2 服务器的私有 IP 地址来保持 VPC 内的网络连接,则该规则将仅允许 Lambda 函数连接到 Elastic Beanstalk EC2 服务器。
您使用的 Elastic Beanstalk DNS 名称几乎肯定会解析为 EC2 服务器的公共 IP 地址。这意味着 Lambda 函数必须通过 NAT 网关将网络请求发送到 VPC 之外,然后该请求通过映射到 EC2 实例的公共 IP 返回到 VPC。此时(网络连接离开 VPC 并重新进入 VPC)与 Lambda 函数安全组的关联将丢失,因此 EC2 实例的安全组将拒绝该请求。
我可以使用 Elastic Beanstalk 的自动生成的 HTTP API 链接直接调用 API 模块吗
不,我认为这行不通。您需要更改 Lambda 函数以使用 EC2 实例的私有 IP 地址,而不是 Elastic Beanstalk 环境的 DNS 名称。