我有一个 Python 3 项目,我试图通过 AWS Codestar -> Codepipeline -> Codebuild -> Cloudformation 将其部署到 AWS Lambda。
我的项目(实际上只包含一个简单的 API Gateway 处理程序方法)导入了一个 Python 3(需要 3 个)项目(报纸)。我在家用计算机上使用 Virtualenv 15.1.0,如果我用 Python 3.5 安装 Newspaper,然后上传到 Lambda(Python 3.6 运行时),它会引发与 PIL / Pillow 相关的错误。
首先它说它找不到_image,这似乎可以通过删除站点包中的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。回顾构建日志时,似乎也没有安装其他“位”。
所以,我的问题是:
- 如何将 Python 3.6 放入从 Codestar 项目提供的 Codebuild 环境中?
- 我应该继续尝试从源代码构建它还是切换到 Ubuntu 环境?
- 如何在我的代码/项目中自动配置图像/环境?
编辑 1对于其他人,我用于安装和使用 Python3.6 的完整 buildspec.yml 如下。请注意,它使一切尽可能安静,以减少日志消息、降低 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