使用 Serverless 構建獨立站的優勢
在傳統架構模式下,如果需要進行電商大促需要提前預置計算資源以支撐高併發訪問,會造成計算資源浪費並且增加運維工作量。本文介紹一種新的部署方式,將 WordPress 和 WooCommerce 部署在 Amazon Lambda 中。Lambda 是無服務器的計算方式,無需預置資源就可以運行代碼,自動響應任何規模的代碼執行請求,從每天十幾個事件到每秒數十萬個事件,按計算時間付費(以毫秒為單位),真正做到按使用量計費,從而達到節省預置資源和運維成本。Lambda 的這種特性,讓 Lambda 越來越受歡迎,越來越多的客户選擇 Lambda 來部署應用,其中也包含 web 應用。瞭解 Lambda 的客户可能清楚,Lambda 是基於事件觸發的方式,對於 web 應用,需要使用 API Gateway,接收 HTTP 請求,把 HTTP 請求轉化為 Lambda 事件觸發 Lambda 運行。
| 亞馬遜雲科技開發者社區為開發者們提供全球的開發技術資源。這裏有技術文檔、開發案例、技術專欄、培訓視頻、活動與競賽等。幫助中國開發者對接世界最前沿技術,觀點,和項目,並將中國優秀開發者或技術推薦給全球雲社區。如果你還沒有關注/收藏,看到這裏請一定不要匆匆劃過,點這裏讓它成為你的技術寶庫! |
在以前,對於已有的 Web 應用,需對應用代碼進行輕量級的改造以處理 Lambda 事件。對於很多使用像 WordPress 和 WooCommerce 這樣的成熟組件的電商客户來講,進行代碼改造不太可能,是不是就不能利用 Lambda 的優勢了呢?答案是否定的。利用 Lambda 的新功能 Lambda container images 和開源組件 Amazon Lambda adapter 可以讓 WordPress 在 Lambda 中運行且無需進行任何代碼的修改。本解決方案通過將 Lambda Adapter,WordPress,WooCommerce 以及其他必要插件打包成容器,部署到 Lambda。同時本解決方案也利用了 Lambda 的新功能,Function URL,來代替 API Gateway,可以直接通過Function URL 來通過 HTTP(s) 訪問 Lambda,從而節省 API Gateway 帶來的成本。用户的動態請求,通過 CloudFront 回源到 Lambda URL 觸發 Lambda 運行,在 Lambda 內部,Lambda Adapter 接收到 Lambda 事件並將其轉換成 WordPress 能處理的 HTTP 請求。這樣就實現了無需修改代碼就能在 Lambda 中運行 WordPress。
本文着重介紹 Lambda container image 和 Lambda Function URL,關於 Lambda Adapter 的實現細節請參考這篇博客。
Lambda container image
要將容器運行在 Lamabda,容器映像需包含運行時 API 的 runtime interface clients,用於管理 Lambda 和函數代碼之間的交互。客户可以自行將 runtime interface client 包含在自己的映像以支持在 Lambda 運行。Amazon 提供了一組可用於創建容器映像的開源基礎映像。這些基本映像包括runtime interface clients 。Lambda 映像是隻讀的,但函數代碼可以訪問具有 512 MB 存儲空間的可寫 /tmp 目錄。本方案使用 Docker 來創建映像。Dockerfile 裏使用 Amazon 提供的基礎映像Amazon Linux 2,並使用 bedrock 來管理 WordPress 和插件的安裝。本方案中預配置了一些必要插件,客户可以修改 bedrock 的配置添加所需要的插件。
Lambda Function URL
現在可以通過創建 Function URL,支持使用 HTTP(s) 來訪問這個 URL 來觸發 Lambda 運行。在 Function URL 這個功能沒有發佈的時候,基於 Lambda 構建 Web 應用需要結合 API Gateway 來接收 HTTP(s) 請求。但是在 Lambda 上部署 WooCommerce 的場景下,因為是把 WordPress 等打包成一個容器,因此只需要單個 Lambda Function,API gateway 的作用只是把 HTTP 請求轉化為 Lambda 事件,而 API Gateway 提供的高級功能,例如 API 管理,請求驗證等,並不需要。因此有了 Function URL 的功能,就能夠取代 API Gateway 在此場景下的作用,並且不會增加 Lambda 的費用,同時也節省了 API Gateway 的費用。
負載測試
在上一篇博客的基礎上,我們使用 WordPress 的插件 Blocksy 快速構建一個 Starter Site,並使用這個 Site 來作為測試對象。
本方案已經開源在 Github,訪問此 [Repo] (https://github.com/aws-samples/serverless-WooCommerce-workshop)可獲。得完整代碼
在 test/k6文件夾內,本方案也提供了進行性能測試的 k6腳本。模擬了用户進入主頁,選擇商品,並加入購物車,更新地址,到提交訂單的完整流程。具體説明參考 test/readme.md 文件。
main.js 作為測試的入口文件,模擬了前5分鐘100個用户在線,中間10分鐘1000個用户在線,後5分鐘100個用户在線的場景。讀者可根據測試需要修改 main.js 文件。
因為默認 CDK 模版預置的 RDS Aurora mysql 實例和 Elasticahe Redis cluster 規模過小,不適合用來做測試。這裏修改 CDK 代碼cdk/lib/woocommerce-stack.ts,將 RDS Aurora mysql 的 r5.4xlarge。Elasticahe Redis cluster 修改為 r5.xlarge。客户也可以自行改大規模進行更大範圍的測試。
通過以下命令更新資源。
make diff
make deploy
在這裏我們使用一台 c5.xlarge 的 Amazon Linux 2 EC2來進行測試。並安裝 CloudWatch Agent,將 k6生成的指標上傳到 CloudWatch 進行可視化。注意 EC2需要有權寫入 CloudWatch Metrics,這裏我們使用 EC2 Role 來賦予權限。通過創建 Role,選擇下圖的託管策略 CloudWatchAgentAdminPolicy,並且把這個 Role 綁定給EC2。
通過以下命令安裝、配置 k6和 CloudWatch Agent,並運行 k6進行測試。
sudo yum -y install https://dl.k6.io/rpm/repo.rpm
sudo yum -y install --nogpgcheck k6
sudo yum -y install git
git clone https://github.com/aws-samples/serverless-woocommerce-workshop.git
cd ~/serverless-woocommerce-workshop/test/k6
sudo yum install -y amazon-cloudwatch-agent
cat << EOF > cw-statsd.json
{
"metrics": {
"namespace": "k6",
"metrics_collected": {
"statsd": {
"service_address": ":8125",
"metrics_collection_interval": 1,
"metrics_aggregation_interval": 0
}
}
}
}
EOF
sudo amazon-cloudwatch-agent-ctl -a fetch-config -m ec2 -s -c file:./cw-statsd.json
K6_STATSD_ENABLE_TAGS=true k6 run --out statsd -e HOSTNAME=<your WooCommerce website domain name> main.js
下圖是 k6測試運行完的統計結果。
在 CloudWatch 的 k6 metrics 中能看到每秒完成的訂單數和 Lambda 的併發量。可以看出,隨着隨着請求/訂單量的增加,Lambda 會自動進行擴展。可以看出,Lambda 能夠應對對於流量的高低峯,無需任何運行操作。
總結
本篇博客在上一篇的基礎上,介紹了 Serverless 建站方案的優勢,並對基於 Serverless 服務的 WordPress 進行負載測試,能夠看出 Lambda 能夠自動應對流量高低峯而無需任何運維操作,大大節省運維成本。讀者也可以根據自身需求,修改測試腳本,進行更大規模的性能測試。
附錄
* 基於亞馬遜雲科技無服務器服務快速搭建電商平台——部署篇
- 無服務器獨立站工作坊:https://catalog.workshops.aws/serverless-woocommerce/zh-CN?tr...
- Github code:https://github.com/aws-samples/serverless-woocommerce-workshop?trk=cndc-detail
本篇作者
汪其香 Amazon 解決方案架構師,負責基於 Amazon 雲計算方案的架構諮詢和設計實現,具有豐富的解決客户實際問題的經驗,同時熱衷於深度學習的研究與應用。
許昌月 Amazon 解決方案架構師,負責基於 Amazon 的雲計算方案架構諮詢和設計,實施和推廣,擅長軟件開發,具有豐富的解決客户實際問題的經驗。
文章來源:https://dev.amazoncloud.cn/column/article/630b30932ecbae73705...