我在具有 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;
}
这里的问题似乎是同步 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。