使用Lambda函数和DynamoDB表来确保每个事件只被处理一次。
以下是详细步骤:
{ "event_id": "string", "processed": "boolean" }
import boto3 from botocore.exceptions import ClientError import json
TABLE_NAME = "Your DynamoDB table name"
def lambda_handler(event, context): dynamodb = boto3.resource('dynamodb') table = dynamodb.Table(TABLE_NAME)
for record in event['Records']:
event_body = json.loads(record['body'])
event_id = event_body['event_id']
try:
response = table.update_item(
Key={'event_id': event_id},
UpdateExpression='SET processed = :val',
ExpressionAttributeValues={':val': True},
ReturnValues="ALL_NEW"
)
if not response['Attributes']['processed']:
process_event(event_body)
except ClientError as e:
if e.response['Error']['Code'] == 'ConditionalCheckFailedException':
pass
else:
raise e
def process_event(event_body): # 处理事件的代码
在Lambda函数中,使用boto3库访问DynamoDB表。在每个记录上循环时,提取事件ID并尝试更新DynamoDB表中的记录。如果更新成功,并且事件尚未被处理,则调用process_event()函数处理事件。
import boto3 from datetime import datetime, timedelta
TABLE_NAME = "Your DynamoDB table name"
def lambda_handler(event, context): dynamodb = boto3.resource('dynamodb') table = dynamodb.Table(TABLE_NAME)
cutoff_time = datetime.now() - timedelta(days=30)
cutoff_timestamp = int(cutoff_time.timestamp())
response = table