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

将带有外部 Amazon RDS 数据库的高可用性 Drupal 网站部署到 Elastic Beanstalk

本教程将指导您完成在 AWS Elastic Beanstalk 之外启动 RDS 数据库实例的过程。然后,它介绍了配置运行 Drupal 网站的高可用性环境以连接到该数据库实例。该网站使用 Amazon Elastic File System (Amazon EFS) 作为上传文件的共享存储。在 Elastic Beanstalk 之外运行数据库实例会将数据库从您的环境的生命周期中分离,并且让您可以从多个环境连接到同一数据库、将数据库互相交换或执行蓝/绿部署,而不会影响您的数据库。

先决条件

本教程假设您对基本 Elastic Beanstalk 操作和 Elastic Beanstalk 控制台有一定了解。如果尚不了解,请按照开始使用 Elastic Beanstalk 中的说明启动您的第一个 Elastic Beanstalk 环境。

为了遵循本指南中的步骤,您需要命令行终端或外壳,以便运行命令。命令显示在列表中,以提示符 ($) 和当前目录名称(如果有)开头:

~/eb-project$ this is a command this is output

在 Linux 和 macOS 中,可使用您首选的外壳程序和程序包管理器。在 Windows 10 中,您可以安装 Windows Subsystem for Linux,获取 Ubuntu 和 Bash 与 Windows 集成的版本。

本教程中有关 Amazon Relational Database Service (Amazon RDS) 任务的过程假定您正在默认 Amazon Virtual Private Cloud (Amazon VPC) 中启动资源。所有新账户在每个区域中均包含一个默认 VPC。如果您没有默认 VPC,则这些过程将会发生变化。有关 EC2-Classic 和自定义 VPC 平台的说明,请参阅将 Elastic Beanstalk 用于 Amazon Relational Database Service

此示例应用程序使用 Amazon EFS。它仅适用于支持 Amazon EFS 的 AWS 区域。要了解有关支持的 AWS 区域的信息,请参阅 Amazon Web Services 一般参考 中的 AWS 区域和终端节点

本教程是使用 Drupal 版本 8.5.3 和 PHP 7.0 开发的。

在 Amazon RDS 启动数据库实例

要将外部数据库与在 Elastic Beanstalk 中运行的应用程序结合使用,请首先使用 Amazon RDS 启动数据库实例。当使用 Amazon RDS 启动某个实例时,该实例是完全独立于 Elastic Beanstalk 和您的 Elastic Beanstalk 环境的,而且将不会由 Elastic Beanstalk 终止或监控。

使用 Amazon RDS 控制台可启动多可用区 MySQL 数据库实例。选择多可用区部署可确保您的数据库将进行故障转移并在主数据库实例中断服务时继续可用。

在默认 VPC 中启动 RDS 数据库实例

  1. 打开 RDS 控制台

  2. 在导航窗格中选择 Databases (数据库)。

  3. 选择创建数据库

  4. 选择数据库引擎。选择 Next (下一步)

  5. 选择一个使用案例 (如果系统有提示)。

  6. 指定数据库详细信息下,查看默认设置并根据需要进行调整。请注意以下选项:

    • 数据库实例类 – 选择对于您的工作负载具有适当的内存量和 CPU 能力的实例大小。

    • 多可用区部署 – 为了获得高可用性,请设置为在不同区域创建副本

    • 主用户名主密码 – 数据库用户名和密码。请记下这些设置,因为您以后将使用这些值。

  7. 选择 Next (下一步)

  8. 数据库选项下,对于数据库名称,键入 ebdb。记下数据库端口值以供以后使用。

  9. 验证其余选项的默认设置,然后选择创建数据库

接下来,修改附加到数据库实例的安全组以允许相应的端口上的入站流量。这与您稍后要附加到 Elastic Beanstalk 环境的安全组相同,因此您添加的规则将向同一安全组中的其他资源授予入口流量权限。

