Skip to content

Instantly share code, notes, and snippets.

@jk195417
Created March 16, 2017 13:21
Show Gist options
  • Save jk195417/37dfb872525795c345cba550f13444c0 to your computer and use it in GitHub Desktop.
Save jk195417/37dfb872525795c345cba550f13444c0 to your computer and use it in GitHub Desktop.
EC2 + RDS,然後使用 Elastic Beanstalk 部署 Rails 應用程式

部署 Rails app 至 Amazon web services

EC2 + RDS + EB,使用 Elastic Beanstalk 部署應用程式

版本訊息

  • 作業系統 macOS Sierra 10.12.3
  • Ruby 2.3
  • Rails 5.0.1
  • MySQL 5.7.16

開始使用 Amazon web services

  1. 註冊帳號
  2. 信箱認證
  3. 填寫信用卡認證身份

Elastic Beanstalk

Elastic Beanstalk 能方便我們在AWS上部署應用程式,透過與 git 結合,將 git commit 後的應用程式部署至 AWS 的 EC2 instance上。

讓部署 Rails 至 AWS 像部署至 Heroku 一樣輕鬆。

安裝 Elastic Beanstalk

透過 mac 上的套件管理工具 brew 來安裝 aws-elasticbeanstalk

$ brew update
$ brew install aws-elasticbeanstalk

透過 Elastic Beanstalk 部署應用程式

前置準備

首先進入你要部署的應用程式專案根目錄執行初始化,填寫幾個問題讓 EB 知道我們要部署到哪裡。

沒有 aws-access-idaws-secret-key 的人,可以前往 Services > IAM > Users > Add user 然後添加權限,我是給下面兩條權限:

  • AWSCodeBuildDeveloperAccess
  • AWSElasticBeanstalkFullAccess
$ cd to/your/project/folder
$ eb init

# 選擇server實際位置,選個離你近一點的城市吧!
Select a default region
1) us-east-1 : US East (N. Virginia)
2) us-west-1 : US West (N. California)
3) us-west-2 : US West (Oregon)
4) eu-west-1 : EU (Ireland)
5) eu-central-1 : EU (Frankfurt)
6) ap-south-1 : Asia Pacific (Mumbai)
7) ap-southeast-1 : Asia Pacific (Singapore)
8) ap-southeast-2 : Asia Pacific (Sydney)
9) ap-northeast-1 : Asia Pacific (Tokyo)
10) ap-northeast-2 : Asia Pacific (Seoul)
11) sa-east-1 : South America (Sao Paulo)
12) cn-north-1 : China (Beijing)
13) us-east-2 : US East (Ohio)
14) ca-central-1 : Canada (Central)
15) eu-west-2 : EU (London)
(default is 3):

# 第一次使用EB 必須先填入你的 AWS access-id 跟 secret-key
You have not yet set up your credentials or your credentials are incorrect
You must provide your credentials.
(aws-access-id):
(aws-secret-key):

# 填寫應用程式的名字
Enter Application Name
(default is "your folder name"):

# 是否使用 Ruby Yes
It appears you are using Ruby. Is this correct?
(Y/n):

# 選擇你的應用程式的 Ruby 版本
Select a platform version.
1) Ruby 2.3 (Puma)
2) Ruby 2.2 (Puma)
3) Ruby 2.1 (Puma)
4) Ruby 2.0 (Puma)
5) Ruby 2.3 (Passenger Standalone)
6) Ruby 2.2 (Passenger Standalone)
7) Ruby 2.1 (Passenger Standalone)
8) Ruby 2.0 (Passenger Standalone)
9) Ruby 1.9.3
(default is 1):

# AWS自己推的版本控制,我是沒有用拉,用git就好
Note: Elastic Beanstalk now supports AWS CodeCommit; a fully-managed source control service. To learn more, see Docs: https://aws.amazon.com/codecommit/
Do you wish to continue with CodeCommit? (y/N) (default is n):

# 若是需要(通常都會需要) ssh 進去你的 EC instance,選錯了也沒關係,以後透過EC管理介面打開就好
Do you want to set up SSH for your instances?
(Y/n):

Select a keypair.
1) [ Create new KeyPair ]
(default is 1): 1

初始化結束後,它會在專案資料夾下建立一個新資料夾與你剛剛填的資訊, .elasticbeanstalk/config.yml。

建立應用程式的環境為 production

$ eb create production

這會新建一個 EC instance,並且自動配置系統環境。

設定 RDS 與 EC instance

目前應用程式是沒有資料庫的,所以我們需要幫他建立一個。

  1. 前往aws.amazon.com的管理介面
  2. 進入 Services > Database > RDS > instances
  3. 點選 Launch DB instance 選取你要的DB(我們這次使用MySQL),VPC Security Groups 選 Create new Security Group 並啟用。

