如何解决AWS AppSync Mutation超时问题?Lambda批量删除场景
Lambda通过AppSync Mutation批量删除DynamoDB数据实现方案
一、AppSync Schema定义批量删除Mutation
首先在AppSync的Schema中定义支持批量删除的Mutation及返回结果类型:
type Mutation { batchDeleteItems(ids: [ID!]!): BatchDeleteResult } type BatchDeleteResult { successCount: Int! failedIds: [ID!] }
二、Lambda函数实现(基于AWS SDK v3 Builder)
以下是使用AWS SDK v3的DynamoDB客户端实现批量删除的Lambda代码,自动处理批次分割与未处理项:
import { DynamoDBClient, BatchWriteCommand } from "@aws-sdk/client-dynamodb"; import { marshall } from "@aws-sdk/util-dynamodb"; const dynamoClient = new DynamoDBClient({ region: "us-east-1" }); // 替换为你的AWS区域 const TARGET_TABLE = "YourTableName"; // 替换为你的DynamoDB表名 export const handler = async (event) => { const { ids } = event.arguments; let successCount = 0; const failedIds = []; // 将ID列表转换为DynamoDB批量删除请求格式 const deleteRequests = ids.map(itemId => ({ DeleteRequest: { Key: marshall({ id: itemId }) // 替换为你的表主键字段名与类型 } })); // 按DynamoDB限制分割为每25项一个批次 const batchChunks = []; for (let i = 0; i < deleteRequests.length; i += 25) { batchChunks.push(deleteRequests.slice(i, i + 25)); } // 逐批次执行删除操作 for (const chunk of batchChunks) { const batchCommand = new BatchWriteCommand({ RequestItems: { [TARGET_TABLE]: chunk } }); try { const response = await dynamoClient.send(batchCommand); // 计算当前批次成功删除数量 const processedCount = chunk.length - (response.UnprocessedItems?.[TARGET_TABLE]?.length || 0); successCount += processedCount; // 收集未成功处理的ID if (response.UnprocessedItems?.[TARGET_TABLE]) { response.UnprocessedItems[TARGET_TABLE].forEach(item => { failedIds.push(item.DeleteRequest.Key.id.S); // 根据主键类型调整取值方式 }); } } catch (err) { console.error(`批次删除失败: ${err.message}`); // 若批次整体失败,将当前批次所有ID标记为失败 chunk.forEach(item => failedIds.push(item.DeleteRequest.Key.id.S)); } } return { successCount, failedIds }; };
三、AppSync与Lambda关联配置
- 创建Lambda数据源:在AppSync控制台中创建Lambda类型的数据源,关联上述Lambda函数
- 配置Mutation Resolver:
- 请求模板(直接转发Mutation参数):
{ "version": "2018-05-29", "operation": "Invoke", "payload": { "arguments": $util.toJson($context.arguments) } } - 响应模板(直接返回Lambda执行结果):
$util.toJson($context.result)
- 请求模板(直接转发Mutation参数):
四、关键注意事项
- 批次限制:DynamoDB的
BatchWriteItem接口单次最多处理25项,必须手动分割列表 - 未处理项重试:若出现
UnprocessedItems,可添加重试逻辑(需注意幂等性) - 权限配置:确保Lambda执行角色拥有DynamoDB表的
dynamodb:BatchWriteItem权限
内容的提问来源于stack exchange,提问作者tamptek
相关产品推荐
相关产品推荐

