C# 如何处理';S3触发了什么?
我有一个S3 bucket,每当添加一个对象时,它都会向SQS队列发送一条消息。作为回报,该SQS队列触发一个Lambda,该Lambda尝试使用其键检索最近添加的对象 我的Lambda中的C# 如何处理';S3触发了什么?,c#,amazon-web-services,amazon-s3,aws-lambda,amazon-sqs,C#,Amazon Web Services,Amazon S3,Aws Lambda,Amazon Sqs,我有一个S3 bucket,每当添加一个对象时,它都会向SQS队列发送一条消息。作为回报,该SQS队列触发一个Lambda,该Lambda尝试使用其键检索最近添加的对象 我的Lambda中的FunctionHandler方法如下所示: public async Task FunctionHandler(S3EventNotification evnt, ILambdaContext context) { // evnt.Records[0].S3 is null } 我在这里处理的事件
FunctionHandler
方法如下所示:
public async Task FunctionHandler(S3EventNotification evnt, ILambdaContext context) {
// evnt.Records[0].S3 is null
}
我在这里处理的事件是否正确?我处理S3EventNotification
的原因是,当我检查SQS队列中的消息时,它们的内容对应于S3EventNotification
事件类型()。但是由于某些原因,我试图访问的属性是空的
如果我尝试处理一个SQSEvent
,那么我就无法获得所需的对象键,以便能够从S3 bucket中抓取相应的对象
有什么想法吗?你可能想在这里处理
SQSEvent
。我相信每个事件。records
您将拥有body
属性,它将保存原始的S3事件。它可能需要一些序列化
比如:
public class Function
{
public string Handler(SQSEvent sqsEvent)
{
foreach (var record in sqsEvent.Records)
{
// record.Body has your S3 event
}
}
}
出于兴趣,您是否考虑过直接从S3->EventBridge->Lambda出发?这样就可以跳过SQS队列。SQSEvent记录的body属性是否包含S3EventNotification或S3Event?我假设,由于body是一个字符串,这些事件将以需要序列化的原始JSON格式出现,对吗?我不确定SQSEvent或S3EventNotification是否会出现在body中。最好的办法是调试并检查它。如果您正努力在本地调试它,您可能只需将其登录到CloudWatch,查看内容。我认为您是正确的,字符串需要序列化到正确的类。@AlexBailey您是正确的——S3事件将作为字符串“封装”在SQS事件中,需要转换为普通对象。这可以通过直接从S3事件转到AWS Lambda函数来避免。