0

运行基于 python 的 aws lambda 时,出现只读文件系统错误。

但是,我没有做任何日志记录,它看起来像无服务器。

{
    "errorMessage": "Unable to marshal response: OSError(30, 'Read-only file system') is not JSON serializable",
    "errorType": "Runtime.MarshalError"
}

  Error --------------------------------------------------

  Error: Invoked function failed
    at AwsInvoke.log (/usr/local/Cellar/serverless/1.50.0/libexec/lib/node_modules/serverless/lib/plugins/aws/invoke/index.js:101:31)

这是我的 serverless.yml

provider:
  name: aws
  runtime: python3.7
functions:
  main:
    handler: main.handler
    package:
      include:
        - src/main.py
    layers:
      - {Ref: PythonRequirementsLambdaLayer}
    environment:
      REGION_NAME: us-west-2
custom:
  pythonRequirements:
    dockerFile: ./Dockerfile
    layer: true
plugins:
  - serverless-python-requirements

我已经将我的处理程序包装在一个 try-catch 中,但它甚至没有进入我的代码。

我希望我的 lambda 能够正确运行我的代码

4

1 回答 1

0

Unable to marshal response {repr} is not JSON serializable当处理程序返回一个不是 JSON 可序列化到 Lambda 的值时,会出现错误消息。

在某些时候,有些东西正在捕获异常并返回异常对象。

那么我们来看看OSError(30, 'Read-only file system')。这也是 Lambda 的一个常见问题:只允许在/tmp. 您的代码安装在只读卷中。

我已经将我的处理程序包装在一个 try-catch 中,但它甚至没有进入我的代码。

严格来说,它不会到达您的处理程序。

导入模块从顶部运行它;这些defclass块只是对模块命名空间的美化分配。当你导入其他模块时,它们可以运行任意代码,并且它们绝对可以尝试写入文件系统。

进一步诊断此问题的一种简单方法是:

  1. 将 zip 文件解压缩到它自己的目录中。
  2. 添加一个简单的助手来导入您的处理程序并调用它。
  3. chmod在 Windows 上将所有内容标记为只读或类似。
  4. 运行你的助手,看看有什么问题。

由于您直接引入了 PythonRequirementsLambdaLayer,因此您还可以将其解压到您的测试平台中以找出它在哪里中断。

于 2020-01-27T19:54:40.973 回答