Java CDK实现AWS Lambda DynamoDB深度嵌套事件过滤问询
Java CDK处理DynamoDB深度嵌套事件过滤的方案
不用急着转L1类,Java CDK的L2 API其实完全支持嵌套路径的事件过滤,核心是用点分隔的完整属性路径,再加上DynamoDB流记录的类型后缀就行,逻辑和JS示例一致,只是语法适配Java。
比如要过滤dynamodb.Keys.PK等于特定字符串值的事件,代码可以这么写:
FilterCriteria pkFilter = FilterCriteria.filter( Map.of( "dynamodb.Keys.PK.S", FilterRule.equals("USER#123") ) );
这里的.S是因为DynamoDB流里的字符串类型属性会被拆分为{ "S": "值" }的结构,其他类型对应后缀:数字用.N,布尔用.BOOL,列表用.L,根据实际数据类型调整即可。
如果需要组合多个过滤条件(比如同时排除DELETE事件+匹配指定PK),可以用FilterCriteria.and()或FilterCriteria.or()拼接:
// 排除DELETE事件 FilterCriteria excludeDelete = FilterCriteria.filter( Map.of("eventName", FilterRule.notEquals("DELETE")) ); // 匹配指定PK FilterCriteria matchPk = FilterCriteria.filter( Map.of("dynamodb.Keys.PK.S", FilterRule.equals("USER#123")) ); // 组合两个条件 FilterCriteria combinedFilter = FilterCriteria.and(excludeDelete, matchPk);
只有当L2 API确实满足不了极复杂的过滤逻辑时,再考虑降级到L1的CfnEventSourceMapping,手动构造JSON格式的过滤规则:
CfnEventSourceMapping eventSource = CfnEventSourceMapping.Builder.create(this, "DdbStreamMapping") .functionArn(myLambda.getFunctionArn()) .eventSourceArn(myDdbTable.getStreamArn()) .eventFilter(Map.of( "filters", List.of( Map.of( "eventName", Map.of("ne", "DELETE"), "dynamodb.Keys.PK.S", Map.of("eq", "USER#123") ) ) )) .build();
核心思路就是:优先用L2的FilterCriteria简化开发,嵌套路径通过点语法+类型后缀实现;特殊场景再用L1手动配置。
内容的提问来源于stack exchange,提问作者Nicklas Karlsson
相关产品推荐
相关产品推荐

