NodeJS环境下Lambda查询DynamoDB超时,求问题原因排查
问题
我有一个Lambda函数需要查询DynamoDB中的表。
该DynamoDB表通过以下代码创建:
params = { TableName: TableName, Item: { 'id' : {'S': someid}, 'value' : {'S': 'somevalue'}, 'requestfiltereddate' : {'N' : String(FilteredDate)}, 'uri':{'S': uri}, 'ip':{'S': ip}, 'useragent':{'S': userAgent}, } }; await ddb.putItem(params).promise();
该表在requestfiltereddate字段上创建了名为requestfiltereddate-index的索引。
我尝试使用以下代码查询该表:
params = { TableName: 'MyTable', IndexName: "requestfiltereddate-index", KeyConditionExpression: "requestfiltereddate = :date1", ExpressionAttributeValues: {":date1": {"N": String(Date.now())}}, ProjectionExpression: "id" }; var results = await ddb.query(params).promise();
测试函数时未得到结果,反而出现无有效排查信息的通用错误:
Response { "errorMessage": "2023-01-06T01:48:52.156Z 555e0a58-e021-4ae2-b431-xxxxxxx Task timed out after 1.05 seconds" } Function Logs START RequestId: 555e0a58-e021-4ae2-b431-xxxxxxxxxxxxx Version: $LATEST 2023-01-06T01:48:52.156Z 555e0a58-e021-4ae2-b431-xxxxxxxxxxxxx Task timed out after 1.05 seconds END RequestId: 555e0a58-e021-4ae2-b431-xxxxxxxxxxxxx REPORT RequestId: 555e0a58-e021-4ae2-b431-xxxxxxxxxxxxx Duration: 1054.53 ms Billed Duration: 1000 ms Memory Size: 128 MB Max Memory Used: 26 MB Request ID 555e0a58-e021-4ae2-b431-xxxxxxxxxxxxx
请问我哪里出错了?
分析与解决
- Lambda超时限制导致无有效错误信息:当前Lambda的超时时间设置为1秒,日志显示执行时间1054ms超出限制,直接触发超时中断。先把Lambda的超时时间调高到3-5秒,这样能获取到真正的错误详情,而非被超时打断。
- 查询条件精确匹配几乎不可能命中数据:你用
Date.now()作为查询值,它返回的是当前时间的毫秒数,但存入表中的FilteredDate是另一个特定时间值,两者完全相等的概率极低,这会导致查询不到数据。如果是要查询时间范围,把KeyConditionExpression改成范围比较(比如requestfiltereddate >= :startDate AND requestfiltereddate <= :endDate);如果是查特定时间,要确保:date1的值和存入的FilteredDate完全一致。 - IAM权限缺失可能导致请求卡住:检查Lambda的IAM角色是否包含
dynamodb:Query权限,且权限覆盖目标表和对应的requestfiltereddate-index索引。权限不足会导致请求无法正常执行,最终超时。 - 索引配置需验证:确认
requestfiltereddate-index是基于requestfiltereddate字段的有效索引,且索引的键类型与表中该字段的类型一致(均为数字类型N)。如果索引未创建完成或配置错误,查询会异常。
内容的提问来源于stack exchange,提问作者Thomas Carlton
相关产品推荐
相关产品推荐

