2017-09-12 7 views
0

を拡張:AWSラムダハンドラは、私は、次のパイプラインを持っているS3event

ファイルをS3にアップロードされ、それはいくつかの処理を実行しないラムダを(のはL1それを呼びましょう)がトリガされます。あなたは "テスト" セクションで、この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" 
        } 
       } 
      ], 
     } 

だから現時点では、私のエントリポイントは次のようになります。

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

さて、S3Event 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にファイルをアップロードすると機能しません。 S3Event拡張クラス(S3Eventが拡張されています)を拡張しようとしましたが、やはり成功しませんでした。

私は何をしようとしていますか?

+0

s3イベントjsonにデータを追加することで、何を達成したいですか? 理想的には、イベント駆動型環境で作業する場合、イベントの属性が非常に特定のデータを扱うので、イベントの属性は一定です。 – Suyash

+0

@ Suyash元のイベントに情報を追加して元のファイルを再処理します。しかし、完全ではなく、その一部だけが追加情報を使用しています。 – Alessandroempire

+0

あなたのラムダがS3Eventを受け取ったら、それを変更したいと思います。同じlambdaが再び処理する必要がありますが、今回は変更されたデータで処理する必要がありますか? – Suyash

答えて

0

できることは、再帰関数の仕組みと同様に、変更された新しいイベントをラムダ(L1)自身に(非同期に)送信することです。

ちょっと注意してください。再帰を維持したいと思う深さの限界を置かなければなりません。あなたは無限の呼び出しで終わらせたくありません。 AWSがこれを守っているかどうかはわかりません。 AWS SDKラムダで

0

invoke methodがあります

は、特定のラムダ関数を呼び出します。たとえば、バージョン管理機能を使用している場合は、 リクエストで予選パラメータを使用して、機能バージョンへ ポインティングで機能バージョンまたはエイリアス名を提供することにより、特定の 機能バージョンを呼び出すことができますCreate the Lambda Function and Test It Manually.

を参照してください。修飾子パラメータを指定しないと、$ 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あなたが呼び出される関数は、あなたが送ることができるので、受信eventあるPayloadを送るあなたのMyErrorMessageこのペイロードとして望ましい結果を得るために/。

関連する問題