在前幾天,我們用EC2+Apache+RDS部署了一個小小的動態留言板網站。這種方式很靈活,但缺點是很多東西要自己手動設定,例如:建 EC2、裝 PHP/Apache、上傳程式碼、設定資料庫連線、維護系統更新、伺服器安全性,對新手來說可能會覺得有點複雜。
今天要介紹的 AWS Elastic Beanstalk,就是一個幫你「自動化」這些麻煩事的服務。因為我之前專案的資源都在台北(ap-east-2),但Elastic Beanstalk \目前不支援台北,所以我先用 CLI 示範設定流程並介紹操作步驟。等到後面建立另一個專案我們再來做示範
Elastic Beanstalk(簡稱 EB)是一個 平台即服務(PaaS),意思是,你只要把程式碼(例如 PHP、Node.js、Java、Python)打包丟上去,AWS會自動幫你:
Step1: 確認你有AWS CLI(aws)跟EB CLI(eb)。如果沒有,先安裝:
brew install awsebcli
Step2: 進入專案資料夾
cd ~/Desktop/message-board
Step3: 修改index.php
把資料庫帳號密碼移到環境變數,之前我們的 $host, $db, $user, $pass 都是「寫死在程式碼裡」的,這樣比較危險(如果上傳GitHub就會外流 😱)。我們改成從「環境變數」讀取,Elastic Beanstalk可以設定環境變數,這樣密碼不會留在程式。
getenv()
:更安全,不會把密碼寫死$host = getenv('DB_HOST') ?: 'localhost';
$db = getenv('DB_NAME') ?: 'mydb1';
$user = getenv('DB_USER') ?: 'admin';
$pass = getenv('DB_PASS') ?: 'changeme';
$charset = 'utf8mb4';
$dsn = "mysql:host=$host;dbname=$db;charset=$charset";
$pdo = new PDO($dsn, $user, $pass, [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]);
Step4: 初始化Elastic Beanstalk
第一次使用 EB,需要初始化:
eb init
接下來會問一些問題:
Step5: 建立環境
初始化完畢,建立一個新環境:
eb create message-board-env
這步會花幾分鐘,AWS 幫你建好 EC2、Load Balancer、Security Group。完成後會給你一個網址
Step6: 設定 RDS 連線環境變數
因為程式是透過 getenv() 抓 DB 連線設定,所以要在 EB 環境加上環境變數:
eb setenv DB_HOST=mydb1.c928ymcywg3j.ap-east-2.rds.amazonaws.com DB_NAME=mydb1 DB_USER=admin DB_PASS=你的密碼
(設定完,EB 會自動更新環境)
Step7: 部署程式碼
第一次建立時 EB 已經把程式deploy上去了,之後如果你有修改(例如 PHP 程式),只要再跑:
eb deploy
Step8: 測試留言板
打開 EB 的網址,並嘗試輸入一個留言。
接著連到 RDS 檢查:
mysql -h mydb1.c928ymcywg3j.ap-east-2.rds.amazonaws.com -u admin -p
USE mydb1;
SELECT * FROM messages ORDER BY created_at DESC;
看到你剛輸入的留言,代表部署成功!
其實這些步驟我們都可以在AWS中EC2的Elastic Beanstalk做設定與上傳,這邊是以終端機的設定作為範例,那實際上有這兩種方式可以給大家做參考!