AWS Lambda Handler扩展了S3event

时间:2017-09-12 10:39:17

标签: json amazon-web-services amazon-s3 lambda aws-lambda

我有以下管道:

文件上传到S3,它会触发一个Lambda(让我们称之为L1),它运行并进行一些处理。

所以目前,我的切入点看起来像这样:

public Response handleRequest(S3Event event, Context context) {
  ....
}

现在,S3Event JSON看起来像这样:

        {
            "Records": [
                {
                    "awsRegion": "xxxxx",
                    "eventName": "ObjectCreated:Put",
                    "eventSource": "aws:s3",
                    "eventTime": "2017-09-12T09:27:59.471Z",
                    "eventVersion": "2.0",
                    "requestParameters": {
                        "sourceIPAddress": "xxxxxx"
                    },
                    "responseElements": {
                        "x-amz-id-2": "xxxxxx",
                        "x-amz-request-id": "xxxx"
                    },
                    "s3": {
                        "configurationId": "xxxxxx1",
                        "bucket": {
                            "name": "xxxxx",
                            "ownerIdentity": {
                                "principalId": "xxxxx"
                            },
                            "arn": "xxx"
                        },
                        "object": {
                            "key": "xxx",
                            "size": xxx,
                            "eTag": "xxxx",
                            "versionId": null,
                            "sequencer": "xxx",
                            "urlDecodedKey": "xxx"
                        },
                        "s3SchemaVersion": "1.0"
                    },
                    "userIdentity": {
                        "principalId": "xxxx"
                    }
                }
            ],
        }

如果您在"测试"中传递此JSON;部分,它会成功。

现在,重点:我希望向这个JSON添加信息,这看起来像这样:

        {
            "Records": [
                {
                    "awsRegion": "xxxxx",
                    "eventName": "ObjectCreated:Put",
                    "eventSource": "aws:s3",
                    "eventTime": "2017-09-12T09:27:59.471Z",
                    "eventVersion": "2.0",
                    "requestParameters": {
                        "sourceIPAddress": "xxxxxx"
                    },
                    "responseElements": {
                        "x-amz-id-2": "xxxxxx",
                        "x-amz-request-id": "xxxx"
                    },
                    "s3": {
                        "configurationId": "xxxxxx1",
                        "bucket": {
                            "name": "xxxxx",
                            "ownerIdentity": {
                                "principalId": "xxxxx"
                            },
                            "arn": "xxx"
                        },
                        "object": {
                            "key": "xxx",
                            "size": xxx,
                            "eTag": "xxxx",
                            "versionId": null,
                            "sequencer": "xxx",
                            "urlDecodedKey": "xxx"
                        },
                        "s3SchemaVersion": "1.0"
                    },
                    "userIdentity": {
                        "principalId": "xxxx"
                    }
                }
            ],

             "MyErrorMessage":
                {
                "EnvelopeErrors": [
                    {
                        "EnvelopeErrorTrace": "stackTrace",
                        "EnvelopeErrorPositions": 1,
                        "EnvelopeErrorLength": 2
                    },
                    {
                        "EnvelopeErrorTrace": "SecondTrace",
                        "EnvelopeErrorPositions": 3,
                        "EnvelopeErrorLength": 4
                    }
                ],
                }
        }

注意是S3Event JSon,但有更多数据。

我的问题是:我希望有一个自定义输入,当调用纯S3Event时也可以使用。

 public Response handleRequest(MyS3Event event, Context context) {
    ....
 }

但是,我无法做到这一点。

我尝试过自定义POJO但是当我上传到S3文件时它不起作用。 我试图扩展S3EventNotification类(S3Event从中扩展),但是再次没有成功。

我想做的可能吗?

2 个答案:

答案 0 :(得分:0)

你可以做的是让你的Lambda(L1)本身(异步)调用它,发送新的,修改过的事件,类似于递归函数的工作方式。

但是要非常小心。您必须限制您希望保持递归的深度。你不想最终得到无限的电话。我不确定AWS是否会反对这一点。

答案 1 :(得分:0)

在AWS SDK中,Lambda有一个invoke method

  

调用特定的Lambda函数。有关示例,请参阅Create the Lambda Function and Test It Manually.

     

如果您使用版本控制功能,则可以调用特定功能   通过提供函数版本或别名来实现函数版本   使用Qualifier参数指向函数版本   请求。如果您没有提供限定符参数,则为$ LATEST   调用Lambda函数的版本。至少发生调用   一旦响应事件,功能必须是幂等的   处理这个(事情。有关版本控制功能的信息,请参阅AWS Lambda Function Versioning and Aliases

     

此操作需要lambda:InvokeFunction的权限   动作。

var params = {
  FunctionName: 'STRING_VALUE', /* required */
  ClientContext: 'STRING_VALUE',
  InvocationType: Event | RequestResponse | DryRun,
  LogType: None | Tail,
  Payload: new Buffer('...') || 'STRING_VALUE',
  Qualifier: 'STRING_VALUE'
};
lambda.invoke(params, function(err, data) {
  if (err) console.log(err, err.stack); // an error occurred
  else     console.log(data);           // successful response
});

您发送的params Payload之一是被调用函数接收的event,因此您可以将MyErrorMessage作为此有效负载发送给所需的{{1}}结果