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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 11:35:29