AWS Lambda zip文件命令

时间:2017-10-03 20:41:46

标签: python amazon-web-services lambda zip

我遇到了运行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文件,因此会产生我在开头提到的相同错误。任何人都可以提供任何见解吗?

2 个答案:

答案 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)

这是我每次做的事情:

  1. 创建一个虚拟环境来安装依赖项:

     python3 -m venv nameOfYourVenvFolder
    
  2. 进入文件夹并激活虚拟环境:

     cd nameOfYourVenvFolder
     source bin/activate
    
  3. 安装 Lambda 可以访问的依赖项:

     pip3 install mysql-connector -t .
    
  4. 使依赖项与 Lambda (Linux) 兼容。即删除任何出现的 pycache 或 .dist-info 文件:

     rm *.dist-info
     rmdir __pycache__
    
  5. 压缩文件。您可以在终端中执行此操作,但只需选择所有文件 > 右键单击​​ > 压缩(在 Mac 上;Windows 类似)很容易。

  6. 如果 .zip 文件超过 50mb,则将 .zip 文件上传到 S3,然后上传到 Lambda。 50mb以下的.zip文件可以直接上传到Lambda。

如果您需要更具体的帮助,请告诉我,我很乐意为您解答!