簡體   English   中英

如何為AWS Elastic Beanstalk應用程序安裝matplotlib?

[英]How can I install matplotlib for my AWS Elastic Beanstalk application?

我正忙着在AWS Elastic Beanstalk上部署matplotlib。 認為我的問題來自一些依賴關系以及EB部署使用PIP安裝的軟件包的方式,並試圖按照SO上說明解決問題。

我首先嘗試逐步部署,如鏈接答案中所建議的那樣,將matplotlib包堆棧的各個部分分階段添加到我的requirements.txt文件中。 但這需要永遠 (對於每個階段)並且容易出現故障和超時(這似乎留下了后續軟件包安裝后面的構建目錄)。

所以在答案結尾處提到的簡單解決方案對我很有吸引力:只需eb ssh ,激活virtialenv

source /opt/python/run/venv/bin/activate

並手動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.

但即使在刪除這些之后,我也會一直得到

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'

響應pip install xxxxsudo 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: []

以及以。結尾的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

大約4個小時之后,我已經變得笨拙(正如EB virtualenv中的pip list所報告的那樣)。

並且(如果它很重要)正在進行SSH連接的用戶屬於具有該策略的組

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

我在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 )處理所需一切 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可以訪問的包建立正確的目錄結構,並通過sys.path將此目錄傳遞給EB Python。

顯然,我們需要定制EB容器的自舉階段。 可用的工具在此處記錄: http//docs.aws.amazon.com/elasticbeanstalk/latest/dg/customize-containers-ec2.html

顯然,我們想要使用packages方法,並告訴EB通過yum安裝numpypython-matplotlib包。 所以相應的配置文件部分應該包含:

 packages:  
  yum:  
   numpy: []  
   python-matplotlib: []  

明確提到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"

兩個不確定因素:AWS文檔沒有說明在執行commands之前處理packages 你得試試。 它不起作用,使用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

sys.path的順序定義了優先級,因此如果在其他目錄中有任何其他matplotlib或numpy包可用,則可能更好的做法是

sys.path.insert(0, "/opt/py26-selected-site-packages")

但是,如果我們的整個方法經過深思熟慮,這不應該是必要的。

添加到Jan-Philip答案:

AWS Elastic Beanstalk正在使用Amazon Linux發行版(.Net環境除外)。 Amazon Linux使用yum包管理器。 MatPlotLib可在亞馬遜的軟件存儲庫中找到。

[ec2-user@ip-1-1-1-174 ~]$ yum list | grep matplot
python-matplotlib.x86_64            0.99.1.2-1.6.amzn1              amzn-main

如果這個版本是您的應用程序所需的版本,我會嘗試簡單地修改.ebextensions/software.config文件並將包添加到它的yum部分:

packages:
  yum:
    python-matplotlib: [] 
    python-devel: []
    atlas-sse3-devel: []
    lapack-devel: []
    libpng-devel: []
    freetype-devel: []
    zlib-devel: []

關於AWS Elastic BeansTalk和SSH的最后一個注釋。

雖然亞馬遜為您提供了連接到Elastic Beanstalk實例的可能性,但您應該僅將這種可能性用於調試目的,以了解您的應用程序失敗或未按建議安裝的原因。

除此之外,您的部署必須是100%自動的。 當Elastic Beanstalk(精確的Auto Scaling)將擴展您的基礎架構(添加更多實例)或根據您的應用程序工作負載將其擴展(終止實例)時,所有手動配置都將丟失。

最佳做法是不在生產環境中安裝SSH密鑰,它進一步減少了攻擊的表面。

我可能對這個問題有點遲了,但是隨着AWS和許多雲服務提供商進入Docker並考慮到你沒有指定平台。 我有一個快速解決你的問題的方法:

  1. 使用通用docker平台。
  2. 我預先安裝了Python,Numpy,Scipy和Matplotlib創建了一些圖像,因此您可以直接拉動並開始使用一行代碼。

Python 2.7(這個也有你為numpy和matplotlib指定的版本)

sudo docker pull chuseuiti/pynuscimat2.7

Python 3.4

sudo docker pull chuseuiti/pynusci

但是,您可以創建自己的圖像或修改現有圖像。

如果您想自動化實例,可以使用圖像定義將Dockerfile傳遞給AWS。

提示,如果您不了解docker:

需要先登錄才能拉:

sudo docker login

拉動圖像后,您可以使用下一個代碼生成並處理從圖像創建的容器:

 sudo docker run -i -t chuseuiti/pynuscimat2.7 bash

PS。 至少對於免費層,AWS總是抱怨scipy和matplotlib耗盡時間,安裝它們需要花費太多時間,這就是我使用此選項的原因。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM