如何为AWS Elastic Beanstalk应用程序安装matplotlib?

oro*_*ome 7 numpy pip matplotlib amazon-web-services amazon-elastic-beanstalk

我正忙着在AWS Elastic Beanstalk上部署matplotlib. 认为我的问题来自一些依赖关系以及EB部署使用PIP安装的软件包的方式,并试图按照SO上说明解决问题.

我首先尝试逐步部署,如链接的答案所示,通过添加matplotlib包堆栈到我的 requirements.txt各个部分分阶段文件中.但这需要永远(对于每个阶段)并且容易出现故障和超时(这似乎留下了后续软件包安装后面的构建目录).

因此,在答案结束时提到的简单解决方案对我eb ssh很有吸引力:只需激活virtialenv

source /opt/python/run/venv/bin/activate
Run Code Online (Sandbox Code Playgroud)

pip install手动打包.但我也无法让这个工作.首先,我经常遇到left-beind构建目录(如上所述)

pip can't proceed with requirement 'xxxx' due to a pre-existing build directory.
 location: /opt/python/run/venv/build/xxxx
This is likely due to a previous installation that failed.
pip is being responsible and not assuming it can delete this.
Please delete it and try again.
Run Code Online (Sandbox Code Playgroud)

但即使在删除这些之后,我也会一直得到

Exception:
Traceback (most recent call last):
  File "/opt/python/run/venv/lib/python2.7/site-packages/pip/basecommand.py", line 122, in main
    status = self.run(options, args)
  File "/opt/python/run/venv/lib/python2.7/site-packages/pip/commands/install.py", line 278, in run
    requirement_set.prepare_files(finder, force_root_egg_info=self.bundle, bundle=self.bundle)
  File "/opt/python/run/venv/lib/python2.7/site-packages/pip/req.py", line 1197, in prepare_files
    do_download,
  File "/opt/python/run/venv/lib/python2.7/site-packages/pip/req.py", line 1375, in unpack_url
    self.session,
  File "/opt/python/run/venv/lib/python2.7/site-packages/pip/download.py", line 582, in unpack_http_url
    unpack_file(temp_location, location, content_type, link)
  File "/opt/python/run/venv/lib/python2.7/site-packages/pip/util.py", line 625, in unpack_file
    untar_file(filename, location)
  File "/opt/python/run/venv/lib/python2.7/site-packages/pip/util.py", line 533, in untar_file
    os.makedirs(location)
  File "/opt/python/run/venv/lib64/python2.7/os.py", line 157, in makedirs
    mkdir(name, mode)
OSError: [Errno 13] Permission denied: '/opt/python/run/venv/build/xxxx'
Run Code Online (Sandbox Code Playgroud)

回应pip install xxxx(并sudo pip失败sudo: pip: command not found).

我可以做些什么来使用AWS-EB?特别是,我需要做些什么来使简单的SSH + PIP方法工作; 还是有其他更好的 - 更简单! - 我应该尝试的方法.


FWIW,我有一个.ebextensions/software.config

packages:
  yum:
    gcc-c++: []
    gcc-gfortran: []
    python-devel: []
    atlas-sse3-devel: []
    lapack-devel: []
    libpng-devel: []
    freetype-devel: []
    zlib-devel: []
Run Code Online (Sandbox Code Playgroud)

并以a requirements.txt结尾

pytz==2014.10
pyparsing==2.0.3
python-dateutil==2.4.0
nose==1.3.4
six>=1.8.0
mock==1.0.1

numpy==1.9.1

matplotlib==1.4.2
Run Code Online (Sandbox Code Playgroud)

大约4个小时之后,我已经达到了numpy(如pip listEB virtualenv 报道的那样).

并且(如果它很重要)正在进行SSH连接的用户属于具有该策略的组

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "elasticbeanstalk:*",
        "ec2:*",
        "elasticloadbalancing:*",
        "autoscaling:*",
        "cloudwatch:*",
        "s3:*",
        "sns:*",
        "cloudformation:*",
        "rds:*",
        "sqs:*",
        "iam:PassRole"
      ],
      "Resource": "*"
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

Jan*_*cke 5

我在Windows和Linux系统上使用了很多方法来构建和部署numpy/scipy/matplotlib.我使用过系统提供的软件包管理器(aptitude,rpm),第三方软件包管理器(pypm),Python软件包管理器(easy_install,pip),源代码发布,使用不同的构建环境/工具(GCC,还有英特尔MKL,OpenMP) ).在这样做的同时,我遇到了许多非常烦人的情况,但也学到了很多关于每种方法的利弊.

我没有Elastic Beanstalk(EB)的经验,但我有EC2的经验.我看到你可以通过SSH连接到一个实例并进行搜索.所以,我在下面进一步建议是基于

  • 上述经验和
  • 关于Beanstalk的或多或少明显的边界条件
  • 你的应用场景,在SO和on上的另一个问题中描述
  • 事实上,你只是想快速运行

