【问题标题】:Permission denied after uploading AWS Lambda python zip from S3从 S3 上传 AWS Lambda python zip 后权限被拒绝
【发布时间】:2017-09-06 13:26:34
【问题描述】:

从 S3 将 python zip 包上传到 AWS Lambda 时,我收到以下神秘错误:

module initialization error: [Errno 13] Permission denied: '/var/task/lambda_function.py'

错误似乎是,如果您创建具有限制性权限的 zip 包,那么 AWS 会感到困惑。本质上,AWS 会使用您授予的权限解压缩您的包并尝试使用它。尤其令人困惑的是,您可能能够从 AWS Lambda 内联代码编辑器中看到部分 zip 文件(因此您显然有一些权限),但 Lambda 函数会给出上述错误。

处理此问题的最佳方法是什么(更好的错误消息或解决问题)?

【问题讨论】:

    标签: python aws-lambda


    【解决方案1】:

    我使用的方法是小心我如何在 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)。

    【讨论】:

    • 其实 Lambda 要求文件只有所有用户的读取权限,所以zinfo.external_attr = 0o744 &lt;&lt; 16 应该足够了。
    • 以防万一有人遇到这个答案,这很有帮助,谢谢@oxer。我必须使用上述其他代码执行with zipfile.ZipFile(zip_filename, 'w') as myzip: ,否则我会从 AWS 收到“无法解压缩上传的文件”错误。
    【解决方案2】:

    我使用 serverless 将我的 Python2.7 代码部署到 AWS,并在 CloudWatch 中记录了类似的问题:

    Unable to import module handler: No module named handler
    

    我在网上搜索了解决方案,得到的信息是,当serverless 将代码部署到 AWS(迄今为止)时,它可能以与文件系统上相同的权限部署文件。

    在这种情况下,由于我的 Python 文件 handler.py 是只读的,Lambda 将无法执行该文件。因此,我解决问题的方法是在部署前设置644权限。在命令行中,运行:

    chmod 644 handler.py
    

    希望对您有所帮助。顺便说一句,我正在使用 macOS Mojave。

    【讨论】:

      【解决方案3】:

      我在通过 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')
      

      【讨论】:

        【解决方案4】:

        在您的lambda_function.py 所在目录中,运行以下命令:

        chmod 644 $(find . -type f)
        chmod 755 $(find . -type d)
        

        以上命令使当前目录中的所有文件和文件夹都可以被任何用户读取。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-12-07
          • 2022-06-17
          • 2021-09-30
          • 2020-09-30
          • 1970-01-01
          • 2023-03-06
          • 2017-09-18
          • 2011-03-04
          相关资源
          最近更新 更多