EC2
+ RDS
+ EB
,使用 Elastic Beanstalk 部署應用程式
- 作業系統 macOS Sierra 10.12.3
- Ruby 2.3
- Rails 5.0.1
- MySQL 5.7.16
- 註冊帳號
- 信箱認證
- 填寫信用卡認證身份
Elastic Beanstalk 能方便我們在AWS上部署應用程式,透過與 git
結合,將 git commit
後的應用程式部署至 AWS 的 EC2 instance上。
讓部署 Rails 至 AWS 像部署至 Heroku 一樣輕鬆。
透過 mac 上的套件管理工具 brew
來安裝 aws-elasticbeanstalk
$ brew update
$ brew install aws-elasticbeanstalk
首先進入你要部署的應用程式專案根目錄執行初始化,填寫幾個問題讓 EB
知道我們要部署到哪裡。
沒有 aws-access-id
與 aws-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,並且自動配置系統環境。
目前應用程式是沒有資料庫的,所以我們需要幫他建立一個。
- 前往aws.amazon.com的管理介面
- 進入 Services > Database > RDS > instances
- 點選 Launch DB instance 選取你要的DB(我們這次使用MySQL),VPC Security Groups 選 Create new Security Group 並啟用。
注意一下 AWS 的免費方案限制,如果你想使用免費的DB的話。
- 回到 RDS > instances 展開你剛剛建立的 DB,查看 Configuration Details > Security Groups,把 Group Name 記下來(ex: rds-launch-wizard)
- 點一下連結至 Security Groups 的管理頁面,Inbound > Edit > Add Role,Type 選擇你用的DB(MYSQL/Aurora),Protocol TCP,Port Range 用你的DB port(預設是 3306),Sourse 用剛剛的 Security Group。
- 前往 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 NameRDS_USERNAME
對應至 UsernameRDS_PASSWORD
對應至 當初建立DB時填的 Master PasswordRDS_HOSTNAME
對應至 EndpointRDS_PORT
對應至 Port
Services > Elastic Beanstalk > 本次的EB > 配置 > 軟件配置 > 環境屬性,這裡也能設定環境變數
最重要的就是,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
就會自動幫你做很多事了:
- 將 project 壓縮成 zip 上傳
- 解壓縮至 /var/app/ondeck
- DB migrate
- CSS pre-compile
- 將處理好的 project 移至 /var/app/current
- Start Server
以後程式更新後,想要部署也只需要:
$ git commit -m "your common"
$ eb deploy
想更詳細暸解 EB
幫你做了什麼事,可以查看 log
$ eb ssh
$ cat /var/log/eb-activity.log
初始化專案
$ eb init
透過EB
建立 EC instance
與新環境
$ eb create environment
部署
$ eb deploy
開啟 app 的網址
$ eb open
ssh進去 EC instance
$ eb ssh
AWS account 記錄在 ~/.aws/config.yml 內,第一次使用EB
時,詢問的 aws_access_key_id
跟 aws_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
- https://hackernoon.com/how-to-setup-and-deploy-a-rails-5-app-on-aws-beanstalk-with-postgresql-redis-and-more-88a38355f1ea#.m22limcy7
- https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/AWSHowTo.RDS.html?icmpid=docs_elasticbeanstalk_console
- http://stackoverflow.com/questions/29190202/how-to-change-the-aws-account-using-the-elastic-beanstalk-cli
- http://sebastien.saunier.me/blog/2015/10/20/aws-elastic-beanstalk-commands-for-rails.html
我覺得這篇很適合作為補充參考
https://www.quora.com/What-are-the-pros-and-cons-of-migrating-from-Heroku-to-Amazons-Elastic-Beanstalk