I've been trying for several days now to set up Django under Amazon Web Services' Elastic Beanstalk. I think the problem I'm hitting is this one:
ERROR - Your WSGIPath refers to a file that does not exist.
I followed the tutorial here and all goes well until the end of Step 6, but I can't for the life of me get anything to display other than the generic Elastic Beanstalk page from Step 5, #2. When I run
./manage.py runserver
on my local machine, everything works as it should, but I can't get that page to deploy. I first tried with a small Django site I wrote myself. It didn't work, so I deleted everything I'd done and tried again, that didn't work, so I deleted all that and tried again with a fresh django install. I tried that a bunch of times fiddling with little things, but I think I'm missing something major.
I added a python.config file as described in this tutorial.
Here's my file structure:
-.git/
-.mysite/
-myapp/
-__init__.py
-models.py
-tests.py
-views.py
-mysite/
-__init__.py
-settings.py
-urls.py
-wsgi.py
-.ebextensions/
-python.config
-manage.py
-mysite.db
-requirements.txt
From my settings.py:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': 'mysite.db',
'USER': '',
'PASSWORD': '',
'HOST': '',
'PORT': '',
}
}
Here's python.config:
container_commands: 01_syncdb:
command: "django-admin.py syncdb --noinput"
leader_only: true
option_settings:
- namespace: aws:elasticbeanstalk:container:python
option_name: WSGIPath
value: mysite/wsgi.py
- option_name: DJANGO_SETTINGS_MODULE
value: mysite.settings
- option_name: AWS_SECRET_KEY
value: <This is my secret key>
- option_name: AWS_ACCESS_KEY_ID
value: <This is my access key>
Is there another place I need to define my WSGIPath? Is there a way to do it through the AWS console? Should I just skip EB altogether and use EC2 directly?
From https://forums.aws.amazon.com/thread.jspa?messageID=396656񠵰
The ".ebextensions" directory must be in the root level directory of your application, but from the log output, the directory is instead in the "mysite/.ebextensions" directory. So for example, after following the django tutorial in the docs when you run "git aws.push" your root directory would look like this:
.
├── .ebextensions
│ └── python.config
├── .elasticbeanstalk
│ ├── config
├── .git
├── .gitignore
├── manage.py
├── mysite
│ ├── __init__.py
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
└── requirements.txt
Instead of this:
.
└── mysite
├── .ebextensions
├── .elasticbeanstalk
├── .git
├── .gitignore
├── manage.py
├── mysite
└── requirements.txt
Find .elasticbeanstalk/optionsettings.your-app-name
in your app's root directory. Search for WSGIPath
and make sure it's the path you intend. It looks like it defaults to application.py
.
I had the same problem ("Your WSGIPath refers to a file that does not exist"), and finally found a solution:
- The problem: I was downloading the bundle of the project directly from GitHub ("Download Zip"), which maybe had an improper structure.
- The solution: I properly zip the files, without the main folder, using the Compress command. (cf http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/using-features.deployment.source.html).
Note: At first, I was searching in the wrong direction, because EB was also showing this message: Error occurred during build: Command 01_migrate failed.. So I though the files, including the *.config, were correctly located.
Ok, here's what worked for me after trying a million things. You have to run eb update
in order to update the environment.
So make sure .elasticbeanstalk/optionsettings.whatever-env
has WSGIPath set to what you want it, and make sure .ebextensions/whatever.config
has this:
option_settings:
- namespace: aws:elasticbeanstalk:container:python
option_name: WSGIPath
value: whatever/wsgi.py
Then run eb update
and it should work. Remember you have to set the alias to make sure your eb
command actually works. For example:
alias eb="python2.7 ../AWS-ElasticBeanstalk-CLI-2.6.3/eb/linux/python2.7/eb"
I had the same issue after following AWS's docs to the dot. What I did to avoid it was initialize an application through the EB CLI step by step, without using the command the AWS docs instructed (~/ebdjango$ eb init -p python2.7 django-tutorial), and creating an environment step by step as well. The steps I took in the EB CLI are the following:
- Initialize Application
eb init
- Select a default region
- Enter Application Name (used default by pressing enter)
- Confirmed that I am using Python
- Selected Python version compatible with my local environment
- Set up SSH
- Create Environment
eb create
- Enter Environment Name (used default by pressing enter)
- Enter DNS CNAME prefix (used default by pressing enter)
- Select a load balancer type (I selected classic by entering 1)
After Environment is created I use eb config
to open EB's config file to confirm that the path to my WSGI is what it should be:
aws:elasticbeanstalk:container:python:
NumProcesses: '1'
NumThreads: '15'
StaticFiles: /static/=static/
WSGIPath: path/to/wsgi.py
If any changes are made, make sure you save the file and confirm that everything is squared up by entering eb open
in your terminal to open a browser window using the domain name specified in previous steps.
Here is what worked for me I created the Eb using EBCLI and all the files are generated.
I tried adding WSGIPath to config.yml that it generated but It never got reflected while deploying. Solution:
open eb config
For me it showed WSGIPath: application.py
I think this is a default config for Flask. Now Change it to
WSGIPath: my_app/wsgi.py
save and deploy.