AWS Lambda 函数返回 "errorMessage": "[Errno 30] 只读文件系统: '/home/sbx_user1051'"

vec*_*hah 4 python amazon-web-services docker aws-lambda

我收到以下错误

{
  "errorMessage": "[Errno 30] Read-only file system: '/home/sbx_user1051'",
  "errorType": "OSError",
  "stackTrace": [
    "  File \"/var/lang/lib/python3.8/imp.py\", line 234, in load_module\n    return load_source(name, filename, file)\n",
    "  File \"/var/lang/lib/python3.8/imp.py\", line 171, in load_source\n    module = _load(spec)\n",
    "  File \"<frozen importlib._bootstrap>\", line 702, in _load\n",
    "  File \"<frozen importlib._bootstrap>\", line 671, in _load_unlocked\n",
    "  File \"<frozen importlib._bootstrap_external>\", line 843, in exec_module\n",
    "  File \"<frozen importlib._bootstrap>\", line 219, in _call_with_frames_removed\n",
    "  File \"/var/task/app.py\", line 3, in <module>\n    nltk.download('stopwords')\n",
    "  File \"/var/task/nltk/downloader.py\", line 777, in download\n    for msg in self.incr_download(info_or_id, download_dir, force):\n",
    "  File \"/var/task/nltk/downloader.py\", line 642, in incr_download\n    yield from self._download_package(info, download_dir, force)\n",
    "  File \"/var/task/nltk/downloader.py\", line 699, in _download_package\n    os.makedirs(download_dir)\n",
    "  File \"/var/lang/lib/python3.8/os.py\", line 213, in makedirs\n    makedirs(head, exist_ok=exist_ok)\n",
    "  File \"/var/lang/lib/python3.8/os.py\", line 223, in makedirs\n    mkdir(name, mode)\n"
  ]
}
Run Code Online (Sandbox Code Playgroud)

当测试我的 lambda 函数时。我不明白这个错误告诉我如何处理我正在使用的 docker 映像,如果这甚至是正确的探索路线的话。我应该怎么办

Mar*_*k B 11

AWS Lambda 不是通用的 docker 运行程序。您部署到 Lambda 的 Docker 容器必须符合 AWS Lambda 运行时环境。

您正在使用的 docker 映像显然正在尝试写入路径/home/sbx_user1051。在 AWS Lambda 上,除了路径之外,文件系统始终是只读的/tmp。您必须修改 docker 映像中运行的代码,以防止其写入除/tmp/.

  • @vecohah,您应该阅读此处的先决条件 https://docs.aws.amazon.com/lambda/latest/dg/images-create.html。正如 Mark 所说,“容器映像必须能够在只读文件系统上运行。您的函数代码可以访问可写 /tmp 目录,其存储空间在 512 MB 到 10,240 MB 之间(以 1 MB 为增量)。Lambda 不是容器运行时引擎,如果您只想运行容器那么可能使用 ECS (2认同)
  • 您可以尝试将 Lambda 上的“HOME”变量配置为“/tmp”。这在某些情况下对我有用,但如果您需要从(实际)主目录读取内容,它可能会破坏其他东西。 (2认同)