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

向 Elastic Beanstalk 部署 Laravel 应用程序

Laravel 是一种 PHP 开源模型-视图-控制器 (MVC) 框架。本教程演练生成 Laravel 应用程序、将其部署到 AWS Elastic Beanstalk 环境并配置其连接到 Amazon Relational Database Service (Amazon RDS) 数据库实例的过程。

先决条件

本教程假设您对基本 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 集成的版本。

Laravel 需要 PHP 5.5.9 或更高版本,以及 PHP 的 mbstring 扩展。在本教程中,我们使用 PHP 7.0 和相应的 Elastic Beanstalk 平台配置。通过遵循设置 PHP 开发环境上的说明安装 PHP 和 Composer。

启动 Elastic Beanstalk 环境

使用 AWS 管理控制台创建 Elastic Beanstalk 环境。选择 PHP 平台并接受默认设置和示例代码。

启动环境 (控制台)

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

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

  3. 对于 Application code,选择 Sample application

  4. 选择 Review and launch

  5. 检查可用选项。对它们感到满意之后,选择 Create app

环境创建大约需要 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 应用程序:子域区域.elasticbeanstalk.com

所有这些资源均由 Elastic Beanstalk 管理。当您终止环境时,Elastic Beanstalk 会终止其包含的所有资源。

注意

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

安装 Laravel 并生成网站

Composer 可使用一个命令安装 Laravel 并创建工作项目:

~$ composer create-project --prefer-dist laravel/laravel eb-laravel Installing laravel/laravel (v5.5.28) - Installing laravel/laravel (v5.5.28): Downloading (100%) Created project in eb-laravel > @php -r "file_exists('.env') || copy('.env.example', '.env');" Loading composer repositories with package information Updating dependencies (including require-dev) Package operations: 70 installs, 0 updates, 0 removals - Installing symfony/thanks (v1.0.7): Downloading (100%) - Installing hamcrest/hamcrest-php (v2.0.0): Downloading (100%) - Installing mockery/mockery (1.0): Downloading (100%) - Installing vlucas/phpdotenv (v2.4.0): Downloading (100%) - Installing symfony/css-selector (v3.4.8): Downloading (100%) - Installing tijsverkoyen/css-to-inline-styles (2.2.1): Downloading (100%) ...

Composer 安装 Laravel 及其依赖项,并生成默认项目。

如果在安装 Laravel 时遇到任何问题,请参阅官方文档中的安装主题:https://laravel.com/docs/5.2

部署您的应用程序

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

eb-laravel zip ../laravel-default.zip -r * .[^.]* -x "vendor/*"

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

部署源包

  1. 打开 Elastic Beanstalk 控制台

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

  3. 选择 Upload and Deploy

  4. 选择 Choose File 并使用对话框选择源包。

  5. 选择 Deploy

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

注意

为了进一步优化源包,请初始化一个 Git 存储库并使用 git archive 命令创建源包。默认 Laravel 项目包含一个 .gitignore 文件,该文件指示 Git 排除 vendor 文件夹以及部署时不需要的其他文件。

配置 Composer 设置

部署完成后,单击 URL 以在浏览器中打开 Laravel 应用程序:

这是什么? 默认情况下,Elastic Beanstalk 提供项目在网站根路径下的根目录。但在这种情况下,默认页面 (index.php) 位于 public 文件夹的下一级。您可通过将 /public 添加至 URL 加以验证。例如:http://laravel.us-west-2.elasticbeanstalk.com/public

要在根路径提供 Laravel 应用程序,请使用 Elastic Beanstalk 控制台为网站配置文档根目录

配置网站的文档根目录

  1. 打开 Elastic Beanstalk 控制台

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

  3. 选择 Configuration

  4. Software 配置卡上,选择 Modify

  5. 对于 Document Root,键入 /public

  6. 选择 Apply

  7. 更新完成后,单击 URL 以在浏览器中重新打开站点。

到目前为止,一切正常。接下来,您将在环境中添加一个数据库,并将 Laravel 配置为连接到该数据库。

将数据库添加到环境

