如何在 AWS Elastic Beanstalk 上使用 virtualenv 系统站点包?

Posted

技术标签:

【中文标题】如何在 AWS Elastic Beanstalk 上使用 virtualenv 系统站点包?【英文标题】:How to use virtualenv system-site-packages on AWS Elastic Beanstalk? 【发布时间】:2016-08-07 19:16:15 【问题描述】:

我必须处理在 AWS Elastic Beanstalk 上运行的现有 python (django) 应用程序。似乎所有要求(来自 requirements.txt)都安装在虚拟环境中(我希望我是对的)。我的问题是我使用 yum 安装了一些库。我的 beanstalk 实例的依赖项配置如下所示:

packages:
 yum:
  python27-devel: []
  git: []
  nginx: []
  pcre-devel: []
  freetype-devel: []
  libpng-devel: []
  postgresql93-devel: []
  graphviz-devel: []
  blas-devel: []
  atlas-devel: []
  lapack-devel: []
  gcc-c++: []
  python27-numpy: []
  python27-matplotlib: []
  python27-psycopg2: []

如您所见,我明确安装了一些 python 库,如 numpy、matplotlib 和 psycopg2,但由于我的应用程序似乎在虚拟环境中运行,因此我的应用程序无法访问这些库,因此它在启动时崩溃。我遇到了这种类型的错误:

实例上的命令失败。返回码:1 输出:(TRUNCATED)....7/site-packages/django/db/backends/postgresql_psycopg2/base.py",第 20 行,在 raise ImproperlyConfigured("Error loading psycopg2 module: %s" % e ) django.core.exceptions.ImproperlyConfigured: Error loading psycopg2 module: No module named psycopg2. container_command 01_migrate in .ebextensions/02-python.config failed. 有关更多详细信息,请使用控制台或检查 /var/log/eb-activity.log EB CLI。

我了解到您可以使用选项 system-site-packages 允许虚拟环境访问系统库,但是对于 AWS 弹性 beanstalk 实例如何做到这一点?

编辑:我不想做的是使用 pip 安装 numpy、matplotlib 和 psycopg2,因为它可以编译所有内容,而且时间很长。这就是我想用 yum 安装这些库以获得预编译版本的原因。而且我希望这些安装是自动的,我不想在机器上通过 ssh 手动安装。这就是我的问题出现的地方。 :)

非常感谢您的宝贵时间!

(对不起,我的英语不是我的母语)

【问题讨论】:

【参考方案1】:

TL;DR: 将以下命令添加到.ebextensions 文件夹下的配置文件中:

commands:
  01_add_dist_files_to_site:
    command: "echo /usr/lib64/python2.7/dist-packages > /opt/python/run/venv/local/lib64/python2.7/site-packages/dist.pth"

这应该将/usr/lib64/python2.7/dist-packages 下的库(例如 yum 安装 numpy 和 scipy...)暴露给 EB 的 virtualenv 使用的解释器。


Elastic Beanstalk 正在使用 /opt/python/run/venv/bin/pip install -r requirements.txt 来安装您的要求。 你需要设置 python virtualenv 使其暴露给你安装的包。

检查我发现的 EB 的 venv 可以访问的站点库:

(venv)[root@ip-XXXXXX app]# /opt/python/run/venv/bin/python2.7 -msite
sys.path = [
    '',
    '',
    '/opt/python/run/venv/local/lib64/python2.7/site-packages',
    '/opt/python/run/venv/local/lib/python2.7/site-packages',
    '/opt/python/run/venv/lib64/python2.7',
    '/opt/python/run/venv/lib/python2.7',
    '/opt/python/run/venv/lib64/python2.7/site-packages',
    '/opt/python/run/venv/lib/python2.7/site-packages',
    '/opt/python/run/venv/lib64/python2.7/lib-dynload',
    '/usr/lib64/python2.7',
    '/usr/lib/python2.7',
]

因此,将包含所需库路径的.pth 文件添加到列出的文件夹之一就足够了(请参阅here)。这可以像开头提到的那样完成。请注意,您需要您的 requirements.txt 来保存 python 软件包,其中包含使用 yum 安装的软件包的确切版本,以便跳过不必要的安装步骤。

【讨论】:

以上是关于如何在 AWS Elastic Beanstalk 上使用 virtualenv 系统站点包?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 AWS Elastic Beanstalk 上修改 Nginx 配置

如何在 AWS Elastic Beanstalk 上设置 HTTPS

如何在 AWS Elastic Beanstalk 上设置 HTTPS

如何在 AWS Elastic Beanstalk 中更改数据库配置

如何在 AWS Elastic Beanstalk 中选择特定平台?

如何使用 Elastic beanstalk 和 Dockerrun.aws.json 正确部署到 AWS?