2017-09-12 82 views
0

我有以下管道:AWS LAMBDA處理程序擴展S3event

的文件上傳到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

你想通過向s3事件json添加更多數據來實現什麼? 理想情況下,當您在事件驅動環境中工作時,事件屬性是不變的,因爲屬性處理觸發事件的非常特定的數據, – Suyash

+0

@Suyash我想要做的是將信息添加到原始事件,以便我的Lambda重新處理原始文件,但不是完全的,而只是使用附加信息的一部分。 – Alessandroempire

+0

你的意思是,一旦你的lambda接收到S3Event,你想修改它,同樣的lambda應該再次處理它,但這次修改後的數據呢? – Suyash

回答

0

你可以做的就是通過向Lambda(L1)調用自己(異步)調用類似於遞歸函數的新的,修改過的事件來調用它。

雖然要非常小心。你必須限制你想保持遞歸的深度。你不想結束無限的通話。我不確定AWS是否會防止這種情況發生。

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這是調用函數接收這樣你就可以發送eventMyErrorMessage在/因爲這有效載荷得到期望的結果。