AWS Lambda 与 API Gateway 502 集成错误

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

我在具有 Lambda 集成的 API 网关中有 2 个简单的

GET
请求。 两者都是简单的 Hello World 类型示例,并且 lambda 代码几乎相同 - 除了一个 Lambda 是
Async
而另一个不是。

异步的工作正常,Api 网关处的非异步调用错误为 502 错误:

{
  "message": "Internal server error"
}

x-amzn-errortype    InternalServerErrorException

我不知道为什么会这样。

我在 API 网关中启用了跟踪和日志记录,我可以看到日志显示响应格式错误:

Received response. Status: 200, 
Integration latency: 25 ms 
Method completed with status: 502 
Execution failed due to configuration error: Malformed Lambda proxy response 
Endpoint response body before transformations: null

这是两个 lambda 表达式的代码。 每个的响应都是相同的。两个 lambda 具有相同的角色和权限等。两个响应均符合 AWS 要求的响应格式。 两个 Lambda 都执行正常,没有错误。 错误出在 API Gateway 端。

什么可能导致此问题?

// 工作正常

import { APIGatewayProxyEvent, APIGatewayProxyResult } from 'aws-lambda';

export const handler = async (event: APIGatewayProxyEvent): Promise<APIGatewayProxyResult> => {
  console.log('Received event:', JSON.stringify(event, null, 2));
  // Example of a fake async operation
  await new Promise((resolve) => setTimeout(resolve, 0));

  const response: APIGatewayProxyResult = {
    statusCode: 200,
    headers: {
      'Content-Type': 'application/json',
    },
    body: JSON.stringify({
      message: 'Hello, World!',
      input: event,
    }),
  };

  return response;
};

// 不起作用:

import { APIGatewayProxyEvent, APIGatewayProxyResult, Context } from 'aws-lambda';

export function handler(event: APIGatewayProxyEvent, context: Context): APIGatewayProxyResult {
  console.log('event', event);
  console.log('context', context);

  const response: APIGatewayProxyResult = {
    statusCode: 200,
    headers: {
      'Content-Type': 'application/json',
    },
    body: JSON.stringify({
      message: 'Hello, World!',
      input: event,
    }),
  };

  return response;
}
typescript amazon-web-services aws-lambda aws-api-gateway
1个回答
0
投票

这里的问题似乎是同步 Lambda 直接返回响应,而不是使用 Promise,而在使用 AWS API Gateway 与 Lambda 代理集成时需要使用 Promise。 API Gateway 期望 Lambda 处理程序在设置为使用异步行为时返回 Promise(直接或通过 async 关键字隐式返回 Promise)。

在同步 Lambda 函数中,尝试将响应包装在 Promise.resolve() 中,以便 API 网关可以正确处理响应。以下是修改第二个(同步)Lambda 来解决问题的方法:

import { APIGatewayProxyEvent, APIGatewayProxyResult, Context } from 'aws-lambda';

export function handler(event: APIGatewayProxyEvent, context: Context): Promise<APIGatewayProxyResult> {
  console.log('event', event);
  console.log('context', context);

  const response: APIGatewayProxyResult = {
    statusCode: 200,
    headers: {
      'Content-Type': 'application/json',
    },
    body: JSON.stringify({
      message: 'Hello, World!',
      input: event,
    }),
  };

  // Wrap the response in a Promise to meet the async expectation of API Gateway
  return Promise.resolve(response);
}

或者,您可以切换处理程序以使用 async 关键字,类似于您的工作 Lambda。

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