我的建议:从不自己建造这些东西开始.不要使用pip.如果可能的话,尝试使用Linux发行版的软件包管理器,让它通过一个命令(例如)处理所需一切安装sudo apt-get install python-matplotlib.

缺点:

  • 可能是旧的软件包版本,具体取决于使用的Linux发行版
  • 非优化构建(例如,不针对例如英特尔MKL构建或不利用OpenMP功能或不使用特殊指令集)

好处:

  • 它可以快速下载,因为软件包最有可能在您的计算机附近缓存
  • 它快速安装(这些包是预先构建的,不涉及编译)
  • 它只是工作

因此,我希望您可以在这些机器上使用aptitude或rpm或其他任何东西,并继承分发包维护人员在幕后为您做的出色工作.

一旦您对应用程序有信心并发现了一些瓶颈或问题,您可能有理由使用较新版本的numpy/matplotlib/...或者您可能有理由通过创建优化版本来获得更快版本的版本.

编辑:概述方法的EB相关详细信息

与此同时,我们了解到EB默认运行基于Red Hat Enterprise Linux的Amazon Linux.同样,它yum用作包管理器,包是RPM格式.

亚马逊提供有关可用包的文档.在Amazon Linux 2014.09中,可以使用以下软件包:http://aws.amazon.com/de/amazon-linux-ami/2014.09-packages/

在这个列表中我们发现

  • numpy的-1.7.2
  • 上python-matplotlib-0.99.1.2

根据2009年9月的更新日志,这个版本的matplotlib已经很老了:"2009-09-21标记为0.99.1版".

我没想到它会如此陈旧,但仍然可能足以满足您的需求.所以我们继续我们的计划(但我知道这是否是一个阻止者).

现在,我们已经了解到系统Python和EB Python是相互隔离的.这并不意味着EB Python无法访问系统Python站点包.我们只是需要这样说.一个简单而干净的方法是使用EB Python可以访问的包建立一个正确的目录结构,并通过这个目录与EB Python进行通信sys.path.

显然,我们需要定制EB容器的自举阶段.可用的工具在此处记录:http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/customize-containers-ec2.html

显然,我们想要使用这种packages方法,并告诉EB 通过yum 安装numpypython-matplotlib包.所以相应的配置文件部分应该包含:

 packages:  
  yum:  
   numpy: []  
   python-matplotlib: []  
Run Code Online (Sandbox Code Playgroud)

numpy可能没有必要明确提及,它可能是python-matplotlib的依赖.

另外,我们需要使用以下commands部分:

您可以使用命令键在EC2实例上执行命令.命令按名称按字母顺序处理,并在设置应用程序和Web服务器并提取应用程序版本文件之前运行.

以下三个命令创建上述目录,并设置指向numpy/mpl安装路径的符号链接(希望这些路径在执行这些命令时可用):

commands:
  00-create-dir:
    command: "mkdir -p /opt/py26-selected-site-packages"
  01-link-numpy:
    command: "ln -s /usr/lib64/python2.6/site-packages/numpy /opt/py26-selected-site-packages/numpy"
  02-link-mpl:
    command: "ln -s /usr/lib64/python2.6/site-packages/matplotlib /opt/py26-selected-site-packages/matplotlib"
Run Code Online (Sandbox Code Playgroud)

两个不确定因素:AWS文档不澄清packagescommands执行之前处理的文档.你得试试.它不起作用,使用container_commands.其次,/usr/lib64/python2.6/site-packages/matplotlib在安装python-matplotlib之后,它只是一个有根据的猜测.它应该安装到这个地方,但它可能会在其他地方结束.需要测试.其中指定为推断numpy的应该结束了这个文章.

[SEB更新] AWS文档说"cfn-init帮助程序脚本按以下顺序处理这些配置部分:包,组,用户,源,文件,命令,然后是服务." http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-init.html

所以,你的方法是安全的[/ UPDATE]

正如本答案的评论中所指出的,关键步骤是告诉您的Python应用程序在哪里查找包.sys.path 尝试导入之前直接修改是控制此操作的可靠方法.以下代码将我们的特殊目录添加到Python查找包的目录选择中,然后尝试导入matplotlib:

sys.path.append("/opt/py26-selected-site-packages")
from matplotlib import pyplot
Run Code Online (Sandbox Code Playgroud)

顺序sys.path定义了优先级,所以如果在其他目录中有任何其他matplotlib或numpy包可用,那么它可能是一个更好的主意

sys.path.insert(0, "/opt/py26-selected-site-packages")
Run Code Online (Sandbox Code Playgroud)

但是,如果我们的整个方法经过深思熟虑,这不应该是必要的.