web-dev-qa-db-ja.com

S3 put()イベントラムダトリガーにはいくつのレコードを含めることができますか?

私はこのフローを得たいくつかのラムダ関数が必要です:

トリガーされたS3 put fileイベント->ラムダ関数-> DynamoDBに行を挿入

ラムダ画面からAWSを使用してテストを作成しているときに、Recordsリストにレコードが1つだけあるこの例を取得しました。

{
  "Records": [    //  <<<----------------only 1 element 
    {
      "eventVersion": "2.0",
      "eventTime": "1970-01-01T00:00:00.000Z",
      "requestParameters": {
        "sourceIPAddress": "127.0.0.1"
      },
      "s3": {
        "configurationId": "testConfigRule",
        "object": {
          "eTag": "0123456789abcdef0123456789abcdef",
          "sequencer": "0A1B2C3D4E5F678901",
          "key": "HappyFace.jpg",
          "size": 1024
        },
        "bucket": {
          "arn": "arn:aws:s3:::mybucket",
          "name": "roeyg-oregon-s3-bucket",
          "ownerIdentity": {
            "principalId": "EXAMPLE"
          }
        },
        "s3SchemaVersion": "1.0"
      },
      "responseElements": {
        "x-amz-id-2": "EXAMPLE123/5678abcdefghijklambdaisawesome/mnopqrstuvwxyzABCDEFGH",
        "x-amz-request-id": "EXAMPLE123456789"
      },
      "awsRegion": "us-east-1",
      "eventName": "ObjectCreated:Put",
      "userIdentity": {
        "principalId": "EXAMPLE"
      },
      "eventSource": "aws:s3"
    }
  ]
}

CLIを使用したり、複数のファイルをまとめてアップロードしたり、フォルダー全体をアップロードしたりするなど、このリストに複数の要素を含むリストを取得できるかどうかをいくつかの方法で試しましたが、これらのシナリオすべてで、1つのイベントにつき1つのアイテムを取得しました。

私の質問は、1つのイベントで複数のファイルを取得できるシナリオがあるかどうかを知ることです。

それによって、AWSが提案するような最初の要素への参照ではなく、ループを持つようにコードを変更します。

22
roeygol

現在の構成を考えると、呼び出しごとに1つのレコードしか取得できません。これは、個々のS3 Putイベントが、AWS Lambda関数を受信者として持つ別個のS3イベント通知をトリガーするためです。その後、Lambdaはデフォルトで最大 100同時実行 を処理できます。この上限は、着信イベントレートに応じて自動的に引き上げることができます。

AWS LambdaはRecordsをコレクションとして受け取ります。これは、S3イベント通知を使用してイベントをラムダに送信し、 S3通知イベントメッセージ構造 を使用しているためです。 複数のレコードを返す可能性のあるイベントタイプの予測 では、形式はコレクションとして存在します。 S3イベント通知タイプの完全なリスト ここ を確認できます。

これはs3:ObjectCreated:PutのようなイベントからのS3通知には影響しません。つまり、Put通知が機能することを意図している方法であるため、関数を現状のまま残しても問題ありません-one event -> one notification -> one invokation


それでも、コードで呼び出しごとに複数のレコードを処理できるようにしたい場合は、次のいずれかにコードを書き込んでも害はありません。

  • ループでレコードを処理します(これについてのドキュメントで使用可能な例があります: AWSが提供するPythonのサンプルデプロイメントコード ループで、最初のレコードだけを取得するのではありません)。この方法を使用する場合は、アプリケーションが許容できない場合に、重複をフィルタリングするロジックをさらに追加することを検討してください。
  • > 1レコードにエラーを記録します。
21
Anthony Neace
  1. S3の別の新しいフォルダーに(場合によってはタイムスタンプを付けて)ファイルをアップロードします。
  2. ファイルがアップロードされたら、上記のフォルダーへのパスを含むファイルをS3フォルダー/バケット(Lambdaをトリガーする)に配置します。
  3. Lambdaは、アップロードされたファイルのリストへのパスを含むファイルへのキーでトリガーされます
1
blueskin