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

如何用Node.js创建触发Lambda函数的事件以动态切换S3源桶?

用Node.js动态管理Lambda的S3触发事件

要实现无需手动操作即可切换Lambda的S3源桶触发,你可以借助AWS SDK for JavaScript(推荐v3版本)通过代码完成Lambda权限配置和S3桶通知配置的动态修改,核心是两个步骤:给目标S3桶添加触发Lambda的权限,以及配置S3桶的事件通知指向Lambda。

前提准备

  1. 安装AWS SDK v3相关依赖:
    npm install @aws-sdk/client-lambda @aws-sdk/client-s3
    
  2. 确保你的Lambda执行角色(或运行代码的IAM身份)拥有以下权限:
    • lambda:AddPermission、lambda:RemovePermission:用于管理Lambda的调用权限
    • s3:PutBucketNotificationConfiguration、s3:GetBucketNotificationConfiguration:用于读写S3桶的通知配置

核心代码实现

下面是完整的Node.js代码示例,包含移除旧桶触发和添加新桶触发的逻辑:

const { LambdaClient, AddPermissionCommand, RemovePermissionCommand } = require("@aws-sdk/client-lambda");
const { S3Client, PutBucketNotificationConfigurationCommand, GetBucketNotificationConfigurationCommand } = require("@aws-sdk/client-s3");

// 初始化AWS客户端(默认读取本地AWS配置或环境变量)
const lambdaClient = new LambdaClient({ region: "你的AWS区域" });
const s3Client = new S3Client({ region: "你的AWS区域" });

// 配置参数
const LAMBDA_FUNCTION_NAME = "你的Lambda函数名称";
const OLD_SOURCE_BUCKET = "旧的源S3桶名称";
const NEW_SOURCE_BUCKET = "新的源S3桶名称";
const PERMISSION_ID = "S3InvokeLambdaPermission"; // 自定义权限ID,用于后续移除权限

// 移除旧桶的Lambda触发权限和S3通知
async function removeOldBucketTrigger() {
  // 1. 移除Lambda上针对旧桶的调用权限
  try {
    await lambdaClient.send(new RemovePermissionCommand({
      FunctionName: LAMBDA_FUNCTION_NAME,
      StatementId: PERMISSION_ID
    }));
    console.log(`已移除旧桶${OLD_SOURCE_BUCKET}的Lambda调用权限`);
  } catch (err) {
    // 如果权限不存在,忽略错误
    if (err.name !== "ResourceNotFoundException") {
      throw err;
    }
  }

  // 2. 移除S3旧桶的通知配置
  try {
    const currentConfig = await s3Client.send(new GetBucketNotificationConfigurationCommand({
      Bucket: OLD_SOURCE_BUCKET
    }));
    // 过滤掉指向目标Lambda的通知规则
    const updatedLambdaFunctions = (currentConfig.LambdaFunctionConfigurations || []).filter(
      config => config.LambdaFunctionArn !== `arn:aws:lambda:你的AWS区域:你的AWS账号ID:function:${LAMBDA_FUNCTION_NAME}`
    );
    await s3Client.send(new PutBucketNotificationConfigurationCommand({
      Bucket: OLD_SOURCE_BUCKET,
      NotificationConfiguration: {
        ...currentConfig,
        LambdaFunctionConfigurations: updatedLambdaFunctions
      }
    }));
    console.log(`已移除旧桶${OLD_SOURCE_BUCKET}的Lambda触发通知`);
  } catch (err) {
    console.error("移除旧桶通知失败:", err);
    throw err;
  }
}

// 给新桶添加Lambda触发权限和S3通知
async function addNewBucketTrigger() {
  // 1. 给Lambda添加新桶的调用权限
  await lambdaClient.send(new AddPermissionCommand({
    FunctionName: LAMBDA_FUNCTION_NAME,
    StatementId: PERMISSION_ID,
    Action: "lambda:InvokeFunction",
    Principal: "s3.amazonaws.com",
    SourceArn: `arn:aws:s3:::${NEW_SOURCE_BUCKET}`,
    SourceAccount: "你的AWS账号ID"
  }));
  console.log(`已添加新桶${NEW_SOURCE_BUCKET}的Lambda调用权限`);

  // 2. 配置S3新桶的事件通知(触发条件:视频文件上传完成)
  await s3Client.send(new PutBucketNotificationConfigurationCommand({
    Bucket: NEW_SOURCE_BUCKET,
    NotificationConfiguration: {
      LambdaFunctionConfigurations: [
        {
          Id: "VideoUploadTrigger",
          LambdaFunctionArn: `arn:aws:lambda:你的AWS区域:你的AWS账号ID:function:${LAMBDA_FUNCTION_NAME}`,
          Events: ["s3:ObjectCreated:*"],
          Filter: {
            Key: {
              FilterRules: [
                { Name: "suffix", Value: ".mp4" }, // 可根据需要修改视频后缀
                { Name: "suffix", Value: ".mov" }
              ]
            }
          }
        }
      ]
    }
  }));
  console.log(`已配置新桶${NEW_SOURCE_BUCKET}的Lambda触发通知`);
}

// 执行切换逻辑
async function switchSourceBucket() {
  try {
    await removeOldBucketTrigger();
    await addNewBucketTrigger();
    console.log("源桶触发切换完成");
  } catch (err) {
    console.error("切换源桶触发失败:", err);
  }
}

// 调用切换函数
switchSourceBucket();

关键说明

  • 权限ID:PERMISSION_ID是自定义的唯一标识,用于后续精准移除Lambda上的权限,避免误删其他权限。
  • 触发事件:示例中用s3:ObjectCreated:*监听所有文件创建事件,你可以根据需求修改为特定事件(比如s3:ObjectCreated:Put),并通过FilterRules限制触发的文件后缀。
  • 区域一致性:确保Lambda和S3桶在同一AWS区域,若跨区域需额外配置S3的跨区域通知(需注意延迟和费用)。
  • 幂等性:代码中处理了“权限不存在”的错误,避免重复执行时抛出异常,你可以根据实际场景调整错误处理逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 13:32:58