

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 將 Rails 應用程式部署到 Elastic Beanstalk
<a name="ruby-rails-tutorial"></a>

Rails 為 Ruby 適用的開放原始碼、模型-檢視-控制器 (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* 網站上的 [Installation](https://yarnpkg.com/lang/en/docs/install/)。

## 啟動 Elastic Beanstalk 環境
<a name="ruby-rails-tutorial-launch"></a>

使用 Elastic Beanstalk 主控台建立 Elastic Beanstalk 環境。選擇 **Ruby (Ruby)** 平台，並接受預設的設定和範本程式碼。

**啟動環境 (主控台)**

1. 使用此一預設連結來開啟 Elastic Beanstalk 主控台：[console.aws.amazon.com/elasticbeanstalk/home\$1/newApplication?applicationName=tutorials&environmentType=LoadBalanced](https://console.aws.amazon.com/elasticbeanstalk/home#/newApplication?applicationName=tutorials&environmentType=LoadBalanced)

1. 在 **Platform (平台)**，選取符合您應用程式所使用語言的平台和平台分支。

1. 針對 **Application code (應用程式程式碼)**，選擇 **Sample application (範例應用程式)**。

1. 選擇 **Review and launch (檢閱和啟動)**。

1. 檢視可用選項。選擇您要使用的可用選項，當您準備就緒時，請選擇 **Creat app (建立應用程式)**。

使用大約需要五分鐘時間建立環境，並且建立下列資源：
+ **EC2 執行個體** ‒ Amazon Elastic Compute Cloud (Amazon EC2) 虛擬機器，已設為在您選擇的平台上執行 Web 應用程式。

  每個平台會執行特定的一套軟體、設定檔和指令碼，來支援特定的語言版本、架構、Web 容器或其組合。大多數的平台使用會 Apache 或 NGINX 做為反向代理，此反向代理會在您 Web 應用程式的前景執行、轉傳遞交給此 Web 應用程式的請求、提供靜態資產，並產生存取和錯誤日誌。
+ **執行個體安全群組** - Amazon EC2 安全群組，已設為允許從連接埠 80 傳入的流量。此資源可讓負載平衡器傳來的 HTTP 傳輸資料，到達執行您 Web 應用程式的 EC2 執行個體。在預設情況下，不允許傳輸資料從其他通訊埠傳送。
+ **負載平衡器** - Elastic Load Balancing 負載平衡器，可設定將請求分配到執行您應用程式的執行個體。負載平衡器也讓您的執行個體不需直接連接到網際網路。
+ **負載平衡器安全群組** - Amazon EC2 安全群組，設為允許從連接埠 80 傳入的流量。此資源可讓來自網際網路的 HTTP 傳輸資料到達負載平衡器。在預設情況下，不允許傳輸資料從其他通訊埠傳送。
+ **Auto Scaling 群組** - Auto Scaling 群組，設為在執行個體終止或無法使用時，取代該執行個體。
+ **Amazon S3 儲存貯體** - 儲存位置，用來儲存當您使用 Elastic Beanstalk 時所建立的原始程式碼、日誌和其他成品。
+ **Amazon CloudWatch 警示** - 兩種 CloudWatch 警示，用來監控您環境中執行個體上的負載，會在負載過高或過低時觸發。當警示觸發時，您的 Auto Scaling 群組會擴展或縮減以進行回應。
+ **CloudFormation 堆疊** – Elastic Beanstalk 使用 CloudFormation 啟動環境中的資源並傳播組態變更。資源定義於範本中，您可在 [CloudFormation 主控台](https://console.aws.amazon.com/cloudformation)中檢視此範本。
+ **網域名稱** – 會路由到您 Web 應用程式的網域名稱，其格式為 **subdomain*.*region*.elasticbeanstalk.com*。
**網域安全**  
為了增強 Elastic Beanstalk 應用程式的安全性，我們會在[公共后缀列表 (PSL)](https://publicsuffix.org/) 中註冊網域 *elasticbeanstalk.com*。  
如果您需要在 Elastic Beanstalk 應用程式的預設網域名稱中設定敏感 Cookie，建議您使用字`__Host-`首為 的 Cookie 以提高安全性。此實務可保護您的網域免於跨網站請求偽造嘗試 (CSRF)。如需更多資訊，請參閱 Mozilla 開發人員網路中的[設定 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 會使用指定的名稱來建立目錄、產生在本機執行範例專案需要的所有檔案，然後執行 Bundler 來安裝專案的 Gemfile 中定義的所有相依項目 (Gems)。

**注意**  
此過程將為該專案安裝最新的 Puma 版本。此版本可能與 Elastic Beanstalk 在您的環境的 Ruby 平台版本上提供的版本不同。如需查看 Elastic Beanstalk 提供的 Puma 版本，請參閱《[AWS Elastic Beanstalk 平台指南》](https://docs.aws.amazon.com/elasticbeanstalk/latest/platforms/platform-history-ruby.html)中的 *Ruby 平台歷史記錄*。如需最新 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 網站上的[套件更新](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_tw/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`) 呈現內容。

我們需要更新 `Gemfile.lock`，讓 Elastic Beanstalk 能在 Ruby 平台上成功部署應用程式。`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. 在導覽窗格中，選擇**環境**，然後在清單中選擇您環境的名稱。

1. 在導覽窗格中，選擇**組態**。

1. 在**更新、監控和日誌記錄**組態類別中，選擇**編輯**。

1. 向下捲動至**執行期環境變數**。

1. 選取**新增環境變數**。

1. 針對**來源**選取**純文字**。
**注意**  
下拉式清單中的 **Secrets Manager** 和 **SSM 參數存放**區值用於將環境變數設定為秘密，以存放敏感資料，例如登入資料和 API 金鑰。如需詳細資訊，請參閱[搭配 AWS Secrets Manager 和 AWS Systems Manager 參數存放區使用 Elastic Beanstalk](AWSHowTo.secrets.md)。

1. 輸入**環境變數名稱**和**環境變數值**對。

1. 如果您需要新增更多變數，請重複步驟 **6** 到**步驟 8**。

1. 若要儲存變更，請選擇頁面底部的**儲存變更**。

現在您準備好部署網站到環境。

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

建立[原始碼套件](applications-sourcebundle.md)，其中包含 Rails 所建立的檔案。以下命令建立一個名為 `rails-default.zip` 的原始碼套件。

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

將來源套件上傳至 Elastic Beanstalk，以將 Rails 部署到您的環境。

**若要部署原始碼套件**

1. 開啟 [Elastic Beanstalk 主控台](https://console.aws.amazon.com/elasticbeanstalk)，然後在**區域**清單中選取您的 AWS 區域。

1. 在導覽窗格中，選擇**環境**，然後在清單中選擇您環境的名稱。

1. 在環境概觀頁面上，選擇 **Upload and deploy** (上傳和部署)。

1. 使用畫面顯示對話方塊來上傳原始碼套件。

1. 選擇 **Deploy** (部署)。

1. 部署完成後，您可選擇網站的 URL 以在新分頁中開啟您的網站。

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

完成使用示範程式碼後，您可以終止您的環境。Elastic Beanstalk 會刪除所有相關 AWS 資源，例如 [Amazon 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. 在導覽窗格中，選擇**環境**，然後在清單中選擇您環境的名稱。

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) 提供了簡單易用的命令，讓您可從命令列界面建立、設定和部署應用程式至 Elastic Beanstalk 環境。

最後，若您打算於生產環境中使用您的應用程式，建議您[設定您環境的自訂網域名稱](customdomains.md)，並[啟用 HTTPS](configuring-https.md) 安全連線。