向 Elastic Beanstalk 部署 Django 应用程序 - AWS Elastic Beanstalk

向 Elastic Beanstalk 部署 Django 应用程序

本教程演练如何将默认的自动生成的 Django 网站部署到运行 Python 的 AWS Elastic Beanstalk 环境。本教程向您展示如何通过使用 Elastic Beanstalk 环境在云中托管 Python Web 应用程序。

在本教程中,您将执行以下操作:

先决条件

要使用任意 AWS 服务 (AWS),包括 Elastic Beanstalk,您需要具有 AWS 账户和凭证。要了解更多信息并注册,请访问 https://aws.amazon.com/

要完成此教程,您应当安装所有面向 Python 的常见先决条件软件,包括以下程序包:

  • Python 3.6

  • pip

  • virtualenv

  • awsebcli

Django 框架将作为此教程的一部分安装。

注意

使用 EB CLI 创建环境需要服务角色。您可以通过在 Elastic Beanstalk 控制台中创建环境来创建服务角色。如果您没有服务角色,EB CLI 会尝试在您运行 eb create 时创建一个。

设置 Python 虚拟环境和安装 Django

使用 virtualenv 创建虚拟环境,并用它来安装 Django 及其依赖项。通过使用虚拟环境,您可以确切地了解哪些程序包是您的应用程序所必需的,以便在运行应用程序的 Amazon EC2 实例上安装所需的数据包。

以下步骤演示必须为基于 Unix 的系统和 Windows 输入的命令,这些命令显示在单独的选项卡上。

设置虚拟环境

  1. 创建名为 eb-virt 的虚拟环境。

    Unix-based systems
    ~$ virtualenv ~/eb-virt
    Windows
    C:\> virtualenv %HOMEPATH%\eb-virt
  2. 激活虚拟环境。

    Unix-based systems
    ~$ source ~/eb-virt/bin/activate (eb-virt) ~$
    Windows
    C:\>%HOMEPATH%\eb-virt\Scripts\activate (eb-virt) C:\>

    您将看到您的命令提示符前面带有 (eb-virt),表明您在虚拟环境中。

    注意

    这些指令的剩余部分在您的主目录 ~$ 中显示 Linux 命令提示符。在 Windows 上,这是 C:\Users\USERNAME>,其中 USERNAME 是 Windows 登录名称。

  3. 使用 pip 安装 Django。

    (eb-virt)~$ pip install django==2.1.1
    注意

    您安装的 Django 版本必须与您在 Elastic Beanstalk Python 配置中选择用于部署应用程序的 Elastic Beanstalk Python 版本兼容。有关部署的更多信息,请参阅本主题中的 使用 EB CLI 部署站点

    有关当前 Python 平台版本的详细信息,请参阅 AWS Elastic Beanstalk 平台文档中的 Python

    有关 Django 与 Python 的版本兼容性问题,请参阅我可以将哪个 Python 版本与 Django 一起使用? Django 2.2 与 Elastic Beanstalk Python 3.6 平台不兼容。最新的兼容版本是 Django 2.1。

  4. 要验证已安装 Django,请输入以下命令。

    (eb-virt)~$ pip freeze Django==2.1.1 ...

    此命令列出虚拟环境中已安装的所有程序包。稍后,您使用此命令的输出来配置项目,以便配合 Elastic Beanstalk 使用。

创建 Django 项目

现在您已准备好使用虚拟环境来创建 Django 项目并在计算机上运行。

注意

本教程使用 SQLite,这是包含在 Python 中的一个数据库引擎。使用您的项目文件部署数据库。对于生产环境,我们建议您使用 Amazon Relational Database Service (Amazon RDS),并且将它与您的环境分开。有关更多信息,请参阅 向 Python 应用程序环境中添加 Amazon RDS 数据库实例

