我有一个Python 3项目,我试图通过AWS Codestar部署到AWS Lambda - > Codepipeline - > Codebuild - > Cloudformation。
我的项目(实际上只包含一个简单的API网关处理程序方法)导入了Python 3(需要3个)项目(报纸)。我在我的家用电脑上使用Virtualenv 15.1.0,如果我用Python 3.5安装Newspaper然后上传到Lambda(Python 3.6运行时),它会抛出与PIL / Pillow相关的错误。
首先它说它无法找到_image,这似乎是通过删除site-packages中的PIL目录来解决的,但这只会导致它抛出无法找到PIL的错误。
但是,如果我使用Python 3.6构建然后上传到Lambda,它可以正常工作(无论我是否删除PIL)。
所以,在我看来,我无法使用3.5安装Newspaper并尝试在3.6运行时执行。
所以,现在我尝试通过Codestar进行部署,但Codestar似乎默认为aws / codebuild / eb-nodejs-4.4.6-amazonlinux-64:2.1.3,即使对于Python项目,所有它似乎在Yum存储库中可用的是Python 3.5,当然Lambda只有3.6运行时。
即使我在Codebuild本身内切换图像,似乎没有使用Python3.6运行时构建的任何图像(根据文档)。甚至Docker图像似乎都缺少Python 3.6。
所以,我正在尝试在我的buildspec.yml文件的INSTALL阶段在Codebuild中安装Python 3.6,但是在安装后我找不到python3 *可执行文件。
我能想到的唯一另一件事是创建Codestar项目,编辑codebuild以使用Ubuntu然后安装所有内容(就像我在本地做的那样),但是没有办法在Codestar中做到这一点我感觉像这可能会让我陷入一个兔子洞,这很难自动化。有没有办法将该配置作为我项目中的代码?
修改 尝试从源代码构建和安装Python 3.6,但是当尝试安装Pip时,我得到错误,说没有安装SSL。回顾构建日志时,似乎还没有安装其他“位”。
所以,我的问题是:
编辑1 对于其他任何人,我的完整的buildspec.yml用于安装和使用Python3.6如下。请注意,它可以使一切尽可能安静,以减少日志消息,降低Cloudwatch成本并加快流程。通过这样做(安装Python并构建我的应用程序),我最终在整个过程中大约缩短了90秒。由于CodeBuild根据花费的时间收费,因此这是至关重要的。
version: 0.2
phases:
install:
commands:
- yum -qye 0 update
- yum -qye 0 groupinstall development
- yum -y install python-devel
- yum -qye 0 install libxml2-devel libxslt-devel libjpeg-devel zlib-devel libpng-devel openssl-devel sqlite-devel
- export HOME_DIR=`pwd`
# I would recommend hosting the tarball in an uncompressed format on S3 in order to speed up the download and decompression
- wget --no-verbose https://www.python.org/ftp/python/3.6.1/Python-3.6.1.tgz
- tar -xzf Python-3.6.1.tgz
- cd Python-3.6.1
- ./configure -q --enable-loadable-sqlite-extensions
- make --silent -j2
- make altinstall --silent
- cd $HOME_DIR
- rm Python-3.6.1.tgz
- rm -rf Python-3.6.1/
- ln -s /usr/local/bin/python3.6 /usr/bin/python3
- python3 -m pip install virtualenv
- pip3 install -U nltk
pre_build:
commands:
- cd $HOME_DIR
# Start a virtualenv and activate
- virtualenv -p /usr/bin/python3 $VIRTUAL_ENV_DIR_NAME
- source $VIRTUAL_ENV_DIR_NAME/bin/activate
- $VIRTUAL_ENV_DIR_NAME/bin/pip3.6 install nltk
# If you plan to use any separate resources on Codecommit, you need to configure git
- git config --global credential.helper '!aws codecommit credential-helper $@'
- git config --global credential.UseHttpPath true
# git clone whatever you need
build:
commands:
- cd $HOME_DIR
- mv $VIRTUAL_ENV/lib/python3.6/site-packages/* .
- aws cloudformation package --template template.yml --s3-bucket $S3_BUCKET --output-template template-export.json
artifacts:
type: zip
files:
- template-export.json
答案 0 :(得分:6)
这就是我的buildspec.yml的样子。请注意,python3.6版本是在pre_build阶段输出的。
version: 0.2
phases:
install:
commands:
- yum -y groupinstall development
- yum -y install zlib-devel
- wget https://www.python.org/ftp/python/3.6.0/Python-3.6.0.tar.xz
- tar xJf Python-3.6.0.tar.xz
- cd Python-3.6.0
- ./configure
- make
- make install
pre_build:
commands:
- python3 -V
...
另一种方法是,将Python3.6泊坞窗映像上传到ECR。您可以设置选项以使用此ECR图像来运行构建。
答案 1 :(得分:2)
这也是将CodeBuild指向dockerhub上的图像的选项。来自docs:
要使用其他Docker镜像,请选择“指定Docker镜像”。对于自定义图像类型,请选择其他或Amazon ECR。如果选择“其他”,则对于“自定义图像ID”,在“Docker Hub”中键入Docker镜像的名称和标记
我已将我的CodeBuild项目设置为使用python:3.6-alpine并且一切正常..