

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 将 rails 应用程序部署到 Elastic Beanstalk
<a name="ruby-rails-tutorial"></a>

Rails 是一个适用于 Ruby 的开源 model-view-controller (MVC) 框架。本教程将引导您完成生成 Rails 应用程序并将其部署到 AWS Elastic Beanstalk 环境中的过程。

**Topics**
+ [先决条件](#ruby-rails-tutorial-prereqs)
+ [Elastic Beanstalk 基础知识](#ruby-rails-tutorial-prereqs-basic)
+ [启动 Elastic Beanstalk 环境](#ruby-rails-tutorial-launch)
+ [安装 rails 并生成网站](#ruby-rails-tutorial-generate)
+ [配置 rails 设置](#ruby-rails-tutorial-configure)
+ [部署您的应用程序](#ruby-rails-tutorial-deploy)
+ [清理](#ruby-rails-tutorial-cleanup)
+ [后续步骤](#ruby-rails-tutorial-nextsteps)

## 先决条件
<a name="ruby-rails-tutorial-prereqs"></a>

## Elastic Beanstalk 基础知识
<a name="ruby-rails-tutorial-prereqs-basic"></a>

本教程假设您对基本 Elastic Beanstalk 操作和 Elastic Beanstalk 控制台有一定了解。如果尚不了解，请按照[了解如何开始使用 Elastic Beanstalk](GettingStarted.md)中的说明操作以启动您的第一个 Elastic Beanstalk 环境。

### 命令行
<a name="ruby-rails-tutorial-prereqs-cmdline"></a>

为了遵循本指南中的步骤，您需要命令行终端或 Shell，以便运行命令。命令显示在列表中，以提示符（\$1）和当前目录名称（如果有）开头。

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

在 Linux 和 macOS 中，您可使用您首选的 Shell 和程序包管理器。在 Windows 上，您可以[安装适用于 Linux 的 Windows 子系统](https://docs.microsoft.com/en-us/windows/wsl/install-win10)，以获取与 Windows 集成的 Ubuntu 和 Bash 版本。

### Rails 依赖项
<a name="ruby-rails-tutorial-prereqs-railsreqs"></a>

Rails 框架 6.1.4.1 具有以下依赖项。请确保您已安装所有依赖项。
+ **Ruby 2.5.0 或更高版本** - 有关安装说明，请参阅 [为 Elastic Beanstalk 设置 Ruby 开发环境](ruby-development-environment.md)。

  在本教程中，我们使用 Ruby 3.0.2 和相应的 Elastic Beanstalk 平台版本。
+ **Node.js** – 有关安装说明，请参阅[通过软件包管理器安装 Node.js](https://nodejs.org/en/download/package-manager/)。
+ **Yarn** – 有关安装说明，请参阅 *Yarn* 网站上的[安装](https://yarnpkg.com/lang/en/docs/install/)。

## 启动 Elastic Beanstalk 环境
<a name="ruby-rails-tutorial-launch"></a>

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

**启动环境（控制台）**

1. [使用以下预配置链接打开 Elastic Beanstalk 控制台：console.aws.amazon。 com/elasticbeanstalk/home\$1/newApplication？ 应用程序名称=教程&环境类型= LoadBalanced](https://console.aws.amazon.com/elasticbeanstalk/home#/newApplication?applicationName=tutorials&environmentType=LoadBalanced)

1. 对于 **Platform**（平台），选择与应用程序使用的语言匹配的平台和平台分支。

1. 对于**应用程序代码**，选择**示例应用程序**。

1. 选择**复查并启动**。

1. 检查可用选项。选择要使用的可用选项，然后在准备就绪后选择**创建应用程序**。

环境创建大约需要 5 分钟，将创建以下资源：
+ **EC2 实例** — 配置为在您选择的平台上运行 Web 应用程序的亚马逊弹性计算云 (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 组会扩展或收缩以进行响应。
+ **CloudFormation 堆栈** — Elastic CloudFormation Beanstalk 用于在您的环境中启动资源并传播配置更改。这些资源在您可通过 [CloudFormation 控制台](https://console.aws.amazon.com/cloudformation)查看的模板中定义。
+ **域名**-以表单形式路由到您的 Web 应用程序的域名**subdomain*。 *region*.elasticbeanstalk.com。*
**域安全**  
为增强 Elastic Beanstalk 应用程序的安全性，已将 *elasticbeanstalk.com* 域注册到 [公共后缀列表（PSL）](https://publicsuffix.org/)。  
如果您需要在 Elastic Beanstalk 应用程序的默认域名中设置敏感 Cookie，我们建议您使用带有前缀 `__Host-` 的 Cookie 来提高安全性。这种做法可以保护您的域免遭跨站点请求伪造（CSRF）攻击。要了解更多信息，请参阅 Mozilla 开发者网络中的 [Set-Cookie](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie#cookie_prefixes) 页面。

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

**注意**  
Elastic Beanstalk 创建的 Amazon S3 存储桶将在多个环境之间共享并且在环境终止期间不会被删除。有关更多信息，请参阅 [将 Elastic Beanstalk 和 Amazon S3 结合使用](AWSHowTo.S3.md)。

## 安装 rails 并生成网站
<a name="ruby-rails-tutorial-generate"></a>

使用 `gem` 命令安装 Rails 及其依赖项。

```
~$ gem install rails
Fetching: concurrent-ruby-1.1.9.gem
Successfully installed concurrent-ruby-1.1.9
Fetching: rack-2.2.3.gem
Successfully installed rack-2.2.3
...
```

测试 Rails 安装。

```
~$ rails --version
Rails 6.1.4.1
```

将 `rails new` 与应用程序的名称一起使用以创建新 Rails 项目。

```
~$ rails new ~/eb-rails
```

Rails 将创建具有指定名称的目录，生成在本地运行示例项目所需的所有文件，然后运行捆绑程序以安装在项目的 Gemfile 中定义的所有依赖项（Gems）。

**注意**  
此过程将为该项目安装最新的 Puma 版本。此版本可能与 Elastic Beanstalk 在环境的 Ruby 平台版本上提供的版本不同。要查看 Elastic Beanstalk 提供的 Puma 版本，请参阅《AWS Elastic Beanstalk 平台指南》**中的 [Ruby 平台历史记录](https://docs.aws.amazon.com/elasticbeanstalk/latest/platforms/platform-history-ruby.html)。有关最新 Puma 版本的更多信息，请参阅 [Puma.io](http://puma.io) 网站。如果这两个 Puma 版本不一致，请使用下面的任意一种选项：  
使用之前 `rails new` 命令安装的 Puma 版本。在这种情况下，您必须为平台添加一个 `Procfile` 以使用自己提供的 Puma 服务器版本。有关更多信息，请参阅 [在 Elastic Beanstalk 上使用 Procfile 配置应用程序进程。](ruby-platform-procfile.md)。
更新 Puma 版本，使其与环境的 Ruby 平台版本中预安装的版本保持一致。为此，请在 [Gemfile](ruby-platform-gemfile.md#ruby-platform-gemfile.title) 中修改 Puma 版本，该文件位于项目源目录的根中。然后运行 `bundle update`。有关更多信息，请参阅 Bundler.io 网站上的 [bundle update](https://bundler.io/man/bundle-update.1.html)（捆绑包更新）页面。

通过在本地运行默认项目测试 Rails 安装。

```
~$ cd eb-rails
~/eb-rails$ rails server
=> Booting Puma
=> Rails 6.1.4.1 application starting in development
=> Run `bin/rails server --help` for more startup options
Puma starting in single mode...
* Puma version: 5.5.2 (ruby 3.0.2-p107) ("Zawgyi")
*  Min threads: 5
*  Max threads: 5
*  Environment: development
*          PID: 77857
* Listening on http://127.0.0.1:3000
* Listening on http://[::1]:3000
Use Ctrl-C to stop
...
```

在 Web 浏览器中打开 `http://localhost:3000` 以查看运转中的默认项目。

![\[默认 rails 网站开发页面。\]](http://docs.aws.amazon.com/zh_cn/elasticbeanstalk/latest/dg/images/ruby-rails-default.png)


此页面仅在开发模式中可见。向应用程序的首页添加一些内容来支持至 Elastic Beanstalk 的生产部署。使用 `rails generate` 为欢迎页面创建控制器、路由和视图。

```
~/eb-rails$ rails generate controller WelcomePage welcome
      create  app/controllers/welcome_page_controller.rb
       route  get 'welcome_page/welcome'
      invoke  erb
      create    app/views/welcome_page
      create    app/views/welcome_page/welcome.html.erb
      invoke  test_unit
      create    test/controllers/welcome_page_controller_test.rb
      invoke  helper
      create    app/helpers/welcome_page_helper.rb
      invoke    test_unit
      invoke  assets
      invoke    coffee
      create      app/assets/javascripts/welcome_page.coffee
      invoke    scss
      create      app/assets/stylesheets/welcome_page.scss.
```

这将提供访问 `/welcome_page/welcome` 处的页面所需的一切。但是，在发布更改之前，请更改视图中的内容并添加路由以使此页面显示在网站的顶层。

使用文本编辑器编辑 `app/views/welcome_page/welcome.html.erb` 中的内容。在本示例中，您将使用 `cat` 覆盖现有文件的内容。

**Example app/views/welcome\$1page/welcome.html.erb**  

```
<h1>Welcome!</h1>
<p>This is the front page of my first Rails application on Elastic Beanstalk.</p>
```

 最后，将以下路由添加到 `config/routes.rb`：

**Example config/routes.rb**  

```
Rails.application.routes.draw do
  get 'welcome_page/welcome'
  root 'welcome_page#welcome'
```

这将指示 Rails 将对网站的根目录的请求路由到欢迎页面控制器的欢迎方法，该方法将在欢迎视图中呈现内容（`welcome.html.erb`）。

要使 Elastic Beanstalk 在 Ruby 平台上成功部署应用程序，我们需要更新 `Gemfile.lock`。`Gemfile.lock ` 的一些依赖项可能是特定于平台的。因此，我们需要将 **platform ruby** 添加到 `Gemfile.lock`，以使所有必需的依赖项均随部署一起安装。

**Example**  

```
~/eb-rails$ bundle lock --add-platform ruby
Fetching gem metadata from https://rubygems.org/............
Resolving dependencies...
Writing lockfile to /Users/janedoe/EBDPT/RubyApps/eb-rails-doc-app/Gemfile.lock
```

## 配置 rails 设置
<a name="ruby-rails-tutorial-configure"></a>

使用 Elastic Beanstalk 控制台为 Rails 配置环境属性。将 `SECRET_KEY_BASE` 环境属性设置为最多 256 个字母数字字符的字符串。

Rails 使用此属性来创建密钥。因此，您应该保密，不要将密钥以纯文本形式存储在源代码控制中。相反，您应通过环境属性在环境中向 Rails 代码提供该密钥。

**在 Elastic Beanstalk 控制台中配置环境变量**

1. 打开 [Elastic Beanstalk](https://console.aws.amazon.com/elasticbeanstalk) 控制台，然后**在 “区域” 列表中，选择您**的。 AWS 区域

1. 在导航窗格中，选择 **Environments**（环境），然后从列表中选择环境的名称。

1. 在导航窗格中，选择 **Configuration**（配置）。

1. 在 **Updates, monitoring, and logging**（更新、监控和日志记录）配置类别中，选择 **Edit**（编辑）。

1. 向下滚动到**运行时环境变量**。

1. 选择**添加环境变量**。

1. 对于**来源**，选择**纯文本**。
**注意**  
下拉列表中的 **Secrets Manager** 和 **SSM Parameter Store** 值用于将环境变量配置为用于存储敏感数据（例如凭证和 API 密钥）的密钥。有关更多信息，请参阅 [将 Elastic B AWS Secrets Manager ean AWS Systems Manager stalk 与参数存储和参数存储一起使用](AWSHowTo.secrets.md)。

1. 输入**环境变量名称**和**环境变量值**对。

1. 如需添加更多变量，请重复**步骤 6** 至**步骤 8**。

1. 要保存更改，请选择页面底部的 **Apply**（应用）。

现在准备好将站点部署到环境中。

## 部署您的应用程序
<a name="ruby-rails-tutorial-deploy"></a>

创建包含 Rails 所创建文件的[源包](applications-sourcebundle.md)。以下命令将创建名为 `rails-default.zip` 的源包。

```
~/eb-rails$ zip ../rails-default.zip -r * .[^.]*
```

将源包上传到 Elastic Beanstalk 以将 Rails 部署到您的环境。

**部署源包**

1. 打开 [Elastic Beanstalk](https://console.aws.amazon.com/elasticbeanstalk) 控制台，然后**在 “区域” 列表中，选择您**的。 AWS 区域

1. 在导航窗格中，选择 **Environments**（环境），然后从列表中选择环境的名称。

1. 在环境概述页面上，选择 **Upload and deploy**（上传和部署）。

1. 使用屏幕上的对话框上传源包。

1. 选择 **Deploy**（部署）。

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

## 清理
<a name="ruby-rails-tutorial-cleanup"></a>

演示代码使用完毕后，您可以终止环境。[Elastic Beanstalk 会删除 AWS 所有相关资源，[例如 EC2 亚马逊](using-features.managing.ec2.md)[实例、数据库实例、](using-features.managing.db.md)负载均衡器[、安全组](using-features.managing.elb.md)和警报。](using-features.alarms.md#using-features.alarms.title)

移除资源不会删除 Elastic Beanstalk 应用程序，因此您可以随时为您的应用程序创建新环境。

**从控制台终止 Elastic Beanstalk 环境**

1. 打开 [Elastic Beanstalk](https://console.aws.amazon.com/elasticbeanstalk) 控制台，然后**在 “区域” 列表中，选择您**的。 AWS 区域

1. 在导航窗格中，选择 **Environments**（环境），然后从列表中选择环境的名称。

1. 选择 **Actions**（操作），然后选择 **Terminate environment**（终止环境）。

1. 使用屏幕上的对话框确认环境终止。

## 后续步骤
<a name="ruby-rails-tutorial-nextsteps"></a>

有关 Rails 的更多信息，请访问 [rubyonrails.org](https://rubyonrails.org/)。

当您继续开发应用程序时，您可能希望通过某种方式来管理环境和部署应用程序，而无需手动创建 .zip 文件并将该文件上传到 Elastic Beanstalk 控制台。[Elastic Beanstalk 命令行](eb-cli3.md)界面 (EB CLI easy-to-use) 提供了从命令行创建、配置应用程序并将其部署到 Elastic Beanstalk 环境的命令。

最后，如果计划在生产环境中使用应用程序，您会希望为环境[配置自定义域名](customdomains.md)，并为安全连接[启用 HTTPS](configuring-https.md)。