修改 RDS 实例的安全组上的入口流量规则

  1. 打开 Amazon RDS 控制台

  2. 选择数据库

  3. 选择您的数据库实例的名称以查看其详细信息。

  4. 连接部分中,记下在该页上显示的子网安全组终端节点,以便您以后使用该信息。

  5. 安全性下面,您可以查看与数据库实例关联的安全组。打开链接以在 Amazon EC2 控制台中查看安全组。

    
        Amazon RDS 控制台中“数据库实例”页面的“连接”部分
  6. 在安全组详细信息中,选择入站选项卡。

  7. 选择 Edit

  8. 选择 Add Rule

  9. 对于类型,请选择应用程序使用的数据库引擎。

  10. 对于,键入 sg- 以查看可用安全组的列表。选择当前安全组以允许安全组中的资源从同一组中的其他资源接收数据库端口上的流量。

    
        在 Amazon EC2 控制台中编辑安全组的入站规则
  11. 选择 Save

创建一个数据库实例大约需要 10 分钟。与此同时,启动您的 Elastic Beanstalk 环境。

启动 Elastic Beanstalk 环境

使用 AWS 管理控制台创建 Elastic Beanstalk 环境。选择 PHP 平台并接受默认设置和示例代码。在启动环境后,可以配置环境以连接到数据库,然后将 Drupal 代码部署到环境。

启动环境 (控制台)

  1. 使用下面的预配置链接打开 Elastic Beanstalk 控制台:console.aws.amazon.com/elasticbeanstalk/home#/newApplication?applicationName=tutorials&environmentType=LoadBalanced

  2. 对于平台,选择与应用程序使用的语言匹配的平台。

  3. 对于应用程序代码,选择示例应用程序

  4. 选择复查并启动

  5. 检查可用选项。对它们感到满意之后,选择创建应用程序

环境创建大约需要 5 分钟,将创建以下资源:

  • EC2 实例 – 配置来在您选择的平台上运行 Web 应用程序的 Amazon Elastic Compute Cloud (Amazon EC2) 虚拟机。

    各平台运行一组特定软件、配置文件和脚本以支持特定的语言版本、框架、Web 容器或其组合。大多数平台使用 Apache 或 nginx 作为 Web 应用程序前的反向代理,向其转发请求、提供静态资产以及生成访问和错误日志。

  • 实例安全组 – 配置来允许通过端口 80 访问的 Amazon EC2 安全组。通过此资源,HTTP 流量可以从负载均衡器到达运行您的 Web 应用程序的 EC2 实例。默认情况下,其他端口不允许流量进入。

  • 负载均衡器 – 配置来向运行您的应用程序的实例分配请求的 Elastic Load Balancing 负载均衡器。负载均衡器还使您无需将实例直接公开在 Internet 上。

  • 安全组 – 配置来允许通过端口 80 访问的 Amazon EC2 安全组。利用此资源,HTTP 流量可从 Internet 到达负载均衡器。默认情况下,其他端口不允许流量进入。

  • Auto Scaling 组 – 配置来在实例终止或不可用时替换实例的 Auto Scaling 组。

  • Amazon S3 存储桶 – 使用 Elastic Beanstalk 时创建的源代码、日志和其他项目的存储位置。

  • Amazon CloudWatch 警报 – 用于监控环境实例负载的两个 CloudWatch 警报,在负载过高或过低时触发。警报触发后,您的 Auto Scaling 组会扩展或收缩进行响应。

  • AWS CloudFormation 堆栈 – Elastic Beanstalk 使用 AWS CloudFormation 启动您的环境中的资源并传播配置更改。这些资源在您可通过 AWS CloudFormation 控制台查看的模板中定义。

  • 域名 – 一个域名,它以下面的形式路由到您的 Web 应用程序:subdomain.region.elasticbeanstalk.com

所有这些资源均由 Elastic Beanstalk 管理。当您终止环境时,Elastic Beanstalk 会终止其包含的所有资源。您启动的 RDS 数据库实例位于您的环境之外,因此您需负责管理其生命周期。

注意

Elastic Beanstalk 创建的 Amazon S3 存储桶将在多个环境之间共享并且在环境终止期间不会被删除。有关更多信息,请参阅 将 Elastic Beanstalk 用于 Amazon S3

配置安全设置和环境属性

将数据库实例的安全组添加到正在运行的环境。此过程将使 Elastic Beanstalk 使用附加的其他安全组重新配置环境中的所有实例。

向环境添加安全组

  • 执行以下任一操作:

    • 使用 Elastic Beanstalk 控制台添加安全组

      1. 打开 Elastic Beanstalk 控制台

      2. 导航到您的环境的管理页

      3. 选择 Configuration

      4. Instances (实例)配置卡上,选择 Modify (修改)

      5. EC2 安全组下面,选择 Elastic Beanstalk 创建的实例安全组以及要附加到实例的安全组。

      6. 选择 Apply

      7. 阅读警告,然后选择确认

    • 要使用配置文件添加安全组,请使用 securitygroup-addexisting.config 示例文件。