注意一下 AWS 的免費方案限制,如果你想使用免費的DB的話。

  1. 回到 RDS > instances 展開你剛剛建立的 DB,查看 Configuration Details > Security Groups,把 Group Name 記下來(ex: rds-launch-wizard)
  2. 點一下連結至 Security Groups 的管理頁面,Inbound > Edit > Add Role,Type 選擇你用的DB(MYSQL/Aurora),Protocol TCP,Port Range 用你的DB port(預設是 3306),Sourse 用剛剛的 Security Group。

可以參考這篇文章 https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/AWSHowTo.RDS.html?icmpid=docs_elasticbeanstalk_console

  1. 前往 EC2 > instances 找到你剛剛透過 EB 建立的 EC instance,右鍵 > Networking > Change Security Groups, 把剛剛記著的Security Group 打勾儲存。這樣一來,我們的應用程式的instance就有權限連結RDS了。

環境變數

環境變數可以透過命令列或是 AWS Console 設定。
例如以下設定參數的範例

eb setenv Key=value

也可以透過命令列把當前所有環境變數印出來

$ eb printenv

接著我們要設置應用程式會用到的環境變數,像是通常 Rails 會用到的 SECRET_KEY_BASE 以及與DB連結用的環境變數: RDS_DB_NAME RDS_USERNAME RDS_PASSWORD RDS_HOSTNAME RDS_PORT

我們來產生一個新的 SECRET_KEY_BASE,用於 production 環境

eb setenv SECRET_KEY_BASE=$(rails secret)

設定DB相關參數,先至 RDS > instances > 使用的 DB > Configuration Details,把相關參數以上述方法設置:

  • RDS_DB_NAME 對應至 DB Name
  • RDS_USERNAME 對應至 Username
  • RDS_PASSWORD 對應至 當初建立DB時填的 Master Password
  • RDS_HOSTNAME 對應至 Endpoint
  • RDS_PORT 對應至 Port

Services > Elastic Beanstalk > 本次的EB > 配置 > 軟件配置 > 環境屬性,這裡也能設定環境變數

設定 Rails app 的 production 配置

最重要的就是,config/database.yml
讓我們的應用程式在 production 模式下能正確的連結至 DB

config/database.yml

production:
  adapter: mysql2
  encoding: utf8
  database: <%= ENV['RDS_DB_NAME'] %>
  username: <%= ENV['RDS_USERNAME'] %>
  password: <%= ENV['RDS_PASSWORD'] %>
  host: <%= ENV['RDS_HOSTNAME'] %>
  port: <%= ENV['RDS_PORT'] %>

部署應用程式

在開始部署應用程式前,用 git 存檔

$ git commit -m "deploy to aws"

接著開始部署

$ eb deploy

只需要輸入一行指令,EB就會自動幫你做很多事了:

  1. 將 project 壓縮成 zip 上傳
  2. 解壓縮至 /var/app/ondeck
  3. DB migrate
  4. CSS pre-compile
  5. 將處理好的 project 移至 /var/app/current
  6. Start Server

以後程式更新後,想要部署也只需要:

$ git commit -m "your common"
$ eb deploy

想更詳細暸解 EB 幫你做了什麼事,可以查看 log

$ eb ssh
$ cat /var/log/eb-activity.log

常用 eb 指令

初始化專案

$ eb init

透過EB建立 EC instance 與新環境

$ eb create environment

部署

$ eb deploy

開啟 app 的網址

$ eb open

ssh進去 EC instance

$ eb ssh

變更 AWS account

AWS account 記錄在 ~/.aws/config.yml 內,第一次使用EB時,詢問的 aws_access_key_idaws_secret_access_key 會被放置在此,預設為 eb-cli profile。

~/.aws/config.yml

[profile eb-cli]
aws_access_key_id = XXXXXXXXXXXXX
aws_secret_access_key = XXXXXXXXXXXX

在下方建立一個名為 user 的 profile

~/.aws/config.yml

[profile eb-cli]
aws_access_key_id = XXXXXXXXXXXXX
aws_secret_access_key = XXXXXXXXXXXX

[profile user]
aws_access_key_id = XXXXXXXXXXXXX
aws_secret_access_key = XXXXXXXXXXXX

並且在初始化時使用此 profile 當作我們的 AWS account

$ eb init --profile user

參考

  1. https://hackernoon.com/how-to-setup-and-deploy-a-rails-5-app-on-aws-beanstalk-with-postgresql-redis-and-more-88a38355f1ea#.m22limcy7
  2. https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/AWSHowTo.RDS.html?icmpid=docs_elasticbeanstalk_console
  3. http://stackoverflow.com/questions/29190202/how-to-change-the-aws-account-using-the-elastic-beanstalk-cli
  4. http://sebastien.saunier.me/blog/2015/10/20/aws-elastic-beanstalk-commands-for-rails.html
@fbukevin
Copy link

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment