AWS Lambda+DynamoDB无服务器API遇内部服务器错误求助
1. 修复Lambda代码的异常处理逻辑
你的Lambda代码中,await client.send(command) 放在了try/catch块之外,这意味着如果DynamoDB的写入操作失败(比如权限不足、表不存在等),会直接抛出未捕获的异常,导致Lambda返回错误,进而触发API Gateway的"Internal Server Error"。
修改后的代码:
import { DynamoDBClient } from '@aws-sdk/client-dynamodb' import { DynamoDBDocumentClient, PutCommand } from '@aws-sdk/lib-dynamodb' import { APIGatewayProxyEvent, APIGatewayProxyResult } from 'aws-lambda' import { v4 } from 'uuid' const dynamo = new DynamoDBClient({}) const client = DynamoDBDocumentClient.from(dynamo) export const handler = async (events: APIGatewayProxyEvent): Promise<APIGatewayProxyResult> => { try { const body = JSON.parse(events.body!) const command = new PutCommand({ TableName: "DynamoUsers", Item: { id: v4(), name: body.name, password: body.password }, }) await client.send(command) return { statusCode: 201, body: JSON.stringify({ message: "用户创建成功" }) } } catch (err) { console.error('DynamoDB操作失败:', err) return { statusCode: 500, body: JSON.stringify({ error: "用户创建失败", details: err instanceof Error ? err.message : String(err) }) } } }
关键修改点:
- 将所有可能出错的逻辑(解析请求体、DynamoDB写入)都放入
try块 - 在
catch中记录详细错误日志,方便后续排查 - 返回符合API Gateway要求的结构化错误响应,同时使用合适的状态码(比如201表示资源创建成功)
2. 验证Lambda执行角色的权限
确保Lambda的执行角色拥有对DynamoUsers表的dynamodb:PutItem权限。在Terraform中,你需要为Lambda的IAM角色添加对应的权限策略:
resource "aws_iam_role_policy" "lambda_dynamodb_access" { name = "LambdaDynamoDBPutAccess" role = aws_iam_role.lambda_exec_role.id policy = jsonencode({ Version = "2012-10-17" Statement = [ { Effect = "Allow" Action = "dynamodb:PutItem" Resource = aws_dynamodb_table.users_table.arn # 替换为你的DynamoDB表ARN } ] }) }
如果没有这个权限,DynamoDB的写入操作会失败,进而触发Lambda的未捕获异常。
3. 检查CloudWatch完整日志
你看到的INFO Success只是DynamoDB客户端返回的成功响应,但如果Lambda在这之后抛出错误(比如之前的代码中,await client.send(command)在try外,失败时直接抛错),CloudWatch会有对应的错误日志。请查看Lambda函数的CloudWatch日志组,找到ERROR级别的日志,里面会包含具体的错误信息(比如权限不足、表不存在、请求体格式错误等)。
4. 验证请求体格式
确保POST请求的Content-Type为application/json,并且请求体是合法的JSON格式(比如{"name": "test", "password": "123456"})。如果请求体格式错误,JSON.parse(events.body!)会抛出异常,同样会导致Internal Server Error。
内容的提问来源于stack exchange,提问作者dya_only

