You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让公有子网Lambda调用私有子网Lambda(无VPC端点)

无VPC端点时公有子网Lambda调用私有子网Lambda的实现方案(Node.js v20.x)

核心结论

InvokeCommand完全适用,调用失效的核心原因是网络连通性缺失和权限配置不全,与工具本身无关。

实现方案

1. 确保公有子网Lambda具备公网访问能力

lambdaInPublic部署在公有子网中,需配置以下网络规则:

  • 公有子网关联的路由表添加路由条目:0.0.0.0/0 指向互联网网关(IGW),确保Lambda能访问公网的AWS Lambda API端点
  • lambdaInPublic的安全组允许**出站HTTPS(443端口)**访问公网(默认安全组允许所有出站,若有严格限制,可仅开放AWS Lambda服务的公网IP段)

2. 配置IAM权限

给lambdaInPublic的执行角色添加调用权限

添加如下IAM策略,允许其调用目标私有Lambda:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "lambda:InvokeFunction",
      "Resource": "arn:aws:lambda:<你的AWS区域>:<你的AWS账号ID>:function:lambdaInPrivate"
    }
  ]
}

(可选)私有Lambda资源策略补充

若lambdaInPrivate配置了资源策略限制调用方,需添加允许lambdaInPublic执行角色调用的条目:

{
  "Version": "2012-10-17",
  "Id": "lambdaInPrivateResourcePolicy",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::<你的AWS账号ID>:role/<lambdaInPublic的执行角色名>"
      },
      "Action": "lambda:InvokeFunction",
      "Resource": "arn:aws:lambda:<你的AWS区域>:<你的AWS账号ID>:function:lambdaInPrivate"
    }
  ]
}

3. 私有Lambda无需额外网络配置

lambdaInPrivate部署在私有子网中不影响被调用——因为Invoke操作是通过AWS Lambda服务转发,而非直接的网络连通,只要私有Lambda的执行角色能满足自身业务需求即可。

可行代码示例

import { LambdaClient, InvokeCommand } from "@aws-sdk/client-lambda";

// 初始化Lambda客户端,默认使用环境变量中的凭证,自动走公网访问Lambda API
const lambdaClient = new LambdaClient({ region: "你的AWS区域" });

export const handler = async (event) => {
  try {
    const invokeParams = {
      FunctionName: "lambdaInPrivate", // 目标私有Lambda函数名
      InvocationType: "RequestResponse", // 同步调用模式,直接获取返回结果
      Payload: JSON.stringify({ // 传递给私有Lambda的业务参数
        inputData: "来自公有子网Lambda的请求"
      })
    };

    const command = new InvokeCommand(invokeParams);
    const response = await lambdaClient.send(command);

    // 解析私有Lambda的返回结果
    const privateLambdaResult = JSON.parse(Buffer.from(response.Payload).toString());

    return {
      statusCode: 200,
      body: JSON.stringify({
        success: true,
        message: "调用私有Lambda成功",
        privateLambdaOutput: privateLambdaResult
      })
    };
  } catch (error) {
    console.error("调用失败详情:", error);
    return {
      statusCode: 500,
      body: JSON.stringify({
        success: false,
        error: error.message
      })
    };
  }
};

内容的提问来源于stack exchange,提问作者Jack Lee

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 11:52:33