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 裡開始進行部署。
- 首先,進入 EC2 服務,並啟動新執行個體
- 填寫並選擇執行個體的相關資料、作業系統、金鑰對、安全群組
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 能夠處理什麼請求、進行什麼連線等。 - 按下啟動執行個體,便會開始建立 EC2 instance,並開始初始化,等到狀態檢查出現綠色字樣的檢查通過後,代表 EC2 instance 已建立完成並已運作中。
連線進 AWS EC2 Instance
建立好要用來部署的 EC2 instance 後,接著要進入 instance server 才能開始部署我們的 Rails。
- mssh
1 | $ mssh 執行個體ID |
- ssh
1 | $ ssh -i 金鑰對pem檔路徑 作業系統使用者@公有IPv4 |
在 EC2 Instance server 裡設定 Rails 相依環境、套件
在上面步驟有解釋到 EC2 instance 裡基本上是一個 server,講白話點就是一台新的電腦,裡面什麼都沒有,所以必須要安裝執行 Rails 時所需的應用程式與套件。
以下以 Amazon Linux 2023 為例:
- 先更新作業系統的套件管理工具 DNF
1 | sudo dnf update -y |
- 安裝並啟用 rvm
1 | curl -sSL https://get.rvm.io | bash -s stable |
- 安裝 ruby
1 | sudo rvm install 3.1.4 |
- 安裝 Node.js 和 Yarn
1 | curl -sL https://rpm.nodesource.com/setup_16.x | sudo -E bash - |
- 安裝 rails
1 | gem install rails |
- 安裝 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,這部分需要透過:
- Nginx 負責將外部請求轉發到 rails server,讓 rails server 能接收並回應。
- 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 部署的讀者們對部署過程有個基本的認識。