从S3上传python zip包到AWS Lambda时,我收到以下隐藏错误:
module initialization error: [Errno 13] Permission denied: '/var/task/lambda_function.py'
错误似乎是如果您创建具有限制权限的zip包,那么AWS会感到困惑。从本质上讲,AWS会使用您提供的权限解压缩您的程序包并尝试使用它。让您特别困惑的是,您可以从AWS Lambda内联代码编辑器中看到部分zip文件(因此您显然拥有一些权限),但Lambda函数会出现上述错误。
处理此问题的最佳方法是什么(更好的错误信息或解决问题)?
答案 0 :(得分:4)
我使用的方法是在python中创建我的zip包时要小心。
而不是做像
这样的事情ziph = zipfile.ZipFile(zip_filename, 'w', zipfile.ZIP_DEFLATED)
ziph.writestr(file_name, my_data)
我用
替换了上面的最后一行zinfo = zipfile.ZipInfo(file_name)
zinfo.external_attr = 0o777 << 16 # give full access to included file
ziph.writestr(zinfo, my_data)
确保明确授予完整权限。如果您不这样做,那么writestr
将使用限制性太强的默认权限。 (注意:上面是python 3.6)。
答案 1 :(得分:1)
我使用Python2.7
将serverless
代码部署到AWS上,并遇到了类似的问题,该问题在CloudWatch中记录为:
Unable to import module handler: No module named handler
我在线搜索了解决方案,并得到了信息,当serverless
将代码部署到AWS时(迄今为止),它可能会以与文件系统上相同的权限来部署文件。
在这种情况下,由于我的Python文件handler.py
是只读的,因此Lambda将无法执行该文件。因此,我解决问题的方法是在部署前设置644权限。在命令行中,运行:
chmod 644 handler.py
希望有帮助。顺便说一下,我正在使用macOS Mojave。
答案 2 :(得分:0)
我在通过Azure Devops部署Lambda时遇到了类似的问题。
以下python任务对其进行了修复:
- task: PythonScript@0
displayName: zip inspector.py
inputs:
scriptSource: inline
script: |
from zipfile import ZipFile
with ZipFile('inspector.zip', 'w') as zf:
zf.write('inspector.py')
答案 3 :(得分:0)
在您的 lambda_function.py
所在的目录中,运行以下命令:
chmod 644 $(find . -type f)
chmod 755 $(find . -type d)
以上命令使当前目录中的所有文件和文件夹都可以被任何用户读取。