AWS控制台测试Python Lambda触发值解包错误问题排查
错误原因
报错指向代码第17行的table_arn, _ = record["eventSourceARN"].split("/stream")语句:
- 你当前测试用例中
eventSourceARN字段的值为arn:aws:kinesis:EXAMPLE,不包含/stream子串 - 调用
split("/stream")后只会返回1个元素,无法解包赋值给2个变量,因此触发ValueError: not enough values to unpack (expected 2, got 1)错误 - 额外观察:你拆分得到的
table_arn变量在后续代码中没有被使用,这行逻辑属于冗余代码
解决方案
方案1:删除冗余代码(最简便)
直接删掉没用的ARN拆分行即可,修改后的完整代码如下:
from datetime import datetime import json 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']}") 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" }
方案2:保留ARN解析逻辑
如果后续业务需要用到Kinesis流ARN,有两种修复方式:
- 修改测试用例:真实Kinesis流的ARN标准格式为
arn:aws:kinesis:<区域>:<账号ID>:stream/<流名称>,把测试用例中eventSourceARN的值替换为符合格式的内容即可,例如:"eventSourceARN": "arn:aws:kinesis:us-east-1:123456789012:stream/test-kinesis-stream" - 优化拆分逻辑:兼容不含
/stream的ARN场景,避免解包失败:# 最多拆分1次,无匹配内容时直接用完整ARN作为table_arn arn_parts = record["eventSourceARN"].split("/stream", 1) table_arn = arn_parts[0]
内容的提问来源于stack exchange,提问作者Antarr Byrd
相关产品推荐
相关产品推荐