接下来,使用环境属性将连接信息传递给环境。示例应用程序使用了默认的一组属性,这些属性与您在环境中预置数据库时 Elastic Beanstalk 配置的属性匹配。

为 Amazon RDS 数据库实例配置环境属性

  1. 打开 Elastic Beanstalk 控制台

  2. 导航到您的环境的管理页

  3. 选择 Configuration

  4. Software 配置卡上,选择 Modify

  5. 环境属性部分中,定义应用程序读取的用于构建连接字符串的变量。为了与具有集成 RDS 数据库实例的环境兼容,请使用以下内容。

    • RDS_HOSTNAME – 数据库实例的主机名。

      Amazon RDS 控制台标签 – 终端节点(这是主机名)

    • RDS_PORT – 数据库实例接受连接的端口。默认值因数据库引擎而异。

      Amazon RDS 控制台标签 – 端口

    • RDS_DB_NAME – 数据库名称,ebdb

      Amazon RDS 控制台标签 – 数据库名称

    • RDS_USERNAME – 您为数据库配置的用户名。

      Amazon RDS 控制台标签 – 用户名

    • RDS_PASSWORD – 您为数据库配置的密码。

    
        添加了 RDS 属性的“环境属性”部分
  6. 选择 Apply

安装 Drupal 后,您需要使用 SSH 连接到实例,以检索某些配置详细信息。将 SSH 密钥分配给环境的实例。

配置 SSH

  1. 如果您之前未创建密钥对,请打开 Amazon EC2 控制台的密钥对页面,然后按照说明创建一个。

  2. 打开 Elastic Beanstalk 控制台

  3. 导航到您的环境的管理页

  4. 选择 Configuration

  5. 安全性下,选择修改

  6. 对于 EC2 密钥对,选择您的密钥对。

  7. 选择 Apply

配置并部署您的应用程序

要为 Elastic Beanstalk 创建 Drupal 项目,请下载 Drupal 源代码并将其与 GitHub 上的 aws-samples/eb-php-drupal 存储库中的文件组合。

创建 Drupal 项目

  1. https://www.drupal.org/download 下载 Drupal。

    ~$ curl https://ftp.drupal.org/files/projects/drupal-8.5.3.tar.gz -o drupal.tar.gz
  2. 从示例存储库中下载配置文件:

    ~$ wget https://github.com/aws-samples/eb-php-drupal/releases/download/v1.1/eb-php-drupal-v1.zip
  3. 提取 Drupal 并更改文件夹的名称。

    ~$ tar -xvf drupal.tar.gz ~$ mv drupal-8.5.3 drupal-beanstalk ~$ cd drupal-beanstalk
  4. 从 Drupal 安装中提取配置文件。

    ~/drupal-beanstalk$ unzip ../eb-php-drupal-v1.zip creating: .ebextensions/ inflating: .ebextensions/dev.config inflating: .ebextensions/drupal.config inflating: .ebextensions/efs-create.config inflating: .ebextensions/efs-filesystem.template inflating: .ebextensions/efs-mount.config inflating: .ebextensions/loadbalancer-sg.config inflating: LICENSE inflating: README.md inflating: beanstalk-settings.php

验证您的 drupal-beanstalk 文件夹结构是否正确,如下所示。

drupal-beanstalk$ tree -aL 1 . ├── autoload.php ├── beanstalk-settings.php ├── composer.json ├── composer.lock ├── core ├── .csslintrc ├── .ebextensions ├── .ebextensions ├── .editorconfig ├── .eslintignore ├── .eslintrc.json ├── example.gitignore ├── .gitattributes ├── .htaccess ├── .ht.router.php ├── index.php ├── LICENSE ├── LICENSE.txt ├── modules ├── profiles ├── README.md ├── README.txt ├── robots.txt ├── sites ├── themes ├── update.php ├── vendor └── web.config

项目存储库中的 beanstalk-settings.php 文件使用您在上一步中定义的环境变量来配置数据库连接。.ebextensions 文件夹包含用于在您的 Elastic Beanstalk 环境中创建更多资源的配置文件。

