+86 135 410 16684Mon. - Fri. 10:00-22:00

使用Deploy WordPress using Elastic Beanstalk

使用Deploy Wordpress using Elastic Beanstalk

使用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 範圍

安裝步驟

  1. 建立 RDS
  2. 準備 WordPress 設定檔
  3. 上傳 Application version
  4. 建立 EB Environment
  5. 測試
  6. 建立 DNS

1. 建立 RDS

建立一個 RDS MySQL 測試用,注意 Subnet GroupSecurity Group 的設定。這裡為了方便測試,打開 RDS 的 Public Access,但是 Security Group 套用的是 Protected Level.

rds_01
rds_02

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
#!/bin/bash
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

  1. 建立一個 EB Application,取名為 WordPress
  2. 點選 WordPress Application –> 點選 Application version –> 點選右上角的 Upload
  3. 把前一個步驟壓縮的 wordpress_b20170716-1825.zip 上傳,並且命名為 wordpress_b20170716-1825

4. 建立 EB Environment

  1. 點選右上角的 Actions -> Create environment
    • env name: wp-1-1-1-prod
    • domain: wp-1-1-1-prod
      01_create-env
  2. Basic Config:
    • Platform: PHP
    • Application code: existing version – wordpress_b20170716-1825
      01-1_basic_config
  3. 點選 confirure more options, 不要點選 Create environment
    01-2_config-more-options
  4. Software Settings
    • 開啟 CloudWatch Logs
    • 設定 Environment Properties, 加入四個在 wp-config.php 設定的變數,都是 RDS_ 開頭的
      02_software-settings
  5. Auto Scaling: 把 Single instance 改成 ASG. max/min 先設定 1 就好。
    03_asg
  6. 設定 Scaling out 的條件
    03-2_tigger
  7. 設定 EC2 Instance Type, 為了省錢,改為 t2.nano
    03-1_instance
  8. 設定 EC2 的 IAM Role, KeyPair. 為了之後 Debug 先指定一把 keypair.
    04_security
  9. 指定 VPC, 設定 ELB, EC2 的 Subnet. 這邊為了方便測試,都用 Public Subnets
    05_vpc
  10. 指定 EC2 跑起來時要使用的 Security Group, 為了方便測試選擇 Private-Default-EC2Protoected-Default-EC2
    05-1_sg
  11. 建立 EB Environment, 這會需要花一點時間。
    06_create-eb-env
  12. EB 是用 CloudFormation 實作,這時候切換去 CFM 可以看到整個進度:
    06-1_cfm

5. 測試

順利的話,經過一段時間就可點選 URL 測試,正常會出現以下畫面:

07-test

把資料填一填,Wordpress 就可以使用了。

6. 建立 DNS (Route53)

在 Route53 設定 A Record,選擇 alias 可以直接關連到 EB.

08_Bind-dns

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 很重要。