無伺服器化地持續部署一個網站

Serverless 不僅僅是 Function as a Service,廣義上來講,Serverless 是雲計算的一種模式。當一個軟體產品運行時不直接管理機器(無論是物理機還是虛擬機)進行計算、存儲時,便可算是 Serverless 架構。本文以一個構建及部署一個靜態網站為例,介紹下如何無伺服器化的 AWS 服務進行低成本的持續部署(Continuous Deployment,CD)。這個方案可以擴展到動態網站及其他形式的 web applications & services。

本文使用的例子是 A Serverless Pro 站點,使用 Hexo 框架。構建靜態站點有許多高質量的框架,部署 Hexo 靜態站點也有許多簡單高效的方案,本文僅僅是使用 Hexo 作為一個簡單的例子,不討論如 「為什麼不使用 jekyll 做靜態站?」、「為什麼不直接用 Github Pages?」 等問題。

總覽

下圖是最終構建出來的 CD Pipeline。當一個開發者 push 一個新 commit 時,新的改動會被自動構建、部署到 AWS S3,進而分發到 CloudFront CDN。

代碼管理

代碼管理使用的 CodeCommit 是類似於 Github 的服務,相比 Github 的優勢在於其對個人或小團隊的 private repository 價格低了許多。本文的例子只將 Hexo 源碼 提交至 CodeCommit 而不是 Hexo 生成的靜態文件,這樣的好處是版本控制控制的是開發者寫的源碼,而不是 Hexo 生成的靜態文件。

構建及測試

CodeBuild 是一個用來構建及測試代碼的服務,在例子中取代了如 Jenkin 、Gitlab CI 等成熟開源方案。CodeBuild 相對於成熟方案的優勢在於,開發者不需要自己搭建伺服器用於軟體構建。本例子在源碼根目錄下創建了一個 buildspec.yml 文件,CodeBuild會根據這個文件在其所管理的容器實例里進行構建。

version: 0.2nphases:n install:n commands:n - npm installn build:n commands:n - node_modules/.bin/hexo generaten post_build:n commands:n - aws s3 sync public/ s3://$WEBSITE_BUCKET/ --cache-control max-age=3600 --deleten

本例子的部署過程比較簡單,只是使用 Hexo 命令生成靜態文件並在成功構建之後將生成的文件上傳到相應的 S3 Bucket 里。

Pipeline

CodePipeline 是一個用來將源碼、構建、測試、部署過程串起來實現 CD 的服務。下圖是該例子所使用的 Pipeline:

當一個新的 commit 被 push 到 CodeCommit 的時候,會觸發 pipeline 將源碼打包送到 CodeBuild。因為這個例子的部署過程僅僅是講文件上傳到 S3,所以在這個 pipeline 中便沒有 Deploy 這一 stage。如果是更複雜的軟體、服務,則可能需要在這個 pipeline 中增加 Beta、Gamma 及 Prod 等 stages,並在各 stages 直接添加一些如集成測試之類的 steps。

DNS、證書 及 CDN

目前這個方案手動通過相應的 AWS 服務生成及管理 SSL 證書、配置 CDN 分發及 DNS資源的創建。

優勢與不足

這個方案擴展到更複雜的動態網站、微服務也同樣適用。其優勢在於不需要開發者太操心實現 CD 所需要的構建及測試伺服器。一旦整條 pipeline 配置好,開發者每次提交及部署新代碼所需要做的,就是一個 git push。這對初創團隊是非常好的事情,讓團隊可以專註於開發業務本身,而不需要太考慮支撐業務開發的 infrastructure 的問題。

本文用於介紹該方案的例子也有明顯的不足:手動配置的步驟太多。好在 AWS 提供了 CloudFormation 這個服務讓 Infrastructure as Code 變得非常簡單。

另外,使用雲服務會有另一個隱患,即 vendor lock-in,以後想遷移到其他平台或技術,都變得困難。


推薦閱讀:

視界雲聯合創始人姜飛 榮獲品途2017年NBI商業影響力新銳人物獎
在雲計算時代,網路遊戲為什麼要分伺服器?
彈幕系統更新的血與淚
在linux環境下安裝並配置jdk
深化「一核兩翼」戰略 華為雲業務的選擇和堅持

TAG:AmazonWebServicesAWS | 持续部署 | 云计算 |