节点AWS Lambda提取请求失败

时间:2020-09-27 07:25:30

标签: node.js amazon-web-services aws-lambda fetch

我正在使用node-fetch来从lambda向API(托管在具有Serverless Framework的AWS Lambda / API网关上)进行API请求。 Lambda失败,并显示以下调用错误:

{
    "errorType": "FetchError",
    "errorMessage": "request to https://[API].us-east-2.amazonaws.com/[ENDPOINT] failed, reason: connect ETIMEDOUT [IP]:443",
    "code": "ETIMEDOUT",
    "message": "request to https://[API].us-east-2.amazonaws.com/[ENDPOINT] failed, reason: connect ETIMEDOUT [IP]:443",
    "type": "system",
    "errno": "ETIMEDOUT",
    "stack": [
        "FetchError: request to https://[API].us-east-2.amazonaws.com/[ENDPOINT] failed, reason: connect ETIMEDOUT [IP]:443",
        "    at ClientRequest.<anonymous> (/var/task/node_modules/node-fetch/lib/index.js:1461:11)",
        "    at ClientRequest.emit (events.js:315:20)",
        "    at TLSSocket.socketErrorListener (_http_client.js:426:9)",
        "    at TLSSocket.emit (events.js:315:20)",
        "    at emitErrorNT (internal/streams/destroy.js:92:8)",
        "    at emitErrorAndCloseNT (internal/streams/destroy.js:60:3)",
        "    at processTicksAndRejections (internal/process/task_queues.js:84:21)"
    ]
}

以下是有问题的lambda,其中删除了多余的代码:

"use strict";

import { PrismaClient } from "@prisma/client";
import fetch from "node-fetch";

const prisma = new PrismaClient();

module.exports.handler = async (event, context, callback) => {
  const users = await prisma.user.findMany();

  for (const user of users) {
    await fetch(...); // this is where the error occurs
  }
};

该代码在本地运行良好(lambda本身中的代码以及手动发出请求的代码)。因此,我认为可以通过为lambda设置NAT /将VPC配置为具有外部Internet访问来解决此问题,尽管如果确实存在问题,我不确定如何使用Serverless Framework做到这一点。尝试执行获取请求的lambda与API在同一VPC中。任何帮助或想法,我们将不胜感激!

1 个答案:

答案 0 :(得分:0)

我通过为lambda函数添加VPC endpoint解决了这一问题。我相信一种替代解决方案(尽管可能更昂贵)是为Lambda设置一个NAT gateway