[英]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 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: []
以及以。結尾的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連接到一個實例並進行搜索。 所以,我在下面進一步建議是基於
我的建議:從不自己建造這些東西開始。 不要使用pip。 如果可能的話,嘗試使用Linux發行版的軟件包管理器,讓它通過一個命令(例如sudo apt-get install python-matplotlib
)處理所需的一切 sudo apt-get install python-matplotlib
。
缺點:
好處:
因此,我希望您可以在這些機器上使用aptitude或rpm或其他任何東西,並繼承分發包維護人員在幕后為您做的出色工作。
一旦您對應用程序有信心並發現了一些瓶頸或問題,您可能有理由使用較新版本的numpy / matplotlib / ...或者您可能有理由通過創建優化版本來獲得更快版本的版本。
與此同時,我們了解到EB默認運行基於Red Hat Enterprise Linux的Amazon Linux。 同樣,它使用yum
作為包管理器,包使用RPM格式。
亞馬遜提供有關可用包的文檔。 在Amazon Linux 2014.09中,可以使用以下軟件包: http ://aws.amazon.com/de/amazon-linux-ami/2014.09-packages/
在這個列表中我們發現
根據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安裝numpy
和python-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並考慮到你沒有指定平台。 我有一個快速解決你的問題的方法:
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.