首页 文章

AWS CodeBuild中的Python 3.6不可用,AWS Lambda中的Python 3.5不可用

提问于
浏览
3

我有一个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中做到这一点,我觉得这可能带来我在一个兔子洞里,这很难自动化 . 有没有办法将该配置作为我项目中的代码?

EDIT 尝试从源代码构建和安装Python 3.6,但是当尝试安装Pip时,我收到错误,说没有安装SSL . 回顾构建日志时,似乎还没有安装其他"bits" .

所以,我的问题是:

  • 如何将Python 3.6引入Codestar项目中配置的Codebuild环境?

  • 我应该继续尝试从源代码构建它还是切换到Ubuntu环境?

  • 如何在代码/项目中自动配置图像/环境?

EDIT 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

3 回答

  • 1

    这就是我的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映像来运行构建 .

  • 1

    这也是将CodeBuild指向dockerhub上的图像的选项 . 来自docs

    要使用其他Docker镜像,请选择“指定Docker镜像” . 对于自定义图像类型,请选择其他或Amazon ECR . 如果选择“其他”,则对于“自定义图像ID”,在Docker Hub中键入Docker镜像的名称和标记

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

  • 5

    现在有来自AWS的official Docker image for Python3.6 . 您可以使用 aws/codebuild/python:3.6.5 作为CodeBuild映像 .

相关问题