Как получить имя события в функции AWS Lambda?

Я новичок в AWS Lambda. У меня есть настройка триггера между моей функцией Lambda и таблицей DynamoDB, когда моя таблица изменяется. Функция Lambda успешно печатает событие в облачных журналах наблюдения. У меня возникли проблемы с выяснением того, как проверить, является ли событие INSERT или MODIFY в DynamoDB. Я хочу проверить с помощью оператора if. Когда я просто print(event) получаю

{
  "Records": [
    {
      "eventID": "26e6ac4f1c16fc40fd91536430c1ac72",
      "eventName": "MODIFY",
      "eventVersion": "1.1",
      "eventSource": "aws:dynamodb",
      "awsRegion": "us-east-1",
      "dynamodb": {
        "ApproximateCreationDateTime": 1612293148,
        "Keys": {
          "id": {
            "S": "d66ec59b-b807-4db9-96ed-3ebd3638779a450b7a75-6dce-4be9-babf-1077adb84b02"
          }
        },
        "NewImage": {
          "__typename": {
            "S": "Conversation"
          },
          "members": {
            "L": [
              {
                "S": "450b7a75-6dce-4be9-babf-1077adb84b02"
              },
              {
                "S": "d66ec59b-b807-4db9-96ed-3ebd3638779a"
              }
            ]
          },
          "isRead": {
            "BOOL": false
          },
          "recipient": {
            "S": "d66ec59b-b807-4db9-96ed-3ebd3638779a"
          },
          "latestMessage": {
            "S": "Hey man"
          },
          "id": {
            "S": "d66ec59b-b807-4db9-96ed-3ebd3638779a450b7a75-6dce-4be9-babf-1077adb84b02"
          },
          "latestMessageSenderSub": {
            "S": "450b7a75-6dce-4be9-babf-1077adb84b02"
          },
          "updatedAt": {
            "S": "02/02/2021 - 14:12:27"
          }
        },
        "OldImage": {
          "__typename": {
            "S": "Conversation"
          },
          "members": {
            "L": [
              {
                "S": "450b7a75-6dce-4be9-babf-1077adb84b02"
              },
              {
                "S": "d66ec59b-b807-4db9-96ed-3ebd3638779a"
              }
            ]
          },
          "isRead": {
            "BOOL": false
          },
          "recipient": {
            "S": "d66ec59b-b807-4db9-96ed-3ebd3638779a"
          },
          "latestMessage": {
            "S": "Yooooo"
          },
          "id": {
            "S": "d66ec59b-b807-4db9-96ed-3ebd3638779a450b7a75-6dce-4be9-babf-1077adb84b02"
          },
          "latestMessageSenderSub": {
            "S": "450b7a75-6dce-4be9-babf-1077adb84b02"
          },
          "updatedAt": {
            "S": "02/02/2021 - 12:40:09"
          }
        },
        "SequenceNumber": "47015900000000007518411700",
        "SizeBytes": 753,
        "StreamViewType": "NEW_AND_OLD_IMAGES"
      },
      "eventSourceARN": "arn:aws:dynamodb:us-east-1:69639064567851005:table/Conversation-jklhofiuhvouerhoh-dev/stream/2021-01-23T21:25:34.783"
    }
  ]
}

Но с моими операторами if, добавленными в мою лямбда-функцию, я получаю следующую ошибку

[ERROR] KeyError: 'eventName'Traceback (most recent call last):  File "/var/task/lambda_function.py", line 6, in lambda_handler    if event['eventName'] == 'MODIFY':

Лямбда-функция:

import json

def lambda_handler(event, context):
    # TODO implement
    print(event)
    if event['eventName'] == 'MODIFY':
        #Run some code
        print('MODIFY')
    elif event['eventName'] == 'INSERT':
        #Run some code
        print('INSERT')
    return {
        'statusCode': 200,
        'body': json.dumps('Hello from Lambda!')
    }

Как я могу получить имя события?


person GBMR    schedule 02.02.2021    source источник


Ответы (1)


События, которые вы получаете в своей функции Lambda, перечислены в виде массива под ключом «Записи». Итак, чтобы найти имя события, вам нужно сделать что-то вроде этого:

for e in event['Records']:
    if e['eventName'] == 'MODIFY':
        print('MODIFY')
    elif e['eventName'] == 'INSERT':
        #Run some code
        print('INSERT')
    return {
        'statusCode': 200,
        'body': json.dumps('Hello from Lambda!')
    }
person zyd    schedule 02.02.2021
comment
Бонусный балл за перебор записей событий. Многие люди просто предполагают, что будет одно и только одно событие, и они обрабатывают только event['Records'][0], а затем удивляются, почему некоторые события не обрабатываются. - person jarmod; 02.02.2021
comment
Это решение сработало! Как мне получить ключи таблицы, такие как идентификатор? - person GBMR; 02.02.2021
comment
@GBMR - list(e['dynamodb']['Keys'].keys()) должен получить все ключи, я думаю. Если вам нужны значения ключей, просто e['dynamodb']['Keys'] - person zyd; 03.02.2021