Лямбда-функция не запускается при обновлении DynamodB: Ошибка ключа - PullRequest
0 голосов
/ 18 октября 2018

Я пытаюсь загрузить простую таблицу Transactions.txt в корзину S3, где функция Lambda читает файл и заполняет таблицы DynamoDB для клиентов и транзакций.Это все отлично работает.Однако у меня также есть лямбда-функция, которая должна читать таблицу транзакций, когда они заполняют таблицу, суммировать итоги транзакций по клиенту и вставлять их в другую таблицу DynamoDB - TransactionTotal.

Моя лямбда-функция TotalNotifierвыдает «KeyError» относительно «нового изображения».Я считаю, что код в порядке, и я попытался изменить тип потоков с «Новый и старый» на «Новый» для таблицы «Транзакции» и все еще сталкиваюсь с той же ошибкой.

from __future__ import print_function
import json, boto3

# Connect to SNS
sns = boto3.client('sns')
alertTopic = 'HighBalanceAlert'
snsTopicArn = [t['TopicArn'] for t in sns.list_topics()['Topics'] if t['TopicArn'].endswith(':' + alertTopic)][0]

# Connect to DynamoDB
dynamodb = boto3.resource('dynamodb')
transactionTotalTableName = 'TransactionTotal'
transactionsTotalTable = dynamodb.Table(transactionTotalTableName);

# This handler is executed every time the Lambda function is triggered
def lambda_handler(event, context):

  # Show the incoming event in the debug log
  print("Event received by Lambda function: " + json.dumps(event, indent=2))

  # For each transaction added, calculate the new Transactions Total
  for record in event['Records']:
    customerId = record['dynamodb']['NewImage']['CustomerId']['S']
    transactionAmount = int(record['dynamodb']['NewImage']['TransactionAmount']['N'])

    # Update the customer's total in the TransactionTotal DynamoDB table
    response = transactionsTotalTable.update_item(
      Key={
        'CustomerId': customerId
  },
  UpdateExpression="add accountBalance :val",
  ExpressionAttributeValues={
    ':val': transactionAmount
  },
  ReturnValues="UPDATED_NEW"
)

Вот примерошибка из журнала CloudWatch:

'NewImage': KeyError
Traceback (most recent call last):
File "/var/task/lambda_function.py", line 30, in lambda_handler
customerId = record['dynamodb']['NewImage']['CustomerId']['S']
KeyError: 'NewImage'

1 Ответ

0 голосов
/ 18 октября 2018

Чтобы уточнить комментарий Олувафеми, вы, вероятно, испытываете эту ошибку при получении события REMOVE.Независимо от того, является ли ваш поток новыми и старыми изображениями или просто новыми, вы не получите NEW_IMAGE для события REMOVE, поскольку нового изображения нет.Посмотрите пример событий в документах aws.

Проверка значения record['eventName'] должна решить проблему.

...