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

如何解决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关联配置

  1. 创建Lambda数据源:在AppSync控制台中创建Lambda类型的数据源,关联上述Lambda函数
  2. 配置Mutation Resolver:
    • 请求模板(直接转发Mutation参数):
      {
        "version": "2018-05-29",
        "operation": "Invoke",
        "payload": {
          "arguments": $util.toJson($context.arguments)
        }
      }
      
    • 响应模板(直接返回Lambda执行结果):
      $util.toJson($context.result)
      

四、关键注意事项

  • 批次限制:DynamoDB的BatchWriteItem接口单次最多处理25项,必须手动分割列表
  • 未处理项重试:若出现UnprocessedItems,可添加重试逻辑(需注意幂等性)
  • 权限配置:确保Lambda执行角色拥有DynamoDB表的dynamodb:BatchWriteItem权限

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 18:47:00