使用 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 基础设施

如何在部署期间使用非 AWS 资源扩展 AWS CDK

使用 AWS CodeBuild 和 EB CLI 部署到 AWS Elastic Beanstalk

在aws中部署node js的方法都有哪些?

使用 AWS Elastic Beanstalk 在 AWS 上部署 Spring Boot 应用程序