【问题标题】:Parameter validation failed: Invalid type for parameter Key., value: , type: <class 'str'>, valid types: <class 'dict'>参数验证失败:参数 Key 的类型无效。值:,类型:<class \'str\'>,有效类型:<class \'dict\'>
【发布时间】:2022-11-20 08:30:23
【问题描述】:

我有 2 个 Lambda,其中 1 个正在对 ddb 执行 batch_write 和 put_item。另一个 lambda 从第一个 lambda 执行 get_item(它具有 get_item 的权限)。

错误:

[ERROR] ParamValidationError: Parameter validation failed:
Invalid type for parameter Key.active_employee, value: jen, type: <class 'str'>, valid types: <class 'dict'>
Traceback (most recent call last):
  File "/var/task/my_lambda/checks.py", line 100, in lambda_handler
    response = ddb.get_item(TableName="testtable", Key={"active_employee": user})

拉姆达 1:

        with gzip.open(response["Body"], "rt") as file:
        try:

            with table.batch_writer(overwrite_by_pkeys=["active_employee"]) as batch:
                for active_users in file:
                    user_dict = json.loads(active_users)
             
                    manager = user_dict["manager"]
                    user = user_dict["user"]


                    if not manager:
                        continue


                    if not user:
                        continue
                 
        
                    else:
                        batch.put_item(
                            Item={
                                "active_employee": user,
                                "mgr_email": mgr_email
            
                            },
                        )

            logger.info("Loaded data into table %s.", table.name)

        except ClientError:
            logger.exception("Couldn't load data into table %s.", table.name)
            raise

λ2


user = "jen"

    ddb = boto3.client("dynamodb")
    response = ddb.get_item(TableName="testtable", Key={"active_employee": user})
    employee_data = json.loads(response["Item"])
    if employee_data and employee_data["active_employee"] == user:
        manager = employee_data["mgr_email"]
        print(f"{user} is active")
        print(f"{manager}")
    else:
        print("user not in ddb")

我期待进入 Lambda jen is active,然后是经理电子邮件。我不知道经理的价值。假设 DDB 中有一百万,我不能使用扫描或查询。我读过 get_item 在获取单个项目时要快得多。

  • 如何修复错误?
  • 如何将_item 获取为字典? user = "jen" 应该编成字典吗?语法是什么?
  • 在执行 get_item 时,我只能使用 pk 并期望也获得另一个密钥 (mgr_email)。我只能 get_item 用户,我需要它来为我查找该别名的经理电子邮件(如果存在)并返回两者。

【问题讨论】:

    标签: python amazon-dynamodb


    【解决方案1】:

    在 Lambda 2 中,您使用的是低级客户端,它需要 DynamoDB JSON,例如:

    {'active_employee':{'S':'jen'}}

    现在,为了让它在您当前的上下文中工作,您最好使用 Resource 客户端,就像您在 Lambda 1 中所做的那样。

    dynamodb = boto3.resource("dynamodb", region_name='us-west-2')
    
    table = dynamodb.Table('testtable')
    
    try:
        response = table.get_item(
            Key={
                'active_employee': "jen"
            }
        )
    except ClientError as e:
        print(e.response['Error']['Message'])
    
    

    注意不要混淆您的客户端,并始终参考您正在使用的特定客户端的文档。

    资源客户端:https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/dynamodb.html#DynamoDB.Table.get_item

    低级客户端:https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/dynamodb.html#DynamoDB.Client.get_item

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多