Ошибка при тестировании Python lambda в консоли AWS

#python #amazon-web-services #aws-lambda #boto3 #amazon-kinesis

Вопрос:

Я пытаюсь внедрить лямбду с помощью python. Я получаю ошибку ниже при тестировании в консоли aws.

лямбда-манипулятор

 from datetime import datetime
import json
# import os
import boto3

DATA_ENGINEERING_BUCKET = "kinesis-archive"
RATE_PATH = "archive/rates"
s3_client = boto3.client('s3')

def lambda_handler(event, context):
    for record in event["Records"]:
        print(f"Event: {record['eventName']}/{record['eventID']}")
        table_arn, _ = record["eventSourceARN"].split("/stream")
        if record["PK"].startswith('CLASS'):
            key = '#'.join([record['PK'], record['SK']])
            s3_client.put_object(
                Body = json.dumps(record),
                Bucket = DATA_ENGINEERING_BUCKET,
                Key= '/'.join([RATE_PATH, key])
            )
    return { "statusCode": 200, "body": "OK" }
 

тестовый ввод

 {
  "Records": [
    {
      "kinesis": {
        "partitionKey": "partitionKey-03",
        "kinesisSchemaVersion": "1.0",
        "data": "SGVsbG8sIHRoaXMgaXMgYSB0ZXN0IDEyMy4=",
        "sequenceNumber": "49545115243490985018280067714973144582180062593244200961",
        "approximateArrivalTimestamp": 1428537600
      },
      "eventSource": "aws:kinesis",
      "eventID": "shardId-000000000000:49545115243490985018280067714973144582180062593244200961",
      "invokeIdentityArn": "arn:aws:iam::EXAMPLE",
      "eventVersion": "1.0",
      "eventName": "aws:kinesis:record",
      "eventSourceARN": "arn:aws:kinesis:EXAMPLE",
      "awsRegion": "us-east-1",
      "PK": "CLASS#CA",
      "SK": "1"
    }
  ]
}
 

ошибка

 Response
{
  "errorMessage": "not enough values to unpack (expected 2, got 1)",
  "errorType": "ValueError",
  "requestId": "d998cbd1-d537-4f24-8e30-65f7c350cf07",
  "stackTrace": [
    "  File "/var/task/lambda_function.py", line 17, in lambda_handlern    table_arn, _ = record["eventSourceARN"].split("/stream")n"
  ]
}

Function Logs
START RequestId: d998cbd1-d537-4f24-8e30-65f7c350cf07 Version: $LATEST
Event: aws:kinesis:record/shardId-000000000000:49545115243490985018280067714973144582180062593244200961
[ERROR] ValueError: not enough values to unpack (expected 2, got 1)
Traceback (most recent call last):
  File "/var/task/lambda_function.py", line 17, in lambda_handler
    table_arn, _ = record["eventSourceARN"].split("/stream")END RequestId: d998cbd1-d537-4f24-8e30-65f7c350cf07
REPORT RequestId: d998cbd1-d537-4f24-8e30-65f7c350cf07  Duration: 1.41 ms   Billed Duration: 2 ms   Memory Size: 128 MB Max Memory Used: 67 MB  
XRAY TraceId: 1-614ccd64-284f0f0f425eb6004bb5e1d0   SegmentId: 1fbd881072d3ec61 Sampled: true

Request ID
d998cbd1-d537-4f24-8e30-65f7c350cf07
 

Комментарии:

1. Вы пропустили сообщение об ошибке.

2. @MarkB Спасибо, что я его добавил

3. @AntarrByrd — Смотрите мой ответ 🙂

Ответ №1:

Ошибка ниже

 d = {"eventSourceARN": "arn:aws:kinesis:EXAMPLE"}
table_arn, _ = d["eventSourceARN"].split("/stream")
 

Ошибка:

 ValueError: not enough values to unpack (expected 2, got 1)
 

Похоже, вы предполагаете, что split вернет 2 элемента. Но это неправда.

решение состоит не в том, чтобы предполагать, сколько элементов нужно вернуть — проверьте во время выполнения, сколько элементов у вас есть в списке, который возвращается split

Комментарии:

1. это означает, что вы не изменили лямбда-код … Начните с тестирования на вашем локальном env. (ноутбук и т. Д.) И передайте ожидаемую полезную нагрузку. Как только он станет стабильным — загрузите его в AWS.