將 Rails 應用程式部署到 Elastic Beanstalk - AWS Elastic Beanstalk

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

將 Rails 應用程式部署到 Elastic Beanstalk

Rails 是 Ruby 的開放原始碼 model-view-controller(MVC) 架構。本教學課程會逐步引導您產生 Rails 應用程式並將其部署至 AWS Elastic Beanstalk 環境的程序。

必要條件

注意

AWS 在 2024 年 10 月 1 日之後建立的帳戶,將需要暫時設定 選項,才能成功建立新環境。與新帳戶相同,但僅適用於帳戶尚未擁有環境 的區域,現有帳戶將需要採取相同的動作。如需詳細資訊,請參閱啟動範本

基本 Elastic Beanstalk 知識

本教學假設您具備基本的 Elastic Beanstalk 操作及 Elastic Beanstalk 主控台知識。若您尚不了解,請依照 Elastic Beanstalk 入門 中的說明來啟動您的第一個 Elastic Beanstalk 環境。

命令列

為了遵循本指南的程序,您需要命令列終端機或 shell 來執行命令。命令清單前會出現提示字元 ($) 及目前的目錄名稱 (如有)。

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

在 Linux 和 macOS 上,您可以使用偏好的 Shell 和套件軟體管理工具。在 Windows 上,您可以安裝適用於 Linux 的 Windows 子系統,以取得 Windows 整合版本的 Ubuntu 和 Bash。

Rails 相依性

Rails 架構 6.1.4.1 具有下列相依性。請確定您已安裝所有項目。

啟動 Elastic Beanstalk 環境

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

啟動環境 (主控台)
  1. 使用此預先設定的連結開啟 Elastic Beanstalk 主控台: console.aws.amazon.com/elasticbeanstalk/home#/newApplication?applicationName=tutorials&environmentType=LoadBalanced

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

  3. 針對 Application code (應用程式程式碼),選擇 Sample application (範例應用程式)

  4. 選擇 Review and launch (檢閱和啟動)

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

使用大約需要五分鐘時間建立環境,並且建立下列資源:

  • EC2 執行個體 – Amazon Elastic Compute Cloud (AmazonEC2) 虛擬機器,設定為在您選擇的平台上執行 Web 應用程式。

    每個平台會執行特定的一套軟體、設定檔和指令碼,來支援特定的語言版本、架構、Web 容器或其組合。大多數平台會使用 Apache 或 NGINX 作為反向代理,位於 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 群組會擴展或縮減以進行回應。

  • AWS CloudFormation 堆疊 – Elastic Beanstalk 使用 AWS CloudFormation 啟動環境中的資源並傳播組態變更。資源定義於範本中,您可在 AWS CloudFormation 主控台中檢視此範本。

  • 網域名稱 – 以 形式路由至 Web 應用程式的網域名稱 subdomain.region.elasticbeanstalk.com

    網域安全

    為了增強 Elastic Beanstalk 應用程式的安全性,在公有字尾清單中註冊 elasticbeanstalk.com 網域 ()。 PSL

    如果您需要在 Elastic Beanstalk 應用程式的預設網域名稱中設定敏感 Cookie,我們建議您使用具有__Host-字首的 Cookie 來提高安全性。此做法會保護您的網域,防止跨網站請求偽造嘗試 (CSRF)。如需更多資訊,請參閱 Mozilla 開發人員網路中的設定 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 會使用指定的名稱來建立目錄、產生在本機執行範例專案需要的所有檔案,然後執行 Bundler 來安裝專案的 Gemfile 中定義的所有相依項目 (Gems)。

注意

此過程將為該專案安裝最新的 Puma 版本。此版本可能與 Elastic Beanstalk 在您的環境的 Ruby 平台版本上提供的版本不同。如需查看 Elastic Beanstalk 提供的 Puma 版本,請參閱《AWS Elastic Beanstalk 平台指南》中的 Ruby 平台歷史記錄。如需最新 Puma 版本的詳細資訊,請參閱 Puma.io 網站。如果兩個 Puma 版本不同,請使用以下選項之一:

  • 使用之前 rails new 命令安裝的 Puma 版本。在這種情況下,您必須新增 Procfile 供平台使用,這樣平台才能使用自己提供的 Puma 伺服器版本。如需詳細資訊,請參閱使用 Elastic Beanstalk 上的 Procfile 設定應用程式程序。

  • 更新 Puma 版本,使其與您環境的 Ruby 平台版本上預先安裝的版本相同。若要這麼做,請在專案來源根目錄修改 Gemfile 中的 Puma 版本。然後執行 bundle update。如需詳細資訊,請參閱 Bundler.io 網站上的套件更新頁面。

在本機上執行預設的專案,以測試您的 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) 呈現內容。

我們需要更新 Gemfile.lock,讓 Elastic Beanstalk 能在 Ruby 平台上成功部署應用程式。Gemfile.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 主控台 ,然後在區域清單中選取您的 AWS 區域。

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

    注意

    如果您有許多環境,請使用搜尋列來篩選環境清單。

  3. 在導覽窗格中,選擇組態

  4. 更新、監控和日誌記錄組態類別中,選擇編輯

  5. 向下捲動至環境屬性

  6. 選取新增環境屬性

  7. 輸入屬性名稱對。

  8. 如果需要新增更多變數,請重複步驟 6步驟 7

  9. 若要儲存變更,請選擇頁面底部的儲存變更

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

部署您的應用程式

建立原始碼套件,其中包含 Rails 所建立的檔案。以下命令建立一個名為 rails-default.zip 的原始碼套件。

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

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

若要部署原始碼套件
  1. 開啟 Elastic Beanstalk 主控台 ,然後在區域清單中選取您的 AWS 區域。

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

    注意

    如果您有許多環境,請使用搜尋列來篩選環境清單。

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

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

  5. 選擇 Deploy (部署)。

  6. 部署完成時,您可以選擇網站URL,在新索引標籤中開啟您的網站。

清除

當您完成使用 Elastic Beanstalk 時,即可終止您的環境。Elastic Beanstalk 會終止與環境相關聯的所有 AWS 資源,例如 Amazon EC2執行個體資料庫執行個體 負載平衡器 、安全群組和警示

從主控台終止您的 Elastic Beanstalk 環境
  1. 開啟 Elastic Beanstalk 主控台 ,然後在區域清單中選取您的 AWS 區域。

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

    注意

    如果您有許多環境,請使用搜尋列來篩選環境清單。

  3. 選擇 Actions (動作),然後選擇 Terminate Environment (終止環境)。

  4. 使用畫面顯示對話方塊來確認環境終止。

您可以使用 Elastic Beanstalk,隨時輕鬆地為您的應用程式建立新環境。

後續步驟

如需 Rails 的詳細資訊,請瀏覽 rubyonrails.org

隨著您繼續開發應用程式,您可能會希望無須手動建立 .zip 檔案並將其上傳至 Elastic Beanstalk 主控台,即可管理環境和部署應用程式。Elastic Beanstalk 命令列介面 (EB CLI) 提供 easy-to-use從命令列建立、設定和部署應用程式至 Elastic Beanstalk 環境的命令。

最後,如果您計劃在生產環境中使用應用程式,則需要為環境設定自訂網域名稱,啟用 HTTPS 以進行安全連線。