aws java:解析来自 SQS 的 S3Put 事件到 lambda

问题描述 投票:0回答:1

令我惊讶的是,处理事件源是手工制作的......

我的意思是,我几天来一直在努力尝试将

S3Put
事件接收(“反序列化”)到我的处理程序中(使用 spring-cloud-function-aws-adapter Consumer)。

目前,我正在使用

S3(send put event) -> SQS(send SQSMessage) -> lambda(receive SQSMessage)

我当前的代码 Lambda 函数(处理程序)是:

@Component
@RequiredArgsConstructor
@Slf4j
public class PushedDocumentLambdaConsumer implements Function<SQSEvent, String> {

    @Override
    public String apply(SQSEvent sqsEvent) {
        log.info("Found " + sqsEvent.getRecords().size() + " sqs event(s)");
        for (SQSEvent.SQSMessage sqsMessage : sqsEvent.getRecords()) {
            log.info("sqs message body: {}", sqsMessage.getBody());

            final String body = sqsMessage.getBody().replace("Records", "records");
            log.info("Replaced sqs message body: {}", body);

            Gson gson = new Gson();
            S3Event s3Event = gson.fromJson(sqsMessage.getBody(), S3Event.class);
            log.info("s3Event.toString(): {}", s3Event.toString());

            if (s3Event != null && s3Event.getRecords() != null) {
                log.info("Number of records: {}", s3Event.getRecords().size());
                for (S3EventNotificationRecord s3EventNotificationRecord : s3Event.getRecords()) {
                    log.info("event name: {}", s3EventNotificationRecord.getEventName());
                    log.info("event source: {}", s3EventNotificationRecord.getEventSource());

                    S3Entity s3Entity = s3EventNotificationRecord.getS3();
                    if (null != s3Entity) {
                        log.info("s3Entity bucket name: {}", s3Entity.getBucket().getName());
                        log.info("s3Entity object name: {}", s3Entity.getObject().getKey());
                    }
                }
            }
        }

        return "Ok";
    }

}

我目前收到的是:

{
   "Records":[
      {
         "body":"{\"Records\": [{\"eventVersion\": \"2.1\", \"eventSource\": \"aws:s3\", \"awsRegion\": \"us-east-1\", \"eventTime\": \"2024-03-01T12:54:12.608Z\", \"eventName\": \"ObjectCreated:Put\", \"userIdentity\": {\"principalId\": \"AIDAJDPLRKLG7UEXAMPLE\"}, \"requestParameters\": {\"sourceIPAddress\": \"127.0.0.1\"}, \"responseElements\": {\"x-amz-request-id\": \"b0c98e62\", \"x-amz-id-2\": \"eftixk72aD6Ap51TnqcoF8eFidJG9Z/2\"}, \"s3\": {\"s3SchemaVersion\": \"1.0\", \"configurationId\": \"abdde1c9\", \"bucket\": {\"name\": \"espaidoc\", \"ownerIdentity\": {\"principalId\": \"A3NL1KOZZKExample\"}, \"arn\": \"arn:aws:s3:::espaidoc\"}, \"object\": {\"key\": \"580d1374-2ec1-4bb3-8c14-2c43d07c7833\", \"sequencer\": \"0055AED6DCD90281E5\", \"size\": 2333, \"eTag\": \"1d11469e9d81f07729548d7708bbab82\"}}}]}",
         "receiptHandle":"ZGJhNTJjNDItODU1Yy00ZjY2LWI4MmUtY2RmNDRhNzg5YTRkIGFybjphd3M6c3FzOnVzLWVhc3QtMTowMDAwMDAwMDAwMDA6U3FzUXVldWVDcmVhdGUgMmI1YjY3OTctMjY0Yy00NTVlLTgyNzMtZDIwMDlkYWVhZDliIDE3MDkyOTc2NTMuNDg2MTU4",
         "md5OfBody":"2bb9d9a1a018099143bd02c0aea8b0cd",
         "eventSourceARN":"arn:aws:sqs:us-east-1:000000000000:SqsQueueCreate",
         "eventSource":"aws:sqs",
         "awsRegion":"us-east-1",
         "messageId":"2b5b6797-264c-455e-8273-d2009daead9b",
         "attributes":{
            "SenderId":"000000000000",
            "SentTimestamp":"1709297652665",
            "ApproximateReceiveCount":"1",
            "ApproximateFirstReceiveTimestamp":"1709297653486"
         },
         "messageAttributes":{
            
         }
      }
   ]
}

如您所见,我正在尝试使用

Gson
将主体反序列化为 S3Event,但我意识到它给我带来了一个没有记录的 S3Event...

  1. 没有任何库参与这个解析问题吗?
  2. 我如何“手动”解析它?
java amazon-web-services aws-lambda aws-java-sdk
1个回答
0
投票

我相信问题是你试图使用 gson 将 SQS 消息解析为

S3Event
,而它实际上是
S3EventNotification
。看起来你甚至不需要用 gson 解析它,你可以这样做:

S3EventNotification s3EventNotification = S3EventNotification.parse(sqsMessage.getBody());
for (S3EventNotification.S3EventNotificationRecord record : s3EventNotification.getRecords())
{
    S3EventNotification.S3Entity s3Entity = record.getS3();
    if (null != s3Entity)
    {
        log.info("s3Entity bucket name: {}", s3Entity.getBucket().getName());
        log.info("s3Entity object name: {}", s3Entity.getObject().getKey());
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.