AWS Elastic Beanstalk Flask 应用程序:Toolkit 找不到出现在 EC2 实例上的资源

Posted

技术标签:

【中文标题】AWS Elastic Beanstalk Flask 应用程序:Toolkit 找不到出现在 EC2 实例上的资源【英文标题】:AWS Elastic Beanstalk Flask Application: Toolkit Can't Find Resource That Appears to be Present on EC2 Instance 【发布时间】:2018-07-25 16:43:18 【问题描述】:

我正在尝试使用 AWS Elastic Beanstalk 部署烧瓶/python 应用程序,但由于缺少资源而出现“500 内部服务器”错误。该应用程序在本地运行,但在 Elastic Beanstalk 管理的 EC2 实例上运行时,其中一个后端组件找不到所需的资源。

我正在使用包含在我的 requirements.txt 文件中的自然语言工具包,以将其作为 pip 包下载。 nltk 软件包安装似乎已经成功,因为我没有在线上出现错误:

import nltk

我在应用程序代码中遇到错误的那一行是:

sent_detector = nltk.data.load('tokenizers/punkt/english.pickle')

我在日志结尾遇到的错误是:

[Wed Feb 14 22:17:10.731016 2018] [:error] [pid 13894] [remote 172.31.0.22:252]   Resource \x1b[93mpunkt\x1b[0m not found.
[Wed Feb 14 22:17:10.731018 2018] [:error] [pid 13894] [remote 172.31.0.22:252]   Please use the NLTK Downloader to obtain the resource:
[Wed Feb 14 22:17:10.731020 2018] [:error] [pid 13894] [remote 172.31.0.22:252] 
[Wed Feb 14 22:17:10.731023 2018] [:error] [pid 13894] [remote 172.31.0.22:252]   \x1b[31m>>> import nltk
[Wed Feb 14 22:17:10.731025 2018] [:error] [pid 13894] [remote 172.31.0.22:252]   >>> nltk.download('punkt')
[Wed Feb 14 22:17:10.731027 2018] [:error] [pid 13894] [remote 172.31.0.22:252]   \x1b[0m
[Wed Feb 14 22:17:10.731029 2018] [:error] [pid 13894] [remote 172.31.0.22:252]   Searched in:
[Wed Feb 14 22:17:10.731031 2018] [:error] [pid 13894] [remote 172.31.0.22:252]     - '/home/wsgi/nltk_data'
[Wed Feb 14 22:17:10.731034 2018] [:error] [pid 13894] [remote 172.31.0.22:252]     - '/usr/share/nltk_data'
[Wed Feb 14 22:17:10.731036 2018] [:error] [pid 13894] [remote 172.31.0.22:252]     - '/usr/local/share/nltk_data'
[Wed Feb 14 22:17:10.731038 2018] [:error] [pid 13894] [remote 172.31.0.22:252]     - '/usr/lib/nltk_data'
[Wed Feb 14 22:17:10.731040 2018] [:error] [pid 13894] [remote 172.31.0.22:252]     - '/usr/local/lib/nltk_data'
[Wed Feb 14 22:17:10.731043 2018] [:error] [pid 13894] [remote 172.31.0.22:252]     - '/opt/python/run/venv/nltk_data'
[Wed Feb 14 22:17:10.731045 2018] [:error] [pid 13894] [remote 172.31.0.22:252]     - '/opt/python/run/venv/lib/nltk_data'
[Wed Feb 14 22:17:10.731047 2018] [:error] [pid 13894] [remote 172.31.0.22:252]     - ''
[Wed Feb 14 22:17:10.731049 2018] [:error] [pid 13894] [remote 172.31.0.22:252]

当我添加行时

nltk.download('punkt')

为了确保我需要的资源会被下载到我的应用程序,我在错误日志中收到此消息:

[Wed Feb 14 22:30:07.861273 2018] [:error] [pid 28765] [nltk_data] Downloading package punkt to /home/wsgi/nltk_data...

然后是一系列错误,归结为:

[Wed Feb 14 22:30:07.864521 2018] [:error] [pid 28765] [remote 172.31.0.22:55448] FileNotFoundError: [Errno 2] No such file or directory: '/home/wsgi/nltk_data'

所以我通过 SSH-d 进入我的 EC2 实例,进入虚拟环境,看起来我的应用正在使用

从 opt/python/run 目录运行
$source venv/bin/activate

并打开了python解释器。我跑的时候

>>import nltk
>>nltk.download('punkt')

我回来了

[nltk_data] 正在下载包 punkt 到 /home/ec2-user/nltk_data... [nltk_data] 包 punkt 已经是最新的了! 是的

所以我也试过了

>>> nltk.data.load('tokenizers/punkt/english.pickle')

又回来了:

<nltk.tokenize.punkt.PunktSentenceTokenizer object at 0x7fb8afd34080>

所以,我的 EC2 实例上的 nltk 包似乎知道 nltk_data 资源在哪里,只要我的 Flask 应用程序没有询问它。我也试过输入

>>nltk.data.path.append('home/ec2-user/nltk_data')

并且仍然得到与我在上面发布的相同的错误,但没有迹象表明我的尝试附加了路径列表以检查 nltk_data 是否已通过。

我不确定我需要什么才能让 nltk 找到它试图查找的 nltk_data 资源所在的位置。

我看到 .ebextensions 提到了依赖问题,并尝试阅读有关它的 AWS 页面,但我不确定它究竟如何适应我的应用程序出现的问题。可能是我的学习曲线网络开发素养问题。

感谢您就这种情况提供的任何澄清!

【问题讨论】:

【参考方案1】:

在将 FastAPI 端点部署到 Elastic Beanstalk 时,我遇到了完全相同的问题。我建议您设置您的 EB 平台以运行 Docker,然后在构建时下载 nltk 模型。您的 Dockerfile 将如下所示:

FROM tiangolo/uvicorn-gunicorn-fastapi:python3.7

RUN pip install --upgrade pip

# Install requirements
COPY ./app/requirements.txt /app/requirements.txt
RUN pip install -r /app/requirements.txt
RUN python -m nltk.downloader 'popular'

# Tell the base image where to find the application entrypoint
ENV MODULE_NAME=app.main
ENV VARIABLE_NAME=api

# Copy required packages and source files
COPY . .

EXPOSE 80

【讨论】:

【参考方案2】:

我通过 SSH 连接到我的实例并使用来自 http://www.nltk.org/data.html 的以下命令下载 nltk_data 资源解决了这个问题:

sudo python -m nltk.downloader -d /usr/local/share/nltk_data all

之后,nltk 模块在查找资源时没有任何问题。

【讨论】:

以上是关于AWS Elastic Beanstalk Flask 应用程序:Toolkit 找不到出现在 EC2 实例上的资源的主要内容,如果未能解决你的问题,请参考以下文章

AWS Elastic Beanstalk CLI 安装错误

text AWS Elastic Beanstalk

HTTPS Elastic Beanstalk (AWS) 到 Android

AWS Elastic Beanstalk 无法担任角色

AWS Elastic Beanstalk

AWS Elastic Beanstalk chown PythonPath 错误