生成 Django 应用程序

  1. 激活虚拟环境。

    Unix-based systems
    ~$ source ~/eb-virt/bin/activate (eb-virt) ~$
    Windows
    C:\>%HOMEPATH%\eb-virt\Scripts\activate (eb-virt) C:\>

    您将看到您的命令提示符带有 (eb-virt) 前缀,表明您在虚拟环境中。

    注意

    这些指令的剩余部分显示在您的主目录和 Linux 主目录 ~/ 中的 Linux 命令提示符 ~$。在 Windows 上,这是 C:\Users\USERNAME>,其中 USERNAME 是您的 Windows 登录名称。

  2. 使用 django-admin startproject 命令创建名为 ebdjango 的 Django 项目。

    (eb-virt)~$ django-admin startproject ebdjango

    该命令创建名为 ebdjango 的标准 Django 站点,包含以下目录结构。

    ~/ebdjango |-- ebdjango | |-- __init__.py | |-- settings.py | |-- urls.py | `-- wsgi.py `-- manage.py
  3. 使用 manage.py runserver 在本地运行 Django 站点。

    (eb-virt) ~$ cd ebdjango
    (eb-virt) ~/ebdjango$ python manage.py runserver
  4. 在 Web 浏览器中,打开 http://127.0.0.1:8000/ 以查看站点。

    
            在本地运行的 Django 应用程序的欢迎页面
  5. 检查服务器日志,查看请求的输出。要停止 Web 服务器并返回到虚拟环境,请按 Ctrl+C

    Django version 2.1.1, using settings 'ebdjango.settings' Starting development server at http://127.0.0.1:8000/ Quit the server with CONTROL-C. [07/Sep/2018 20:14:09] "GET / HTTP/1.1" 200 16348 Ctrl+C

为 Elastic Beanstalk 配置 Django 应用程序

本地计算机已有一个 Django 支持的网站,因此,您可将其配置为配合 Elastic Beanstalk 部署。

默认情况下,Elastic Beanstalk 会查找名为 application.py 的文件来启动应用程序。由于这不在您创建的 Django 项目中,因此您必须对您应用程序的环境做出一些调整。您还必须设置环境变量,以便可以加载您的应用程序的模块。

为 Elastic Beanstalk 配置站点

  1. 激活虚拟环境。

    Unix-based systems
    ~/ebdjango$ source ~/eb-virt/bin/activate
    Windows
    C:\Users\USERNAME\ebdjango>%HOMEPATH%\eb-virt\Scripts\activate
  2. 运行 pip freeze,然后将输出保存到名为 requirements.txt 的文件。

    (eb-virt) ~/ebdjango$ pip freeze > requirements.txt

    Elastic Beanstalk 使用 requirements.txt 来判断哪些程序包应安装在运行应用程序的 EC2 实例上。

  3. 创建名为 .ebextensions 的目录。

    (eb-virt) ~/ebdjango$ mkdir .ebextensions
  4. .ebextensions 目录中,添加名为 django.config配置文件,包含以下文本:

    例 ~/ebdjango/.ebextensions/django.config

    option_settings: aws:elasticbeanstalk:container:python: WSGIPath: ebdjango.wsgi:application

    设置 WSGIPath 指定 Elastic Beanstalk 用于启动应用程序的 WSGI 脚本位置。

    注意

    如果您使用的是 Amazon Linux AMI Python 平台版本(先前的 Amazon Linux 2),请将 WSGIPath 的值替换为 ebdjango/wsgi.py。示例中的值适用于 Gunicorn WSGI 服务器,该服务器在 Amazon Linux AMI 平台版本上不受支持。

  5. 使用 deactivate 命令停用虚拟环境。

    (eb-virt) ~/ebdjango$ deactivate

    每当您需要为应用程序添加程序包或本地运行应用程序时,重新激活虚拟环境。

使用 EB CLI 部署站点

您已添加在 Elastic Beanstalk 上部署应用程序所需的全部内容。您的项目目录现在应该如下所示。

~/ebdjango/ |-- .ebextensions | `-- django.config |-- ebdjango | |-- __init__.py | |-- settings.py | |-- urls.py | `-- wsgi.py |-- db.sqlite3 |-- manage.py `-- requirements.txt

下一步,您将创建应用程序环境并使用 Elastic Beanstalk 部署已配置的应用程序。

完成部署后,您应立即编辑 Django 的配置以将 Elastic Beanstalk 分配给您的应用程序的域名添加到 Django 的 ALLOWED_HOSTS。然后,您将重新部署您的应用程序。这是一个 Django 安全要求,旨在防止 HTTP Host 标头攻击。有关更多信息,请参阅主机标头验证

创建环境并部署 Django 应用程序

注意

本教程将 EB CLI 作为部署机制,但您也可以使用 Elastic Beanstalk 控制台部署包含项目内容的 .zip 文件。

  1. 使用 eb init 命令,初始化 EB CLI 存储库。

    ~/ebdjango$ eb init -p python-3.6 django-tutorial Application django-tutorial has been created.

    此命令会创建一个名为 django-tutorial 的应用程序。它还配置本地存储库,以最新的 Python 3.6 平台版本创建环境。

  2. (可选)再次运行 eb init 以配置默认密钥对,以便使用 SSH 连接到运行您的应用程序的 EC2 实例。

    ~/ebdjango$ eb init Do you want to set up SSH for your instances? (y/n): y Select a keypair. 1) my-keypair 2) [ Create new KeyPair ]

    如果您已有密钥对,请选择一个,或按提示创建一个。如果您没有看到提示或需要以后更改设置,请运行 eb init -i

  3. 创建环境并使用 eb create 将应用程序部署到此环境中。

    ~/ebdjango$ eb create django-env
    注意

    如果您看到“service role required”错误消息,请以交互方式运行 eb create (不指定环境名称),EB CLI 会为您创建角色。

    此命令创建名为 django-env 的负载均衡的 Elastic Beanstalk 环境。创建一个环境需要大约 5 分钟。Elastic Beanstalk 创建运行应用程序必需的资源时,将输出信息性消息,并由 EB CLI 转发至终端。

  4. 当环境创建过程完成时,通过运行 eb status 找到您的新环境的域名。

    ~/ebdjango$ eb status Environment details for: django-env Application name: django-tutorial ... CNAME: eb-django-app-dev.elasticbeanstalk.com ...

    您的环境的域名是 CNAME 属性的值。

  5. 打开 settings.py 目录中的 ebdjango 文件。找到 ALLOWED_HOSTS 设置,然后将您在上一步中找到的应用程序域名添加到该设置的值。如果您在该文件中找不到此设置,请将此设置添加到一个新行。

    ... ALLOWED_HOSTS = ['eb-django-app-dev.elasticbeanstalk.com']
  6. 部署该文件,然后通过运行 eb deploy 部署您的应用程序。运行 eb deploy 时,EB CLI 会捆绑项目目录中的内容并将其部署到环境中。

    ~/ebdjango$ eb deploy
    注意

    如果您将 Git 用于您的项目,请参阅将 EB CLI 与 Git 配合使用

  7. 当环境更新过程完成时,请使用 eb open 打开网站。

    ~/ebdjango$ eb open

    这将使用为应用程序创建的域名打开一个浏览器窗口。您应该看到在本地创建和测试的相同 Django 网站。

    
            使用 Elastic Beanstalk 部署的 Django 网站的欢迎页面

如果您没有看到应用程序运行,或者出现错误消息,请查看排查部署问题以获取有关如何确定错误原因的帮助。

如果您确实 看到应用程序在运行,那么恭喜,您已使用 Elastic Beanstalk 部署了第一个 Django 应用程序!

更新应用程序

现在,您已在 Elastic Beanstalk 上运行应用程序,接下来可以更新和重新部署应用程序或其配置,并且 Elastic Beanstalk 会处理更新实例和启动新的应用程序版本的工作。

在本示例中,我们将启用 Django 管理控制台并配置一些其他设置。

修改您的站点设置

默认情况下, Django 网站使用 UTC 时区显示时间。您可以通过在 settings.py 中指定时区来加以更改。

更改您的站点的时区

  1. settings.py 中修改 TIME_ZONE 设置。

    例 ~/ebdjango/ebdjango/settings.py

    ... # Internationalization LANGUAGE_CODE = 'en-us' TIME_ZONE = 'US/Pacific' USE_I18N = True USE_L10N = True USE_TZ = True

    如需获取时区列表,请访问此页面

  2. 将应用程序部署到 Elastic Beanstalk 环境。

    ~/ebdjango/$ eb deploy

创建站点管理员

您可以为 Django 应用程序创建站点管理员,以便从站点直接访问管理员控制台。管理员登录详细信息安全地存储在包含在 Django 生成的默认项目中包含的本地数据库镜像中。

创建站点管理员

  1. 初始化 Django 应用程序的本地数据库。

    (eb-virt) ~/ebdjango$ python manage.py migrate Operations to perform: Apply all migrations: admin, auth, contenttypes, sessions Running migrations: Applying contenttypes.0001_initial... OK Applying auth.0001_initial... OK Applying admin.0001_initial... OK Applying admin.0002_logentry_remove_auto_add... OK Applying admin.0003_logentry_add_action_flag_choices... OK Applying contenttypes.0002_remove_content_type_name... OK Applying auth.0002_alter_permission_name_max_length... OK Applying auth.0003_alter_user_email_max_length... OK Applying auth.0004_alter_user_username_opts... OK Applying auth.0005_alter_user_last_login_null... OK Applying auth.0006_require_contenttypes_0002... OK Applying auth.0007_alter_validators_add_error_messages... OK Applying auth.0008_alter_user_username_max_length... OK Applying auth.0009_alter_user_last_name_max_length... OK Applying sessions.0001_initial... OK
  2. 运行 manage.py createsuperuser 以创建管理员。

    (eb-virt) ~/ebdjango$ python manage.py createsuperuser Username: admin Email address: me@mydomain.com Password: ******** Password (again): ******** Superuser created successfully.
  3. 要告诉 Django 在哪里存储静态文件,请在 settings.py 中定义 STATIC_ROOT

    例 ~/ebdjango/ebdjango/settings.py

    # Static files (CSS, JavaScript, Images) # https://docs.djangoproject.com/en/2.1/howto/static-files/ STATIC_URL = '/static/' STATIC_ROOT = 'static'
  4. 运行 manage.py collectstatic 用管理员站点的静态资产(javascript、CSS 和图像)填充 static 目录。

    (eb-virt) ~/ebdjango$ python manage.py collectstatic 119 static files copied to ~/ebdjango/static
  5. 部署您的应用程序。

    ~/ebdjango$ eb deploy
  6. 在您的浏览器中打开站点,并且将 /admin/ 附加到站点 URL,以此查看管理控制台,如下所示。

    http://djang-env.p33kq46sfh.us-west-2.elasticbeanstalk.com/admin/
    
              输入您在步骤 2 中创建的用户名和密码来登录管理控制台。
  7. 使用您在步骤 2 中配置的用户名和密码登录。

    
              使用 Elastic Beanstalk 部署的 Django 网站的 Django 管理控制台

您可以使用与本地更新/测试类似的过程,然后运行 eb deploy。Elastic Beanstalk 会处理更新实时服务器的工作,因此,您可以重点关注应用程序开发而不是服务器管理!

添加数据库迁移配置文件

您可以将命令添加到 .ebextensions 脚本,该脚本会在您的站点发生更新时运行。这样,您可以自动实现数据库迁移。

在部署应用程序时添加迁移步骤

  1. 利用以下内容创建名为 db-migrate.config配置文件

    例 ~/ebdjango/.ebextensions/db-migrate.config

    container_commands: 01_migrate: command: "django-admin.py migrate" leader_only: true option_settings: aws:elasticbeanstalk:application:environment: DJANGO_SETTINGS_MODULE: ebdjango.settings

    此配置文件在启动应用程序之前在部署流程中运行 django-admin.py migrate 命令。由于它在应用程序启动之前运行,因此您还必须明确配置 DJANGO_SETTINGS_MODULE 环境变量(通常在启动时由 wsgi.py 负责此项工作)。在命令中指定 leader_only: true 可确保当您重新部署到多个实例时,该命令仅运行一次。

  2. 部署您的应用程序。

    ~/ebdjango$ eb deploy

清除

要开发会话之间保存实例小时和其他 AWS 资源,请使用 eb terminate 终止 Elastic Beanstalk 环境。

~/ebdjango$ eb terminate django-env

此命令终止环境及其内部运行的所有 AWS 资源。但它不删除应用程序,因此,您始终可以再次运行 eb create,创建具有相同配置的更多环境。有关 EB CLI 命令的更多信息,请参阅使用 EB CLI 管理 Elastic Beanstalk 环境

如果您不再使用示例应用程序,也可移除项目文件夹和虚拟环境。

~$ rm -rf ~/eb-virt ~$ rm -rf ~/ebdjango

后续步骤

有关 Django 的更多信息,包括详细教程,请访问官方文档

如果您希望尝试其他 Python Web 框架,请浏览向 Elastic Beanstalk 部署 Flask 应用程序