Lambda S3触发器报No such file or directory错误,需修改哪部分代码?
Lambda报错修复方案
核心报错原因
你遇到的No such file or directory报错是因为代码仅拼接了本地临时存储路径,没有实际将S3上的图片下载到Lambda本地的/tmp目录,直接读取不存在的路径就会触发该错误。除此之外代码还有2处逻辑/依赖问题需要同步修正:
需修改的内容
- 补充S3文件下载逻辑:获取到bucket和key后,调用
download_file接口将S3文件写入本地/tmp路径
- 补充S3文件下载逻辑:获取到bucket和key后,调用
- 修正代码缩进:文件读取、模型推理的逻辑必须放到for循环内部,否则仅能处理最后一条事件记录,甚至会出现变量未定义问题
- 补全依赖导入:顶部新增
import numpy as np,否则调用np.argmax会报模块不存在错误
- 补全依赖导入:顶部新增
修正后完整代码
import urllib.parse import boto3 import uuid import os import io import json import csv import numpy as np # 优先读取环境变量的终端节点名,不存在则用默认值 ENDPOINT_NAME = os.environ.get('ENDPOINT_NAME', 'T4') runtime= boto3.client('runtime.sagemaker') s3_client = boto3.client('s3') def handler(event, context): try: for record in event['Records']: bucket = record['s3']['bucket']['name'] key = record['s3']['object']['key'] download_path = '/tmp/{}'.format(key) # 新增S3文件下载逻辑 s3_client.download_file(bucket, key, download_path) with open(download_path, 'rb') as f: payload = f.read() payload = bytearray(payload) response = runtime.invoke_endpoint( EndpointName=ENDPOINT_NAME, ContentType='application/x-image', Body=payload ) result = json.loads(response['Body'].read().decode()) print(result) index = np.argmax(result) image_categories = ['glass', 'plastic bag', 'food', 'metal', 'styrofoam', 'paper','plastic', 'clothing'] print("Result: label - " + image_categories[index] + ", probability - " + str(result[index])) return image_categories[index] except Exception as e: print(e)
内容的提问来源于stack exchange,提问作者최희재
相关产品推荐
相关产品推荐