该配置文件要求您进行修改以使用账户。将文件中的占位符值替换为适当的 ID 并创建源包。

更新配置文件并创建源包。

  1. 按如下方式修改配置文件。

    • .ebextensions/dev.config – 将对您的环境的访问限制为您的 IP 地址,以便在 Drupal 安装过程中保护环境。将靠近文件顶部的占位符 IP 地址替换为您的公有 IP 地址。

    • .ebextensions/efs-create.config – 在您的 VPC 中的每个可用区/子网中创建 EFS 文件系统和装载点。在 Amazon VPC 控制台中确定您的默认 VPC 和子网 ID。

  2. 创建将文件包含在项目文件夹中的源包。以下命令将创建名为 drupal-beanstalk.zip 的源包。它将排除 vendor 文件夹中的文件,因为这些文件会占用大量空间并且对于将您的应用程序部署到 Elastic Beanstalk 不是必需的。

    ~/eb-drupal$ zip ../drupal-beanstalk.zip -r * .[^.]* -x "vendor/*"

将原包上传到 Elastic Beanstalk 以将 Drupal 部署到您的环境。

部署源包

  1. 打开 Elastic Beanstalk 控制台

  2. 导航到您的环境的管理页

  3. 选择 Upload and Deploy

  4. 选择选择文件并使用对话框选择源包。

  5. 选择 Deploy

  6. 部署完成后,选择站点 URL 以在新选项卡中打开您的网站。

安装 Drupal

完成 Drupal 安装

  1. 打开 Elastic Beanstalk 控制台

  2. 导航到您的环境的管理页

  3. 选择 URL 以便在浏览器中打开您的站点。您将会重定向到 Drupal 安装向导,因为该站点还未配置。

  4. 执行具有以下数据库设置的标准安装:

    • 数据库名称 – 在 Amazon RDS 控制台中显示的数据库名称

    • 数据库用户名和密码 – 您在创建数据库时输入的主用户名主密码值。

    • 高级选项 > 主机 – 在 Amazon RDS 控制台中显示的数据库实例的终端节点

安装大约需要一分钟能完成。

更新 Drupal 配置并删除访问限制

Drupal 安装过程将在实例上的 settings.php 文件夹中创建一个名为 sites/default 的文件。您的源代码中需要此文件来避免在后续部署中重置您的站点,但该文件当前包含了您不希望提交到源的密钥。连接到应用程序实例以从设置文件中检索信息。

使用 SSH 连接到应用程序实例

  1. 打开 Amazon EC2 控制台的实例页面

  2. 选择应用程序实例。它是以您的 Elastic Beanstalk 环境命名的实例。

  3. 选择 Connect

  4. 按照以下说明将实例与 SSH 连接。该命令看上去类似以下内容。

    $ ssh -i ~/.ssh/mykey ec2-user@ec2-00-55-33-222.us-west-2.compute.amazonaws.com

从最后一行设置文件中获取同步目录 ID。

[ec2-user ~]$ tail -n 1 /var/app/current/sites/default/settings.php $config_directories['sync'] = 'sites/default/files/config_4ccfX2sPQm79p1mk5IbUq9S_FokcENO4mxyC-L18-4g_xKj_7j9ydn31kDOYOgnzMu071Tvc4Q/sync';

该文件还包含站点的当前哈希键,但您可以忽略当前值并使用您自己的值。

将同步目录路径和哈希键分配到环境属性。项目存储库中的自定义设置文件将读取这些属性以便在部署期间配置站点,并读取您之前设置的数据库连接属性。

Drupal 配置属性

  • SYNC_DIR – 同步目录的路径。

  • HASH_SALT – 符合环境属性要求的任何字符串值。

在 Elastic Beanstalk 控制台中配置环境属性

  1. 打开 Elastic Beanstalk 控制台

  2. 导航到您的环境的管理页

  3. 选择 Configuration

  4. Software 配置卡上,选择 Modify

  5. Environment properties (环境属性) 下,输入键-值对。

  6. 选择 Apply

最后,示例项目包含一个创建安全组并将其分配给环境负载均衡器的配置文件 (loadbalancer-sg.config),使用您在 dev.config 中配置的 IP 地址将端口 80 上的 HTTP 访问限制为来自您的网络的连接。否则,在您安装 Drupal 并配置您的管理员账户之前,外部方可能连接到您的站点。

