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

AWS Lambda .NET6:处理EventBridge S3事件的AWSEvent类选型疑问

问题

我在AWS Lambda .NET6环境中处理来自EventBridge的S3 PutObject事件(指定存储桶执行PutObject操作时触发),当前代码用Stream读取事件内容,想替换为对应的AWSEvent类,但发现S3Event不适用,请问应该选用哪个AWSEvent类?

现有代码:

using Amazon.Lambda.Core;
using Amazon.Lambda.RuntimeSupport;
using Amazon.Lambda.Serialization.SystemTextJson;
var handler = async (Stream request, ILambdaContext context) =>
{
    using var stream = new StreamReader(request);
    Console.WriteLine(stream.ReadToEnd());
}

await LambdaBootstrapBuilder.Create(handler, new DefaultLambdaJsonSerializer())
    .Build()
    .RunAsync();

收到的JSON事件结构:

{
    "version": "0",
    "id": "20a46552-4c8f-baa2-1a4c-a2290d207777",
    "detail-type": "AWS API Call via CloudTrail",
    "source": "aws.s3",
    "account": "99999999999",
    "time": "2023-01-17T15:10:02Z",
    "region": "REGION",
    "resources": [],
    "detail": {
        "eventVersion": "1.08",
        ...
        "awsRegion": "REGION",
        "sourceIPAddress": "99.99.99.99",
        "userAgent": "[aws-cli/2.0.5 Python/3.7.3 Linux/4.18.0-80.4.2.el8_0.x86_64 botocore/2.0.0dev9]",
        "requestParameters": {
            "bucketName": "bucketName",
            "Host": "Host",
            "key": "key"
        },
        ...
    }
}

解决方案

你需要使用Amazon.Lambda.CloudWatchEvents.CloudWatchEvent<Amazon.Lambda.CloudWatchEvents.S3ApiCallEvent>这个泛型类来接收该事件。

原因说明

你当前收到的是EventBridge转发的CloudTrail S3 API调用事件,而S3Event对应的是S3直接发送的对象创建通知(比如S3的ObjectCreated事件),两者结构完全不同,所以S3Event无法匹配。

修改后的代码

首先确保安装Amazon.Lambda.CloudWatchEvents NuGet包,然后修改handler的参数类型:

using Amazon.Lambda.Core;
using Amazon.Lambda.RuntimeSupport;
using Amazon.Lambda.Serialization.SystemTextJson;
using Amazon.Lambda.CloudWatchEvents;

var handler = async (CloudWatchEvent<S3ApiCallEvent> request, ILambdaContext context) =>
{
    // 直接访问事件属性
    Console.WriteLine($"事件来源: {request.Source}");
    Console.WriteLine($"存储桶名称: {request.Detail.RequestParameters.BucketName}");
    Console.WriteLine($"对象Key: {request.Detail.RequestParameters.Key}");
}

await LambdaBootstrapBuilder.Create(handler, new DefaultLambdaJsonSerializer())
    .Build()
    .RunAsync();

关键属性说明

  • CloudWatchEvent<T>是通用的EventBridge事件包装类,包含顶层的Version、Id、DetailType、Source等字段
  • S3ApiCallEvent对应detail字段的结构,包含RequestParameters(存储桶、对象Key等信息)、AwsRegion、SourceIPAddress等CloudTrail记录的S3 API调用细节

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 09:50:35