创建CloudFormation资源未运行相关代码却报Lambda模块导入错误
问题根因
这个报错和你代码中是否存在put_object逻辑完全无关,本质是你配置的Lambda代码包目录结构/内容不符合运行要求,和本地的create_lambda函数是否执行没有关联,常见触发原因如下:
- 你目前上传到S3的代码包本身无效:你写的
put_object逻辑中Body参数传的是字符串'./lambdas/Hello.zip',并不是实际的zip文件二进制内容,最终上传到S3的是一个内容为路径字符串的无效文件,Lambda运行时自然无法加载有效代码。 - 代码包目录结构不匹配要求:你配置的Lambda处理程序为
xxxxx_notifications_app.handlers,要求zip包解压后根目录必须存在xxxxx_notifications_app文件夹,且文件夹下有handlers.py文件。如果打包时直接压缩了外层目录、或者模块名拼写错误,都会触发模块找不到的报错。 - 即便你不运行
create_lambda函数仍然报错,说明你CloudFormation模板中指定的Lambda代码源本身就是错误的,和你本地有没有写这段S3上传逻辑没有任何关系。
修复方案
- 修正S3上传逻辑,读取实际zip文件内容后再上传:
def create_lambda(session:SessionProxy,identifier:str): ARCHIVE = './lambdas/Hello.zip' BUCKET_NAME = 'hello-function-910283989807' ZIP_NAME = 'Hello.zip' REGION = 'us-east-2' s3_client = session.client("s3", region_name=REGION) s3_client.create_bucket(Bucket=BUCKET_NAME,CreateBucketConfiguration={'LocationConstraint': REGION}) # 修正上传逻辑,读取本地zip文件内容 with open(ARCHIVE, 'rb') as f: s3_client.put_object(Body=f.read(), Bucket=BUCKET_NAME, Key=ZIP_NAME)
- 调整zip打包规则:打包时进入代码根目录,直接选中所有模块文件、依赖文件夹压缩,不要打包外层目录。比如你的代码路径为
lambdas/xxxxx_notifications_app/handlers.py,需要进入lambdas目录后选中xxxxx_notifications_app文件夹直接压缩,确保zip解压后根目录直接可见对应模块文件夹。 - 核对CloudFormation模板中Lambda的
Handler参数拼写,确保和实际模块名、处理函数名完全一致。
内容的提问来源于stack exchange,提问作者user1148920
相关产品推荐
相关产品推荐

