创建Lambda DynamoDB计数函数

2024-09-30 22:20:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在创建一个SAM web应用程序,其后端是Python Lambda函数前面的一个API,该函数具有一个DynamoDB表,该表维护对API的HTTP调用数。API还必须返回此数字。yaml代码本身正常加载。我的问题是编写Lambda函数来迭代并返回计数。这是我的密码:

def lambda_handler(event, context):
    dynamodb = boto3.resource("dynamodb")
    ddbTableName = os.environ["databaseName"]
    table = dynamodb.Table(ddbTableName)
    # Update item in table or add if doesn't exist
    ddbResponse = table.update_item(
        Key={"id": "VisitorCount"},
        UpdateExpression="SET count = count + :value",
        ExpressionAttributeValues={":value": Decimal(context)},
        ReturnValues="UPDATED_NEW",
    )

    # Format dynamodb response into variable
    responseBody = json.dumps({"VisitorCount": ddbResponse["Attributes"]["count"]})

    # Create api response object
    apiResponse = {"isBase64Encoded": False, "statusCode": 200, "body": responseBody}

    # Return api response object
    return apiResponse

我可以将VisitorCount设置为字符串,但不能设置为数字。我得到这个错误:[ERROR] TypeError: lambda_handler() missing 1 required positional argument: 'cou    response = request_handler(event, lambda_context)le_event_request 发生了什么事

[更新]我发现了原始错误,即SAM应用程序未正确接收该函数。更改名称修复了此问题,现在正在读取。现在我必须对实际的Python进行故障排除。新代码:

import json
import boto3
import os

dynamodb = boto3.resource("dynamodb")
ddbTableName = os.environ["databaseName"] 
table = dynamodb.Table(ddbTableName)
Key = {"VisitorCount": { "N" : "0" }}
    
def handler(event, context):
           # Update item in table or add if doesn't exist
    ddbResponse = table.update_item(
        UpdateExpression= "set VisitorCount = VisitorCount + :val",
        ExpressionAttributeValues={":val": {"N":"1"}},
        ReturnValues="UPDATED_NEW",
    )

    # Format dynamodb response into variable
    responseBody = json.dumps({"VisitorCount": ddbResponse["Attributes"]["count"]})

    # Create api response object
    apiResponse = {"isBase64Encoded": False, "statusCode": 200,"body": responseBody}

    # Return api response object
    return apiResponse

我在第13行得到一个语法错误,这是

UpdateExpression= "set VisitorCount = VisitorCount + :val", But I can't tell where I am going wrong on this. It should update the DynamoDB table to increase the count by 1. Looking at the AWS guide it appears to be the correct syntax.


Tags: 函数eventapiobjectresponsecountcontexttable
1条回答
网友
1楼 · 发布于 2024-09-30 22:20:45

不确定确切的错误是什么,但ddbResponse将是这样的:

ddbResponse = table.update_item(
    Key={
        'key1': aaa,
        'key2': bbb
    },
    UpdateExpression= "set VisitorCount = VisitorCount + :val",
    ExpressionAttributeValues={":val": Decimal(1)},
    ReturnValues="UPDATED_NEW",
)
  • 指定要使用密钥更新的项(一个Lambda调用一个项)
  • ExpressionAttributeValues设置Decimal(1)

https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GettingStarted.Python.03.html#GettingStarted.Python.03.04

相关问题 更多 >