Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Elastic beanstalk require python 3.5

I recently created a new python program using the latest stable release of python (3.5). Unfortunately, AWS EB does not provide a 3.5 base image. I have been trying to configure .ebextensions to get the image to upgrade the python distro as it's first action. I have not had success. I have tried the following:

Packages

packages:
    yum:
        postgresql93-devel: []
        python35: []

Commands

container_commands:
      01_install_packages:
        command: 'yum install -y python35 python35-pip' 

In the case of container_commands, the log did show python 35 successfully installing. However, our code (in a follow-up command) then failed in a way that is only possible if python version 3.4 or lower is sourced. I am assuming that although 3.5 installed the environment did not switch to it as the source and continued to use the 3.4 distro.

We cannot manually modify the environment, because we need our configuration to be ready for auto-scaling. Thus, the solution must come from some configuration in .ebextensions. Any help here would be very appreciated.

UPDATE

I received an email from AWS support informing me that, because the operating system and application python environments are tightly coupled (ie the same), it is not possible to change the default python version for the application to python 3.5. They recommended I create a docker image. I've started looking into how to do that. If I come up with a solution I will post here.

like image 410
melchoir55 Avatar asked Jan 23 '17 20:01

melchoir55


2 Answers

The way I ended up solving this was to create a python based docker container, and switch to using the elastic beanstalk docker configuration. I'm including the script below to help folks out. Note that it doesn't contain uwsgi or supervisor, as it's just a first pass. You might want to add those depending on your situation.

Dockerfile

FROM python:3.5

ADD . /src

RUN apt-get update
RUN apt-get install -y postgresql postgresql-contrib libpq-dev python3-dev
RUN pip3 install -r /src/requirements.txt
EXPOSE  8080
RUN python3 --version
CMD ["python3", "/src/application.py", "-p 8080"]
like image 107
melchoir55 Avatar answered Oct 13 '22 08:10

melchoir55


This solution works on 06.06.2017 with AMI image: ami-1871797e

In your project simply create file .ebextensions/00_python_version.config with contents:

packages:
  yum:
    postgresql94-devel: []
    postgresql95-devel: []
    libffi-devel: []
    python35: []
    python35-devel: []
    python35-libs: []
    mod24_wsgi-python35: []

files:
  "/temp/change_python.sh":
    mode: "000644"
    owner: root
    group: root
    content: |
      rm -rf /opt/python/run/venv
      virtualenv -p /usr/bin/python35 /opt/python/run/venv
      rm -rf /opt/python/run/baselinenv
      ln -sf /opt/python/run/venv /opt/python/run/baselinenv

files:
  "/temp/change_python_2.sh":
    mode: "000644"
    owner: root
    group: root
    content: |
      ln -sf /opt/python/run/venv/lib64/python3.5 /opt/python/run/venv/lib64/python3.4
      ln -sf /opt/python/run/venv/lib/python3.5 /opt/python/run/venv/lib/python3.4

commands:
  00_aws_change_python:
    command: "sh /temp/change_python.sh"

container_commands:
  00_aws_change_python_2:
    command: "sh /temp/change_python_2.sh"
like image 45
WBAR Avatar answered Oct 13 '22 10:10

WBAR