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 安装错误