如何过滤DynamoDB流中2019版全局表同步产生的事件数据
DynamoDB 2019版全局表流事件识别跨区同步操作的解决方案
2019版DynamoDB全局表默认没有提供类似2017版的aws:rep:updateregion系统字段,但是可以通过以下两种成熟方案实现识别需求:
方案1:通过流事件元数据直接判断(无需修改业务代码)
DynamoDB全局表的跨区域同步操作,会使用DynamoDB官方服务身份发起写入,对应流事件的userIdentity字段会有固定特征:
userIdentity.type固定为ServiceuserIdentity.principalId固定为dynamodb.amazonaws.com
所有本地区域业务侧发起的写入操作(包括IAM用户、角色、其他AWS服务调用等),userIdentity都不会匹配上述特征,由此可以直接区分是否为跨区同步触发的事件。
参考代码示例(Python):
def lambda_handler(event, context): for record in event['Records']: # 判断是否为全局表跨区同步产生的变更 is_replica_op = record["userIdentity"]["type"] == "Service" \ and record["userIdentity"]["principalId"] == "dynamodb.amazonaws.com" if is_replica_op: # 处理同步过来的变更的逻辑 print(f"收到跨区同步变更,事件ID:{record['eventID']}") else: # 处理本地区域业务发起的变更的逻辑 print(f"收到本地业务变更,事件ID:{record['eventID']}")
方案2:新增自定义字段标记来源区域(可获取具体源区域信息)
如果需要知道变更具体来自哪个区域,可在业务侧所有写入DynamoDB的逻辑中,统一新增一个自定义字段(比如last_write_region),写入时取当前运行环境的AWS区域值即可:
- 代码中直接读取环境变量
AWS_REGION即可获取当前Lambda/应用所在的区域,写入时赋值给自定义字段 - 全局表同步时会同步该自定义字段的取值,在流监听器Lambda中读取该字段即可直接判断变更的源区域
注意:需要确保所有写入、更新表数据的逻辑都统一更新该字段,避免出现取值错误的情况。
内容的提问来源于stack exchange,提问作者Joey Yi Zhao
相关产品推荐
相关产品推荐

