将 rails 应用程序部署到 Elastic Beanstalk - Amazon Elastic Beanstalk
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

将 rails 应用程序部署到 Elastic Beanstalk

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

先决条件

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

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

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

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

Rails 框架 6.1.4.1 具有以下依赖项。请确保您已安装所有依赖项。

启动 Elastic Beanstalk 环境

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

启动环境(控制台)
  1. 使用这个预先配置的链接打开 Elastic Beanstalk 控制台:console.aws.amazon.com/elasticbeanstalk/home#/ newApplicationName=教程 &环境类型= LoadBalanced

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

  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 组会扩展或收缩以进行响应。

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

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

    注意

    为了增强您的 Elastic Beanstalk 应用程序的安全性,eb.amazonaws.com.cn 名已在公共后缀列表 (PSL) 中注册。为进一步增强安全性,如果您需要在 Elastic Beanstalk 应用程序的默认域名中设置敏感 Cookie,我们建议您使用带 __Host- 前缀的 Cookie。这将有助于保护您的域,防范跨站点请求伪造(CSRF)攻击。要了解更多信息,请参阅 Mozilla 开发者网络中的 Set-Cookie 页面。

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

注意

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

安装 rails 并生成网站

使用 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 版本,请参阅《Amazon Elastic Beanstalk 平台指南》中的 Ruby 平台历史记录。有关最新 Puma 版本的更多信息,请参阅 Puma.io 网站。如果这两个 Puma 版本不一致,请使用下面的任意一种选项:

  • 使用之前 rails new 命令安装的 Puma 版本。在这种情况下,您必须为平台添加一个 Procfile 以使用自己提供的 Puma 服务器版本。有关更多信息,请参阅使用 Procfile 配置应用程序进程

  • 更新 Puma 版本,使其与环境的 Ruby 平台版本中预安装的版本保持一致。为此,请在 Gemfile 中修改 Puma 版本,该文件位于项目源目录的根中。然后运行 bundle update。有关更多信息,请参阅 Bundler.io 网站上的 bundle update(捆绑包更新)页面。

通过在本地运行默认项目测试 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 网站开发页面。

此页面仅在开发模式中可见。向应用程序的首页添加一些内容来支持至 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 覆盖现有文件的内容。

例 app/views/welcome_page/welcome.html.erb
<h1>Welcome!</h1> <p>This is the front page of my first Rails application on Elastic Beanstalk.</p>

最后,将以下路由添加到 config/routes.rb

例 config/routes.rb
Rails.application.routes.draw do get 'welcome_page/welcome' root 'welcome_page#welcome'

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

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

~/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 设置

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

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

在 Elastic Beanstalk 控制台中配置环境属性
  1. 打开 Elastic Beanstalk 控制台,然后在 “区域” 列表中,选择您的。 Amazon Web Services 区域

  2. 在导航窗格中,选择 Environments(环境),然后从列表中选择环境的名称。

    注意

    如果您有多个环境,请使用搜索栏筛选环境列表。

  3. 在导航窗格中,选择 Configuration(配置)。

  4. Updates, monitoring, and logging(更新、监控和日志记录)配置类别中,选择 Edit(编辑)。

  5. 向下滚动到环境属性

  6. 选择添加环境属性

  7. 输入属性名称对。

  8. 如需添加更多变量,请重复步骤 6步骤 7

  9. 要保存更改,请选择页面底部的 Apply(应用)。

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

部署您的应用程序

创建包含 Rails 所创建文件的源包。以下命令将创建名为 rails-default.zip 的源包。

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

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

部署源包
  1. 打开 Elastic Beanstalk 控制台,然后在 “区域” 列表中,选择您的。 Amazon Web Services 区域

  2. 在导航窗格中,选择 Environments(环境),然后从列表中选择环境的名称。

    注意

    如果您有多个环境,请使用搜索栏筛选环境列表。

  3. 在环境概述页面上,选择 Upload and deploy(上传和部署)。

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

  5. 选择 Deploy(部署)。

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

清除

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

终止 Elastic Beanstalk 环境
  1. 打开 Elastic Beanstalk 控制台,然后在 “区域” 列表中,选择您的。 Amazon Web Services 区域

  2. 在导航窗格中,选择 Environments(环境),然后从列表中选择环境的名称。

    注意

    如果您有多个环境,请使用搜索栏筛选环境列表。

  3. 选择 Actions(操作),然后选择 Terminate environment(终止环境)。

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

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

后续步骤

有关 Rails 的更多信息,请访问 rubyonrails.org

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

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