更新 Drupal 的配置并删除访问限制

  1. 从项目目录中删除 .ebextensions/loadbalancer-sg.config 文件。

    ~/drupal-beanstalk$ rm .ebextensions/loadbalancer-sg.config
  2. 将自定义 settings.php 文件复制到站点文件夹中。

    ~/drupal-beanstalk$ cp beanstalk-settings.php sites/default/settings.php
  3. 创建源包。

    ~/eb-drupal$ zip ../drupal-beanstalk-v2.zip -r * .[^.]* -x "vendor/*"

将原包上传到 Elastic Beanstalk 以将 Drupal 部署到您的环境。

部署源包

  1. 打开 Elastic Beanstalk 控制台

  2. 导航到您的环境的管理页

  3. 选择 Upload and Deploy

  4. 选择选择文件并使用对话框选择源包。

  5. 选择 Deploy

  6. 部署完成后,选择站点 URL 以在新选项卡中打开您的网站。

配置 Autoscaling

最后,使用较高的最低实例计数配置您环境的 Auto Scaling 组。请始终至少运行两个实例,以防止您的环境中的 Web 服务器发生单点故障,并支持您在不中断站点服务的情况下部署更改。

配置您的环境的 Auto Scaling 组以获得高可用性

  1. 打开 Elastic Beanstalk 控制台

  2. 导航到您的环境的管理页

  3. 选择 Configuration

  4. 容量配置卡上,选择修改

  5. Auto Scaling 组 (Auto Scaling 组) 部分中,将 Min instances (最小实例数) 设置为 2

  6. 选择 Apply

为了支持多个实例中的内容上传,示例项目使用 Amazon Elastic File System 来创建共享文件系统。在站点上创建一个帖子,然后上传内容以将其存储在共享文件系统上。查看帖子并多次刷新页面,以命中两个实例并验证共享文件系统是否正常工作。

清除

Elastic Beanstalk 使用完毕时,您可以终止您的环境。Elastic Beanstalk 会终止与环境关联的所有 AWS 资源,例如 Amazon EC2 实例数据库实例负载均衡器、安全组和警报

终止 Elastic Beanstalk 环境

  1. 打开 Elastic Beanstalk 控制台

  2. 导航到您的环境的管理页

  3. 选择操作,然后选择终止环境

  4. Confirm Termination (确认终止) 对话框中,键入环境名称,然后选择 Terminate (终止)

利用 Elastic Beanstalk,可以随时为您的应用程序轻松创建新环境。

此外,您还可以终止在您的 Elastic Beanstalk 环境外部创建的数据库资源。当您终止 Amazon RDS 数据库实例时,可以拍摄快照并在以后将数据恢复到其他实例。

终止您的 RDS 数据库实例

  1. 打开 Amazon RDS 控制台

  2. 选择数据库

  3. 选择您的数据库实例。

  4. 选择 Actions,然后选择 Delete

  5. 选择是否创建快照,然后选择删除

后续步骤

如果要继续部署应用程序,您可能需要一种方式来管理环境和部署应用程序,而无需手动创建 .zip 文件并将其上传至 Elastic Beanstalk 控制台 控制台。Elastic Beanstalk 命令行界面 (EB CLI) 提供了易于使用的命令,可用于从命令行创建、配置应用程序并将应用程序部署到 Elastic Beanstalk 环境。

示例应用程序使用配置文件配置 PHP 设置并在数据库中创建表 (如果表尚未存在)。您还可以使用配置文件在环境创建期间配置实例的安全组设置,以避免耗时的配置更新。有关更多信息,请参阅使用配置文件 (.ebextensions) 进行高级环境自定义

对于开发和测试,您可能希望使用 Elastic Beanstalk 的用于将托管数据库实例直接添加到环境的功能。有关在环境内设置数据库的说明,请参阅向 Elastic Beanstalk 环境中添加数据库

如果您需要高性能数据库,请考虑使用 Amazon Aurora。Amazon Aurora 是与 MySQL 兼容的数据库引擎,能够以低成本提供商用数据库功能。要将您的应用程序连接到另一个数据库,请重复执行安全组配置步骤并更新与 RDS 相关的环境属性

最后,如果计划在生产环境中使用应用程序,您会希望为环境配置自定义域名,并为安全连接启用 HTTPS