AWS:将公共子网的 Lambda 连接到私有子网的 Lambda

问题描述 投票:0回答:1

我想检查如何让AWS公共子网的lambda从私有子网的lambda获取信息。

AWS Diagram to be achieved

我受到一些监管限制,我无法让 lambda 使用 lambda 托管 vpc,因为我检查的许多解决方案没有与我的类似情况。

我使用VPC,在控制台上“创建VPC”来创建我的VPC。

以下是VPC设置: 专有网络 IPv4 地址:10.0.0.0/16 每个可用区有 2 个子网(1 个公共子网和 1 个私有子网) 2 使用的可用区(A区和B区) 子网地址如下: A区公有子网IPv4地址:10.0.0.0/20 A 区私有子网 IPv4 地址:10.0.128.0/20 B区公网子网IPv4地址:10.0.16.0/20 B 区私有子网 IPv4 地址:10.0.144.0/20

Lambda 代码位于 NodeJs v20x 中。如果我使用 VPC 端点,客户端 lambda 代码可以正常工作,但由于我的客户有预算限制,我删除了 VPC 端点,并且 InvokeCommand 不再工作。

私有子网 lambda 和公共子网 lambda 函数代码的某些部分已被删除,因为这些是我对数据部分的处理。

公有子网的 lambda (lambdaInPublic) 代码如下:

import { LambdaClient, InvokeCommand, LogType } from "@aws-sdk/client-lambda";
export const handler = async (event) => {
      const client = new LambdaClient({});
      const command = new InvokeCommand({
        FunctionName: "lambdaInPrivate",
        InvocationType: "RequestResponse",
        Payload: JSON.stringify({ qrCode: params.qrCode }),
        LogType: LogType.Tail,
      });
      
      var { Payload, LogResult } = await client.send(command);
      var decodedPayload = Buffer.from(Payload).toString(); 

        const response = {
          statusCode: 200,
          headers:{
          'Content-Type': 'text/html',  
          },
          body: decodedPayload,
        };
        return response;
};

私有子网的 lambda (lambdaInPrivate) 代码如下:

export const handler = async (event) => {
   return "Hi I am from Private Lambda";
};

请建议如何在不使用 VPC 端点的情况下触发时将信息从私有子网的 lambda 获取回公共子网的 lambda。

请告知我的调用命令是否对我的情况有效,并分享我可以实现“使用 VPC 端点触发时,将信息从私有子网的 lambda 返回到公共子网的 lambda”的任何适当代码。

非常感谢

node.js amazon-web-services aws-lambda lambda
1个回答
0
投票

您在此处执行的任何操作都无法更改您的 Lambda 函数连接到 AWS 托管服务 VPC 的事实。两个都。如果这对您来说是一个障碍,那么您需要更深入地研究这个基本上是无意义的合规性要求。例如,您可以向合规团队解释 Lambda 隔离模型。

除此之外,您提出的架构将无法工作,因为“公共”Lambda 函数无法到达 AWS Lambda 服务端点,因此它无法发出任何 Lambda API 请求(因此它无法调用“私有”Lambda 函数)。

Lambda 函数无法直接相互通信。一个要调用另一个,它必须向 AWS Lambda 服务发出 API 请求。或者,它可以向 API Gateway 发出 API 请求,然后触发 Lambda 函数(再次通过 AWS Lambda 服务)。

无论您的“私有”Lambda 函数位于何处,调用“公共”Lambda 函数都需要到 AWS Lambda 服务终端节点的网络路由,以便能够进行 Lambda API 调用。您可以通过 VPC 端点或通过 NAT 和互联网网关提供该路由。

还有。将“公共”Lambda 函数放置在公共子网中是没有意义的。这不会改变 Lambda 函数继续连接到 AWS 托管服务 VPC 的事实。它只是减少了“公共”Lambda 函数的网络路由选项。

顺便说一下,一个 Lambda 函数同步调用另一个 Lambda 函数通常不是一个好主意,因为这样您就同时为这两个函数付费,而调用者除了等待被调用者的响应之外基本上什么也不做.

因此,解决此问题的两个选项是:

  1. 将 VPC 终端节点添加到 VPC 中,以便您的 Lambda 函数可以向 AWS Lambda 服务发出 API 请求。这将允许您的“公共”Lambda 函数调用“私有”Lambda 函数。

  2. 将 NAT 网关添加到您的 VPC,并将“公共”Lambda 函数连接到私有子网(否则无法调用“私有”Lambda 函数)。还要确保从私有子网到 NAT 的默认路由。

这两个选项都可以,但我个人都不会做。理想情况下,您需要在这里重新审视您的需求并更改设计。

© www.soinside.com 2019 - 2024. All rights reserved.