我有以下管道:
文件上传到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从中扩展),但是再次没有成功。
我想做的可能吗?
答案 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}}结果