AWS EC2 部署過程

在剛接觸 Rails 部署時,我想應該都是從 Heroku 開始學習,對新手來說,Heroku 的輕量部署是非常容易上手的。市面上,除了 Heroku 以外,還有很多部署工具,像是 AWS、Microsoft Azure、Google Cloud 等。今天這篇主要是想要多瞭解 AWS EC2 的部署步驟,需要做些什麼事情而寫,一些詳細的設定就不在本篇多做解說。

AWS CLI ( Command Line Interface )

aws cli 是在操作終端機 aws 指令,使用 aws 服務時,必須先安裝並設定好的應用程式介面,好讓使用者可以在終端機上操作 aws 指令,與 aws server 進行溝通。

建立 AWS EC2 Instance ( 執行個體 )

EC2 Instance 是本次部署的主角之一,它是一個 server 的概念,建立 EC2 instance 後,我們會透過 ssh 或 mssh 連進建好的 EC2 instance server,並在該 server 裡開始進行部署。

  1. 首先,進入 EC2 服務,並啟動新執行個體
  2. 填寫並選擇執行個體的相關資料、作業系統、金鑰對、安全群組
    a. 作業系統:
    要留意不同的作業系統所提供的軟體工具包會各別有所差異,像是 Amazon Linus 2 的 glibc 版本最高只提供到 2.26,而 Amazon Linux 2023 的 PG 版本也只提供到 9.x,導致在部署過程中因作業系統提供的 package 版本造成相容性問題並吃了不少苦。
    b. 金鑰對:
    這是為了讓使用者能透過 ssh 或 mssh 連線到 EC2 instance,所必須要建立的 key,建立後會提供 xxx.pem ,請好好保管。
    c. 安全群組:
    此為 EC2 instance 自身權限管理的自定義規則,使用者可以決定 EC2 instance 能夠處理什麼請求、進行什麼連線等。
  3. 按下啟動執行個體,便會開始建立 EC2 instance,並開始初始化,等到狀態檢查出現綠色字樣的檢查通過後,代表 EC2 instance 已建立完成並已運作中。

連線進 AWS EC2 Instance

建立好要用來部署的 EC2 instance 後,接著要進入 instance server 才能開始部署我們的 Rails。

  1. mssh
1
2
3
$ mssh 執行個體ID

ex: mssh i-Oabc123foobar
  1. ssh
1
2
$ ssh -i 金鑰對pem檔路徑 作業系統使用者@公有IPv4
ex: ssh -i /Users/mike/Desktop/keys/rails_project.pem ec2-user@12.222.31.102

在 EC2 Instance server 裡設定 Rails 相依環境、套件

在上面步驟有解釋到 EC2 instance 裡基本上是一個 server,講白話點就是一台新的電腦,裡面什麼都沒有,所以必須要安裝執行 Rails 時所需的應用程式與套件。

以下以 Amazon Linux 2023 為例:

  1. 先更新作業系統的套件管理工具 DNF
1
sudo dnf update -y
  1. 安裝並啟用 rvm
1
2
curl -sSL https://get.rvm.io | bash -s stable
source ~/.rvm/scripts/rvm
  1. 安裝 ruby
1
2
3
4
sudo rvm install 3.1.4
sudo rvm use 3.1.4 --default

ruby -v
  1. 安裝 Node.js 和 Yarn
1
2
3
4
curl -sL https://rpm.nodesource.com/setup_16.x | sudo -E bash -
curl --silent --location https://dl.yarnpkg.com/rpm/yarn.repo | sudo tee /etc/yum.repos.d/yarn.repo

sudo yum install -y nodejs yarn
  1. 安裝 rails
1
2
3
gem install rails

rails -v
  1. 安裝 database
1
sudo dnf install database_name

ps. 若使用 AWS RDS 則無需在 EC2 instance 內安裝 database 應用程式,但 rails 裡仍需要有資料庫的 gem !
ps. 要留意 EC2 instance 的作業系統中,是否有符合需求版本的資料庫,否則另外串 AWS RDS 會簡單很多

將 Rails 專案 clone 到 EC2 instance

AWC EC2 部署有 docker 與 github 兩種方式進行部署,本篇以 github 作部署。

跟一般在本機開發時一樣,當 git clone rails project 到本機上,必須執行 bundle install、rails db:create、migrate、rails assets:precompile,所以同樣在 EC2 instance 的 rails project 也要執行。

在執行 db create migrate 時要注意環境:

1
RAILS_ENV=production rails db:create

使用 Nginx 與 Puma

當 Rails 都處理好之後,接下來就是要讓外部使用者能夠連進 rails server,這部分需要透過:

  1. Nginx 負責將外部請求轉發到 rails server,讓 rails server 能接收並回應。
  2. Puma 負責作為 rails 的 server。 ( 這部分也可以用 passenger,主要是 Amazon Linux 2023 沒有 passenger )

安裝好後,要把 Nginx 與 Puma 設定好,其中 Nginx 裡在設定 server_name 時,要用 EC2 instance 的公有IPv4地址。

設定完成後,就是用「公有IPv4地址」的 IP 來連進部署在 EC2 instance 的 rails project。
若 Nginx 沒有設定好,則會得到 502 bad getway。

希望透過這篇文章能讓新接觸 AWS 部署的讀者們對部署過程有個基本的認識。