使用Deploy WordPress using Elastic Beanstalk
Elastic Beanstalk 基本概念
Elastic Beanstalk (以下簡稱 EB) 是 AWS 的 PaaS (platform as a service) 服務,概念類似於以前 Cloud9 或者 Parse 線上 IDE + Backend Server ,開發者只要專注把應用程式開發好,透過 CLI or Console 就可以快速部署、測試、Blue/Green Deployment。
EB 透過 CloudFormation 整合了 AWS 主要的核心服務,包含了以下:
- VPC
- EC2
- ELB
- Auto Scaling Group
- S3
- CloudWatch
- RDS
- Route53
- CloudFormation
- SQS
EB 提供了很多語言標準化的部屬環境,像是 Java, C#, Node.js, PHP, Golang, Python, Ruby, Docker …
Elastic Beanstalk Components
Application
: 一個應用程式邏輯的集合,可以包含多個環境 (Environment)
、版本 (Version)
、環境配置 (environment configurations)
等。Application Version
: 應用程式部署的版本,像是 java war, zip 等。Environment
: 提供不同環境的設定,通常會用來配置開發、測試、等不同的環境。Environment Configuration
: 環境配置,儲存了環境設定的資訊,像是 VPC, EC2, ASG … 等
Deploy WordPress using Elastic Beanstalk
準備作業
如果是使用個人的 AWS Account,成本考量通常 VPC 不會自己配置 NAT Gateway / Instance (除非你是自己開公司),所以為了測試方便,先確認以下:
- VPC:
- 有兩個以上
Public Subnet
, 用來放 EC2 使用的. (本 Lab 為了方便,所以放在 Public Subnet, 實務上應該放 Private Subnet) - 有兩個以上
Private Subnet
: 用來放 RDS instance - Network ACLs 已經打開, 確認 Public/Private Subnet 都有開
- 有兩個以上
- Security Group: 設定以下三個
Private-Default-EC2
: 設定一個 Security Group 允許 VPC 內部可以存取. RDS 選這個Protected-Default-EC2
: 設定一個允許自己工作環境可以存取Public-Default-EC2
: 允許 WAN 都可以連線
VPC and Security Group 的設計與規劃, 參閱: Plan and Design Multiple VPCs in Different Regions
- 建立好一把 EC2 KeyPair
- RDS
- 為 RDS 建立一個 subnet group, 選 private subnet. 如果想要從外面連進去,那麼就放 Public Subnet
- 建立 Seuciry Groups, 設定 VPC CIDR 範圍
安裝步驟
- 建立 RDS
- 準備 WordPress 設定檔
- 上傳 Application version
- 建立 EB Environment
- 測試
- 建立 DNS
1. 建立 RDS
建立一個 RDS MySQL 測試用,注意 Subnet Group
, Security Group
的設定。這裡為了方便測試,打開 RDS 的 Public Access,但是 Security Group 套用的是 Protected
Level.
2. 設定 WordPress
到 WordPress 下載最新版本,複製 wp-config-sample.php
改名為 wp-config.php
,
修改資料庫連線,改成如下:
1
2
3
4
|
define(‘DB_NAME’, $_SERVER[“RDS_DB_NAME”]);
define(‘DB_USER’, $_SERVER[“RDS_USERNAME”]);
define(‘DB_PASSWORD’, $_SERVER[“RDS_PASSWORD”]);
define(‘DB_HOST’, $_SERVER[“RDS_HOSTNAME”]);
|
產生認證唯一金鑰設定: https://api.wordpress.org/secret-key/1.1/salt/
,點選 link 產生內容,可以把這個內容放到 wp-config.php
或者透過環境變數傳入。
1
2
3
4
5
6
7
8
|
define(‘AUTH_KEY’, ‘YvnSl)~ >uq*****************************************************’);
define(‘SECURE_AUTH_KEY’, ‘VYO{e*OX&dO*****************************************************’);
define(‘LOGGED_IN_KEY’, ‘+)[ba79A,Bl*****************************************************’);
define(‘NONCE_KEY’, ‘!hg–^gcw`{*****************************************************’);
define(‘AUTH_SALT’, ‘MGR1|gqknFZ*****************************************************’);
define(‘SECURE_AUTH_SALT’, ‘e~|+EbTq*dK*****************************************************’);
define(‘LOGGED_IN_SALT’, ‘BjG}k x4L`-*****************************************************’);
define(‘NONCE_SALT’, ‘,~<E,W@_-=v*****************************************************’);
|
建議透過環境變數傳入,這裡為了方便,直接把整個放入 wp-config.php
把 wordpress 壓縮,要注意的是,是要把整包放入壓縮檔,不要另外建立 wordpress 目錄,以下是我的壓縮方式:
1
2
3
4
5
6
7
8
|
TS=`date +%Y%m%d-%H%M`
IMAGE_NAME=“wordpress_b${TS}.zip”
rm -rf *.zip
echo $IMAGE_NAME > VERSION.txt
zip -ur ${IMAGE_NAME} *
|
這樣會產生一包 wordpress_b20170716-1825.zip
的壓縮檔,裡面會放一個內容同檔名的檔案 VERSION.txt
,用來作為部署時的版本識別。
3. 上傳 Application version
- 建立一個 EB
Application
,取名為WordPress
- 點選
WordPress
Application –> 點選Application version
–> 點選右上角的Upload
- 把前一個步驟壓縮的
wordpress_b20170716-1825.zip
上傳,並且命名為wordpress_b20170716-1825
4. 建立 EB Environment
- 點選右上角的
Actions
->Create environment
- Basic Config:
- 點選
confirure more options
, 不要點選Create environment
- Software Settings
- Auto Scaling: 把 Single instance 改成 ASG. max/min 先設定 1 就好。
- 設定 Scaling out 的條件
- 設定 EC2 Instance Type, 為了省錢,改為
t2.nano
- 設定 EC2 的 IAM Role, KeyPair. 為了之後 Debug 先指定一把 keypair.
- 指定 VPC, 設定 ELB, EC2 的 Subnet. 這邊為了方便測試,都用 Public Subnets
- 指定 EC2 跑起來時要使用的 Security Group, 為了方便測試選擇
Private-Default-EC2
,Protoected-Default-EC2
- 建立 EB Environment, 這會需要花一點時間。
- EB 是用 CloudFormation 實作,這時候切換去 CFM 可以看到整個進度:
5. 測試
順利的話,經過一段時間就可點選 URL
測試,正常會出現以下畫面:
把資料填一填,Wordpress 就可以使用了。
6. 建立 DNS (Route53)
在 Route53 設定 A Record
,選擇 alias
可以直接關連到 EB.
Debug in EC2
建立過程,如果有發生問題,可以連到 EC2 Instance 裡面找問題,以下是幾個可以檢查的路徑:
/var/log/eb-cfn-init.log
: 確認 EB 可以正常 init.- EB 初始的時候需要連去 S3 下載相關工具
- 如果是網路問題,像是 EC2 Instance 放在 Private Subnet,卻沒有 NAT,那麼這裡就會到 EB 無法對外存取
/var/log/eb-activity.log
: EB 安裝工具的 Log,像是安裝 CloudWatch Log/var/log/cfn-init.log
: EB 是用 CloudFormation 實作,CFM 相關的 Log 會放這裡/var/log/awslogs.log
: 如果有開啟 CloudWatch Log, 相關資訊會在這裡/var/app/current
: 安裝的應用程式會放這裡。WP 解壓所後的資料都在這裡,這個會被 link 到/var/www/html
/etc/elasticbeanstalk
: EB 的設定檔,包含ulimit
/opt/elasticbeanstalk
: EB 應用程式的安裝路徑
我遇到大部分都是 Network Access Control 的問題,所以一開始設定好 Security Group, VPC Public Subnet 很重要。