在EventBridge或API Gateway的设置中合理配置重试机制,以避免函数重复触发。
同时,可以在Lambda函数代码中增加去重逻辑,例如:
import json
def lambda_handler(event, context):
# 解析事件数据
data = json.loads(event["Records"][0]["Sns"]["Message"])
# 判断是否已经处理过
if data.get("processed"):
return "Already processed"
# 处理事件数据
# 标记为已处理
data["processed"] = True
# 发送新事件到EventBridge
client = boto3.client("events")
response = client.put_events(
Entries=[{
"Source": "myapp",
"DetailType": "newData",
"Detail": json.dumps(data)
}]
)
return response
以上代码中,判断事件是否已经处理的逻辑是基于事件数据中是否存在一个名为"processed"的字段。如果不存在该字段,就表示该事件还没有被处理过;如果存在该字段,就直接返回"Already processed",避免重复处理。
另外,为了避免函数执行时间过长导致重复触发,也可以考虑使用AWS Step Functions对Lambda函数进行分步处理。