我遇到了运行lambda函数的问题,上传的.zip
Python脚本文件总是生成"Unable to import module '...': No module named ..."
(我确保我的lambda处理程序与我的Python文件名匹配),并通过在线研究,我发现在这种情况下,压缩文件的方式非常严格。
该解决方案提供了以下命令示例
错误的命令:
$ ls
lambda_sample
$ zip -r lambda_sample lambda_sample
正确的命令:
$ cd lambda_sample
$ zip -r ../lambda_sample .
事实上,第二个命令对我有用。
所以我想知道为什么第一个命令不起作用?此外,我正在使用macOS,通过右键单击文件夹和Compress [folder_name]
会产生Lambda无法读取的[folder_name].zip
文件,因此会产生我在开头提到的相同错误。任何人都可以提供任何见解吗?
答案 0 :(得分:7)
AWS Lambda希望您的处理程序位于zip文件的base / root中,并且您显示的zip
命令会生成不同的文件布局。
我将通过我自己的系统中的一些示例进行演示。
这是您的第一个命令的示例:
> ls
package
> zip -r package package
adding: package/ (stored 0%)
adding: package/lambda.py (deflated 38%)
adding: package/process/ (stored 0%)
adding: package/process/__init__.py (stored 0%)
adding: package/process/aws.py (deflated 56%)
# ... etc.
如果我unzip package.zip
,生成的解压缩文件的文件夹结构如下所示:
package/lambda.py
package/process/
package/process/__init__.py
# and so on
现在,作为第二个命令的示例,我首先cd package
:
> zip -r ../package .
adding: lambda.py (deflated 38%)
adding: process/ (stored 0%)
# ... etc.
如果我unzip package.zip
看起来是这样的解压缩文件:
lambda.py
process/
process/__init__.py
# etc.
所以在第二种情况下,在扩展ZIP之后你没有父目录,并且AWS Lambda将正常工作。
答案 1 :(得分:0)
这是我每次做的事情:
创建一个虚拟环境来安装依赖项:
python3 -m venv nameOfYourVenvFolder
进入文件夹并激活虚拟环境:
cd nameOfYourVenvFolder
source bin/activate
安装 Lambda 可以访问的依赖项:
pip3 install mysql-connector -t .
使依赖项与 Lambda (Linux) 兼容。即删除任何出现的 pycache 或 .dist-info 文件:
rm *.dist-info
rmdir __pycache__
压缩文件。您可以在终端中执行此操作,但只需选择所有文件 > 右键单击 > 压缩(在 Mac 上;Windows 类似)很容易。
如果 .zip 文件超过 50mb,则将 .zip 文件上传到 S3,然后上传到 Lambda。 50mb以下的.zip文件可以直接上传到Lambda。
如果您需要更具体的帮助,请告诉我,我很乐意为您解答!