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
相关产品推荐
相关产品推荐