在 Elastic Beanstalk 环境中启动 RDS 数据库实例。您可在 Elastic Beanstalk 上通过 Laravel 使用 MySQL、SQLServer 或 PostgreSQL 数据库。在本示例中,我们将使用 MySQL。

在 Elastic Beanstalk 环境中添加 RDS 数据库实例

  1. 打开 Elastic Beanstalk 控制台

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

  3. 选择 Configuration

  4. 数据库配置卡上,选择修改

  5. 对于引擎,选择 mysql

  6. 输入主 usernamepassword。Elastic Beanstalk 将使用环境属性为应用程序提供这些值。

  7. 选择 Apply

创建数据库实例需要大约 10 分钟。同时,您可更新源代码,以便从环境中读取连接信息。Elastic Beanstalk 使用 RDS_HOSTNAME 等环境变量提供连接详细信息,以便您可以从应用程序中访问。

Laravel 的数据库配置存储在项目代码中 database.php 文件夹下名为 config 的文件内。查找 mysql 并修改 hostdatabaseusernameand password 变量,以便从 Elastic Beanstalk 中读取对应的值:

例 ~/eb-laravel/config/database.php

... 'connections' => [ 'sqlite' => [ 'driver' => 'sqlite', 'database' => env('DB_DATABASE', database_path('database.sqlite')), 'prefix' => '', ], 'mysql' => [ 'driver' => 'mysql', 'host' => env('RDS_HOSTNAME', '127.0.0.1'), 'port' => env('RDS_PORT', '3306'), 'database' => env('RDS_DB_NAME', 'forge'), 'username' => env('RDS_USERNAME', 'forge'), 'password' => env('RDS_PASSWORD', ''), 'unix_socket' => env('DB_SOCKET', ''), 'charset' => 'utf8mb4', 'collation' => 'utf8mb4_unicode_ci', 'prefix' => '', 'strict' => true, 'engine' => null, ], ...

要验证数据库连接是否已正确配置,请向 index.php 添加代码以连接到数据库,并向默认响应添加一些代码:

例 ~/eb-laravel/public/index.php

... if(DB::connection()->getDatabaseName()) { echo "Connected to database ".DB::connection()->getDatabaseName(); } $response->send(); ...

在数据库实例完成启动后,将已更新的应用程序打包并将其部署到环境。

更新 Elastic Beanstalk 环境

  1. 创建源包:

    ~/eb-laravel$ zip ../laravel-v2-rds.zip -r * .[^.]* -x "vendor/*"
  2. 打开 Elastic Beanstalk 控制台

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

  4. 选择 Upload and Deploy

  5. 选择 Browse,然后上传 laravel-v2-rds.zip

  6. 选择 Deploy

部署应用程序的新版本花费不到 1 分钟的时间。完成部署后,再次刷新网页,以验证数据库连接成功:

清除

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

终止 Elastic Beanstalk 环境

  1. 打开 Elastic Beanstalk 控制台

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

  3. 选择 Actions,然后选择 Terminate Environment

  4. Confirm Termination 对话框中,键入环境名称,然后选择 Terminate

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

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

终止您的 RDS 数据库实例

  1. 打开 Amazon RDS 控制台

  2. 选择 Instances

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

  4. 选择实例操作,然后选择删除

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

后续步骤

有关 Laravel 的更多信息,请参阅 laravel.com 上的教程。

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

在本教程中,您使用了 Elastic Beanstalk 控制台来配置 Composer 选项。要使此配置成为应用程序源的一部分,您可以使用类似于下面的配置文件。

例 .ebextensions/composer.config

option_settings: aws:elasticbeanstalk:container:php:phpini: document_root: /public

有关更多信息,请参阅 使用配置文件 (.ebextensions) 进行高级环境自定义

在 Elastic Beanstalk 环境中运行 Amazon RDS 数据库实例不仅适合开发和测试,还将数据库的生命周期与环境相关联。参阅向 PHP 应用程序环境中添加 Amazon RDS 数据库实例,浏览有关连接至在环境外运行的数据库的说明。

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