AWS Lambda报错UnboundLocalError:无法访问未赋值变量index_employee_image
AWS Lambda函数报错UnboundLocalError的解决
错误原因
你遇到的UnboundLocalError是因为**index_employee_image函数定义在lambda_handler内部且位于try-except代码块之后**。Python解释器执行代码时,会先运行try块里的response = index_employee_image(bucket, key),但此时该函数还未被定义,因此抛出“无法访问未关联值的局部变量”的错误。
修复方案
将index_employee_image和register_employee两个辅助函数移到lambda_handler外部,确保调用前函数已完成定义。
修复后的完整代码
import boto3 s3 = boto3.client('s3') rekognition = boto3.client('rekognition', region_name = 'ap-southeast-1') dynamodbTableName = 'employee' dynamodb = boto3.resource('dynamodb', region_name='ap-southeast-1') employeeTable = dynamodb.Table(dynamodbTableName) def index_employee_image(bucket, key): response = rekognition.index_faces( Image ={ 'S3Object': { 'Bucket':bucket, 'Name': key, } }, CollectionId = "employees" ) return response def register_employee(faceId, firstName, lastName): employeeTable.put_item( Item={ 'rekognitionId': faceId, 'firstName': firstName, 'lastName': lastName, } ) # 图片上传后,bucket名称和文件名会传入event参数 def lambda_handler(event, context): print(event) # 提取bucket名称和对象文件名 bucket = event['Records'][0]['s3']['bucket']['name'] key = event['Records'][0]['s3']['object']['key'] try: response = index_employee_image(bucket, key) print(response) if response['ResponseMetadata']['HTTPStatusCode'] == 200: faceId = response['FaceRecords'][0]['Face']['FaceId'] # 从文件名提取姓名 name = key.split('.')[0].split('_') firstName = name[0] lastName = name[1] register_employee(faceId, firstName, lastName) return response except Exception as e: print(e) print('处理存储桶{}中的员工图片{}时出错。'.format(bucket, key)) raise e
额外检查项
- 确认Rekognition的
employees人脸集合已创建 - 验证Lambda执行角色拥有S3读取、Rekognition索引人脸、DynamoDB写入的权限
- 确保上传的图片文件名符合
名_姓.后缀格式,避免split操作时出现索引越界错误
内容的提问来源于stack exchange,提问作者I Can Done
相关产品推荐
相关产品推荐

