You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何自动更新AWS DynamoDB事件状态?Lambda是否为最优实现方案?

解答:活动自动过期及通知实现方案

Lambda是不是最佳选择?

没错,Lambda完全适合这个需求,原因很直接:

  • 事件驱动模式,能配合定时任务或DynamoDB事件触发逻辑,不用自己维护服务器
  • 按需付费,只有执行时才花钱,成本极低
  • 和Amplify生态兼容度高,能轻松调用AppSync、操作DynamoDB,或者对接通知服务

具体实现步骤

1. 确认DynamoDB表字段

你的活动表需要包含这些关键字段:

  • id:活动主键ID
  • status:活动状态(比如Active/Expired)
  • createdAt:活动创建时间(ISO格式字符串)
  • ownerId:创建者的用户ID
  • followCount:关注人数(初始设为0)

2. 用Amplify CLI创建Lambda函数

打开终端执行命令:

amplify add function

选择Node.js运行时,挑选自定义函数模板。然后将以下逻辑写入函数代码:

const AWS = require('aws-sdk');
const dynamodb = new AWS.DynamoDB.DocumentClient();
const sns = new AWS.SNS();

exports.handler = async (event) => {
  // 计算24小时前的时间节点
  const cutoffTime = new Date(Date.now() - 24 * 60 * 60 * 1000).toISOString();
  
  // 扫描符合条件的活动:活跃状态、创建超过24小时、无关注
  const scanParams = {
    TableName: '你的活动表名称',
    FilterExpression: 'status = :active AND createdAt < :cutoff AND followCount = :zero',
    ExpressionAttributeValues: {
      ':active': 'Active',
      ':cutoff': cutoffTime,
      ':zero': 0
    }
  };
  
  const scanResult = await dynamodb.scan(scanParams).promise();
  
  // 批量执行状态更新与通知发送
  const taskPromises = scanResult.Items.map(async (activity) => {
    // 更新活动为过期状态
    const updateParams = {
      TableName: '你的活动表名称',
      Key: { id: activity.id },
      UpdateExpression: 'set #status = :expired',
      ExpressionAttributeNames: { '#status': 'status' },
      ExpressionAttributeValues: { ':expired': 'Expired' }
    };
    await dynamodb.update(updateParams).promise();
    
    // 给活动所有者发送SNS通知(需提前让用户订阅对应主题)
    const snsParams = {
      TopicArn: '你的SNS主题ARN',
      Message: `你的活动「${activity.title}」因24小时无人关注已过期`,
      Subject: '活动过期提醒'
    };
    await sns.publish(snsParams).promise();
  });
  
  await Promise.all(taskPromises);
  
  return {
    statusCode: 200,
    body: `处理了${scanResult.Items.length}个过期活动`
  };
};

3. 给Lambda添加触发器

有两种触发方式可选:

方式一:定时触发(适合批量检查)

执行命令更新函数:

amplify update function

选择你刚创建的函数,添加CloudWatch Events触发器,设置执行频率(比如每天一次或每小时一次,根据实时性需求调整)。

方式二:TTL+DynamoDB流触发(实时性更高)

给活动表新增expireAt字段,值设为createdAt + 24小时的时间戳,开启DynamoDB的TTL功能。然后给Lambda添加DynamoDB流触发器,当TTL到期时,流事件会触发Lambda,你可以在函数中捕获事件并执行状态更新与通知发送。

4. 配置Lambda权限

Lambda需要以下权限才能正常工作:

  • DynamoDB的扫描、更新权限
  • SNS的发布权限(如果使用SNS发送通知)

Amplify CLI会自动生成IAM角色,你可以在amplify/backend/function/你的函数名/你的函数名-cloudformation-template.json中补充权限,或者在执行amplify update function时选择添加对应权限。

5. 使用Amplify推送通知(可选)

如果不想用SNS,可直接使用Amplify自带的推送通知服务,初始化后调用API即可:

const Amplify = require('aws-amplify');
const { pushNotifications } = require('aws-amplify');

// 在Lambda中初始化Amplify(依赖IAM角色权限,无需硬编码密钥)
Amplify.configure({
  Auth: {
    region: '你的AWS区域'
  },
  PushNotification: {
    AWSPinpoint: {
      appId: '你的Pinpoint应用ID',
      region: '你的AWS区域'
    }
  }
});

// 给指定用户发送推送通知
await pushNotifications.send('你的活动已过期', {
  userId: activity.ownerId
});

内容的提问来源于stack exchange,提问作者da45

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 01:52:21