8

我有一个 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
4

3 回答 3

9

这就是我的 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 docker 镜像到 ECR。您可以设置选项以使用此 ECR 映像来运行您的构建。

于 2017-05-26T21:40:11.447 回答
5

现在有来自 AWS的 Python3.6 的官方 Docker 映像。您可以将aws/codebuild/python:3.6.5其用作您的 CodeBuild 映像。

于 2018-05-11T14:43:38.050 回答
2

将 CodeBuild 指向 dockerhub 上的图像也是一个选项。从文档

要使用另一个 Docker 映像,请选择指定 Docker 映像。对于自定义图像类型,选择其他或 Amazon ECR。如果您选择其他,则对于自定义映像 ID,在 Docker Hub 中键入 Docker 映像的名称和标签

我已将我的 CodeBuild 项目设置为使用python:3.6-alpine并且一切正常..

于 2018-02-22T17:52:19.180 回答