代码之家  ›  专栏  ›  技术社区  ›  JHH

用于删除操作的DynamoDB流事件中的元数据?

  •  1
  • JHH  · 技术社区  · 6 年前

    我打算使用DynamoDB streams来实现一个日志跟踪,跟踪对许多表的更改(并将其写入S3上的日志文件)。每当对表进行修改时,都会从流事件调用lambda函数。 现在,我需要记录进行修改的用户。 对于 put update ,我可以通过包含一个实际的表属性来解决这个问题,该表属性保存调用方的ID。现在存储在表中的记录将包含这个ID,这并不是真正需要的,因为它更多的是关于操作的元数据,而不是记录本身的一部分,但我可以接受这个。

    例如:

    put({
      TableName: 'fruits',
      Item: {
        id: 7,
        name: 'Apple',
        flavor: 'Delicious',
        __modifiedBy: 'USER_42'
      })
    

    这将导致lambda函数调用,我可以在S3日志文件中写入如下内容:

    table: 'fruits',
    operation: 'put',
    time: '2018-12-10T13:35:00Z',
    user: 'USER_42',
    data: {
        id: 7,
        name: 'Apple',
        flavor: 'Delicious',
    }
    

    但是,对于删除,会出现一个问题-如何记录删除操作的调用用户?当然,我可以提出两个请求,一个更新 __modifiedBy ,另一个则删除该项,流将只获取 来自 OLD_IMAGE 包含在流事件中。然而,这确实是不可取的,必须在一次删除一个项目上花费2次写入。

    1 回复  |  直到 6 年前
        1
  •  5
  •   Matthew Pope    6 年前

    这里有3种不同的选择。正确的选择取决于您的应用程序的要求。可能这些方法都不能在您的特定用例中工作,但一般来说,这些方法都能工作。

    Stream Record

    选择2

    如果在写入dynamodb时可以处理少量开销,那么可以设置一个lambda函数(或基于ec2的服务),作为dynamodb表的写入代理。配置您的权限,以便只有Lambda可以写入表中,然后您可以接受所需的任何元数据,并以任何方式记录它。如果您只需要记录事件,那么就不需要写入S3,因为AWS可以为您处理Lambda日志。

    下面是一个lambda函数的伪代码示例,它使用日志记录而不是写入S3。

    handle_event(operation, item, user)
        log(operation, item, user)
        switch operation
            case put:
                 dynamodb.put(item)
            case update:
                 dynamodb.update(item)
            case delete:
                 dynamodb.delete(item)
    
    log(operation, item, user)
        logEntry.time = now
        logEntry.user = user
        ...
        print(logEntry)
    

    当然,您仍然可以自由地直接登录到S3,但如果您这样做,您可能会发现增加的延迟足以影响您的应用程序。

    选择3

    如果您可以容忍表中的某些陈旧数据,请设置 DynamoDB TTL 在你的桌子上。创建或更新项目时不要设置TTL值。然后,通过将当前时间添加到TTL字段来更新项目,而不是删除项目。据我所知,DynamoDB在删除具有过期TTL的项目时不使用写容量,过期的项目在其过期24小时后被删除。

    这将允许您将添加TTL记录为删除,并具有 last modified by 用于该删除的用户。您可以安全地忽略dynamodb清除过期项目时发生的实际删除。

    在应用程序中,还可以检查TTL值是否存在,这样就不会意外地向用户显示已删除的数据。您还可以向任何将忽略具有TTL集的项的查询添加筛选器表达式。