繁体   English   中英

使用 Python 在 Lambda 中查询 DynamoDB 时出现“内部服务器错误”

[英]"Internal Server Error" when querying of DynamoDB in Lambda using Python

我目前正在尝试使用分区键“Name”读取我的 dynamodb 表“saved_measurements”。 我通过 API 网关 Lambda 代理集成来执行此操作,并且已经测试了我的event['pathParameters']['name']工作正常,所以这不应该是问题。

但是,当我用我的“名称”查询我的 dynamodb 表时,出现错误。

{"message": "Internal server error"}

我参考了许多资源来查询 dynamodb,但似乎没有任何效果。 我还尝试在响应正文中打印一个示例字符串,例如“是”,并且没有任何问题。 只有当我尝试在响应正文中发送数据时,我才会再次遇到该问题。

我可以尝试解决这个问题吗?

import json
import boto3
from boto3.dynamodb.conditions import Key, Attr

def lambda_handler(event, context):
  client = boto3.resource('dynamodb')
  table = client.Table('saved_measurements')

  data = table.query(KeyConditionExpression=Key('Name').eq(event['pathParameters']['name']))
  stuff = data.Items

  response = {
    "statusCode": 200,
    "headers": {
      "Content-Type": 'application/json',
      "Access-Control-Allow-Origin" : "*",
      "Access-Control-Allow-Headers" : "Content-Type",
      "Access-Control-Allow-Methods": "OPTIONS,POST,GET"
    },
    "body": json.dumps(stuff),
    "isBase64Encoded": False
  }
  
  return response

您的代码需要一些优化,但我不确定它会解决问题。 分享一下我是怎么写的:

import json
import boto3
from boto3.dynamodb.conditions import Key, Attr
client = boto3.resource('dynamodb')
table = client.Table('saved_measurements')
def lambda_handler(event, context):
    status_code=0
    stuff = ""
    try:
        data = table.query(KeyConditionExpression=Key('Name').eq(event['pathParameters']['name']))
        stuff = json.dumps(data['Items'])
        status_code = 200

    except Exception as e:
        print(e)
        stuff = e
        status_code = 400

    response = {
    "statusCode": status_code,
    "headers": {
        "Content-Type": 'application/json',
        "Access-Control-Allow-Origin" : "*",
        "Access-Control-Allow-Headers" : "Content-Type",
        "Access-Control-Allow-Methods": "OPTIONS,POST,GET"
    },
    "body": stuff,
    "isBase64Encoded": False
    }

    return response

代码中的一些要点:

  1. 在发出 API 请求时随时使用 try/except 块,以确保您不会意外地向下游任务返回异常
  2. 我倾向于不在 Python 中使用点符号,因此我将 date.Items 更改为 data['Items']。 它往往比点符号更有效。
  3. 在 Lambda 中的请求处理程序之外创建您的客户端,这允许 Lambda 跨多个调用重用客户端,这将改善您的延迟。
  4. 无论结果如何,都不要为每个请求返回 200,返回正确的状态代码,这样您的下游流程就不会混淆。

给这些更改一个 go,如果你不成功,请分享你的 APIGW 配置。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM