AWS Elastic Beanstalk
开发人员指南
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

向 Elastic Beanstalk 部署 Django 应用程序

本教程演练了如何将默认的自动生成的 Django 网站部署到运行 Python 3.6 的 Elastic Beanstalk 环境。本教程使用 EB CLI 作为部署机制,但您也可以使用 AWS 管理控制台部署包含项目内容的 ZIP 文件。EB CLI 是在以用于 AWS 的 Python SDK (boto) 的 Python 编写的一个交互命令行接口。

注意

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

先决条件

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

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

  • Python 3.6

  • pip

  • virtualenv

  • awsebcli

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

注意

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

通过 Django 设置 Python 虚拟环境

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

设置虚拟环境

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

    在基于 Unix 的系统上,例如或 Linux 或 OS X,输入以下命令:

    ~$ virtualenv ~/eb-virt

    在 Windows 操作系统上,输入以下命令:

    C:\> virtualenv %HOMEPATH%\eb-virt
  2. 激活虚拟环境。

    在基于 Unix 的系统上,输入以下命令:

    ~$ 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 配置中选择用于部署应用程序的 Python 版本兼容。有关部署的详细信息,请参阅本主题中的使用 EB CLI 部署站点

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

    有关 Django 与 Python 的版本兼容性问题,请参阅我可以将哪个 Python 版本与 Django 一起使用?

  4. 要验证已安装 Django,请键入:

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

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

创建 Django 项目

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

生成 Django 应用程序

  1. 激活虚拟环境。

    在基于 Unix 的系统上,输入以下命令:

    ~$ 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. 检查服务器日志,查看请求的输出。您可键入 Ctrl+C,停止 Web 服务器并返回到虚拟环境:

    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. 激活虚拟环境。

    在基于 Linux 的系统上,输入以下命令:

    ~/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.py

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

  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 主机标头攻击。有关详细信息,请参阅主机标头验证

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

  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. TIME_ZONE 中修改 settings.py 设置

    例 ~/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 在哪里存储静态文件,请在 STATIC_ROOT 中定义 settings.py

    例 ~/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 的更多信息,包括详细教程,请访问 AWS 文档

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