使用 AWS Elasticstalk 部署 Django 应用程序
Posted
技术标签:
【中文标题】使用 AWS Elasticstalk 部署 Django 应用程序【英文标题】:Deploy Django App using AWS Elasticstalk 【发布时间】:2016-04-20 22:21:50 【问题描述】:我正在尝试使用 Elastic Beanstalks 在 AWS 上部署我的 Django 项目。我正在关注此链接进行部署:http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/create-deploy-python-django.html。
文件夹结构:
Project
├── logs.txt
├── requirements.txt
└── project
├── db.sqlite3
├── manage.py
├── miscellaneousConfig
├── README.md
├── static
│ ├── css
│ ├── img
│ ├── js
├── abc1
│ ├── admin.py
│ ├── __init__.py
│ ├── migrations
│ │ └── __init__.py
│ ├── models.py
│ ├── templates
│ │ ├── file1.html
│ │ └── file2.html
│ ├── tests.py
│ ├── urls.py
│ └── views.py
└── abc
├── functions.py
├── __init__.py
├── settings.py
├── urls.py
├── views.py
└── wsgi.py
文件:.ebextensions/01-project.config[更新]:
option_settings:
"aws:elasticbeanstalk:application:environment":
DJANGO_SETTINGS_MODULE: "abc.settings"
PYTHONPATH: "./project:$PYTHONPATH"
"aws:elasticbeanstalk:container:python":
WSGIPath: "project/abc/wsgi.py"
文件:.elasticbeanstalk/config.yml
branch-defaults:
default:
environment: project-dev
group_suffix: null
global:
application_name: project
default_ec2_keyname: project_ec2_key
default_platform: Python 3.4
default_region: us-east-1
profile: eb-cli
sc: null
文件wsgi.py:
import os
from django.core.wsgi import get_wsgi_application
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "abc.settings")
application = get_wsgi_application()
命令:
1) 'eb 创建'
INFO:成功启动环境:
2) 电子打开
内部服务器错误(在浏览器上)
日志:(通过运行:eb logs > logs.txt)
-------------------------------------
/var/log/httpd/error_log
-------------------------------------
[remote xx.xx.xx.xx:0] ImportError: No module named 'abc'
[remote xx.xx.xx.xx:0] mod_wsgi (pid=2857): Target WSGI script '/opt/python/current/app/project/abc/wsgi.py' cannot be loaded as Python module.
[remote xx.xx.xx.xx:0] mod_wsgi (pid=2857): Exception occurred processing WSGI script '/opt/python/current/app/project/abc/wsgi.py'.
[remote xx.x.xx.xx:0] Traceback (most recent call last):
[remote xx.xx.xx.xx:0] File "/opt/python/current/app/project/abc/wsgi.py", line 16, in <module>
[remote xx.xx.xx.xx:0] application = get_wsgi_application()
[remote xx.xx.xx.xx:0] File "/opt/python/run/venv/lib/python3.4/site-packages/django/core/wsgi.py", line 13, in get_wsgi_application
[remote xx.xx.xx.xx:0] django.setup()
[remote xx.xx.xx.xx:0] File "/opt/python/run/venv/lib/python3.4/site-packages/django/__init__.py", line 17, in setup
[remote xx.xx.xx.xx:0] configure_logging(settings.LOGGING_CONFIG, settings.LOGGING)
[remote xx.xx.xx.xx:0] File "/opt/python/run/venv/lib/python3.4/site-packages/django/conf/__init__.py", line 55, in __getattr__
[remote xx.xx.xx.xx:0] self._setup(name)
[remote xx.xx.xx.xx:0] File "/opt/python/run/venv/lib/python3.4/site-packages/django/conf/__init__.py", line 43, in _setup
[remote xx.xx.xx.xx:0] self._wrapped = Settings(settings_module)
有人可以建议如何解决这个问题吗?
谢谢,
【问题讨论】:
@Baterson 请提供您的意见。自 3 天以来一直坚持这一点。 你的reqiurements.txt
是什么样的?
【参考方案1】:
你试过这个吗
import os, sys
sys.path.append('path/to/abc')
from django.core.wsgi import get_wsgi_application
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "abc.settings")
application = get_wsgi_application()
更改 ebextensions/01-project.config:
option_settings:
"aws:elasticbeanstalk:application:environment":
DJANGO_SETTINGS_MODULE: "abc.settings"
PYTHONPATH: "./project:$PYTHONPATH"
"aws:elasticbeanstalk:container:python":
WSGIPath: "project/abc/wsgi.py"
我认为最好将完整路径提供为“PYTHONPATH”
【讨论】:
在文件中添加了以下行: sys.path.append(os.path.dirname(os.path.abspath(file)) + '/..' ) sys.path.append(os.path.dirname(os.path.abspath(file)) + '/../project') 输出仍然没有变化。是否需要“eb 部署”以使更改得到反映?如果是,那么我收到以下错误: ImportError: 没有名为“abc”的模块。 .ebextensions/01-project.config 中的 container_command 01_migrate 失败。有关更多详细信息,请使用控制台或 EB CLI 检查 /var/log/eb-activity.log。 你能告诉我如何给出 PYTHONPATH 变量的完整路径吗? (目前,代码位于我的本地路径中)cd
进入项目文件夹并运行pwd
,你会得到路径【参考方案2】:
刚刚改过
PYTHONPATH: "./project/abc:$PYTHONPATH"
到
PYTHONPATH: "./project:$PYTHONPATH"
在 .ebextensions/01-project.config 文件中,它起作用了。 :)
【讨论】:
【参考方案3】:确保 INSTALLED_APPS = "abc"
存在于您的 settings.py 文件中
【讨论】:
INSTALLED_APPS = ('django.contrib.staticfiles', 'project', ) 你的文件夹结构是什么? abc 在哪里? 在问题中添加了文件夹结构。 尝试将 abc 添加到 INSTALLED APPS 列表中 在 ebextensions->config 文件中将 .project/abc 更改为 ./project 并且它起作用了。谢谢。以上是关于使用 AWS Elasticstalk 部署 Django 应用程序的主要内容,如果未能解决你的问题,请参考以下文章
如何在不使用 SAM 的情况下使用 AWS 代码部署来部署简单的 AWS lambda 函数?
如何使用 AWS Lambda 脚本通过 Terraform 部署 AWS 基础设施