本文是 2021 阿裡雲開發者大會應用開發的基礎設施優化專場《雲上資源自動化部署新模式》的文字版。
目前雲上資源部署模式
雲上資源傳統部署模式的挑戰

大部分使用者一般是通過控制台/API/SDK等傳統模式進行雲上資源的部署,這種部署模式會面臨如下挑戰:
- 規模上,随着業務的發展需要管理的資源規模不斷上升,部署和管理種類繁多的資源帶來挑戰
- 效率上,随着規模上升,手動批量部署變得難以為繼
- 合規上,如何確定對基礎設施的變更均符合組織管理規範
- 成本上,手動部署的方式無法極緻地利用雲上彈性能力,其成本仍有優化空間
阿裡雲自動化部署模式
資源編排服務(ROS)的核心價值
面對傳統部署模式的挑戰,我們在想是否能夠對雲上資源進行自動化部署?是以有了
阿裡雲資源編排服務(ROS),它基于基礎設施即代碼(IaC)的理念,讓開發者和管理者使用模版的方式,編排雲上的多種雲資源,進行自動化部署。
對比與手動部署,使用ROS進行自動化部署會帶來如下好處:
- 效率提升,針對諸如SAP這樣複雜的解決方案能有效提升部署效率,也能夠幫助MSP、ISV、onECS服務提升部署效率
- 架構優化,ROS提供了種類豐富的阿裡雲最佳實踐模闆,使用者無需豐富的架構經驗即可部署解決方案級别的架構
- 合規管控,由IT管理者統一管理基礎設施以避免各類風險,且可基于模闆進行稽核再進一步結合CI/CD以規範化IT管理流程
- 節省成本,自動化部署方式可以按需部署和釋放資源,進而極緻地使用雲上彈性能力來節省成本
ROS 的使用流程和核心功能
使用 ROS 進行自動化部署的過程非常簡單:
- 按照 ROS 模闆文法 編寫模闆,定義想要建立的各類雲上資源
- 在 ROS 控制台 使用模闆建立資源棧,以執行部署。其中,資源棧是一組資源的集合,這些資源均是模闆中定義的資源。
- 檢視資源棧,可以檢視棧中各種資源的建立情況,并可以跳轉到對應資源的控制台
ROS 服務本身完全免費,內建了身份認證和安全審計的功能,資源建立結果可視化,且能夠進行多賬号跨地域的部署,支援檢測資源棧和實際資源的差異并進行修正。
除了直接使用 ROS 模闆來做自動化部署,是否還有别的方式呢?
新模式一:Terraform 托管
Terraform 是什麼
Terraform 同 ROS 一樣,也是基于基礎設施即代碼(IaC)的理念的自動化編排工具。它使用一種特定的配置語言(HCL, Hashicorp Configuration Language)來描述基礎設施資源,文法樣例如上圖所示。
Terraform & ROS
既然 Terraform 和 ROS 都是基于相同的理念的自動化編排工具,那它們的目标也是一緻的,都是為使用者打造良好的雲上部署體驗。
兩者有很多相同之處,比方說 Terraform 的配置檔案相當于ROS的模闆,Terraform 的狀态相當于 ROS 的資源棧,Terraform 的 CLI 程式則相當于 ROS 的編排引擎。
兩者也各有優勢,Terraform 的文法更簡潔,對多雲支援地很完善;而 ROS 則提供免費的服務托管,且有雲原生的鑒權和審計能力。
那麼是否能夠将兩者的優勢結合呢?是以就有了 Terraform 托管能力。
Terraform 托管
使用者直接在本地使用 Terraform 時,需要根據目前的作業系統下載下傳對應的 Terraform CLI,編寫模闆,管理所使用的各類 Provider 的版本,且要管理狀态等檔案。
而使用
Terraform 托管功能時,隻需在 ROS 的控制台編寫 Terraform 模闆便可直接部署,後續則通過資源棧來管理模闆中定義的資源。底層的各類管理都交給 ROS。
在使用原理上,ROS 控制台會将 Terraform 模闆組合成符合 ROS 文法規範的模闆,ROS 服務端會其進行文法校驗,生成租戶資訊,排程到 ROS 的 Terraform 服務進行資源的部署。
定時與多雲場景實踐
我們可以在很多場景中使用 Terraform 托管的功能。
場景一:定時部署資源
假設我們需要通過 Terraform 定時部署資源,傳統方式下需要本地建立定時任務,執行 Terraform CLI 來做。而在雲上,我們可以:
- 事先編寫一個 Terraform 模闆,聲明想要部署的雲資源
- 事先編寫一個 OOS 運維模闆來聲明由它調用 ROS 進行資源部署
- 在 OOS 中設定為定時執行。則 OOS 會定時觸發 ROS,ROS 則會使用 Terraform 托管功能進行資源部署
場景二:多雲管理
若我們既想對多種雲(如阿裡雲、AWS等)進行部署,又想有可視化的結果回報,則可以直接編寫 Terraform 模闆聲明各個雲上資源,并使用 ROS 的 Terraform 托管功能來進行部署。
Terraofrm 托管總結
新模式二:ROS CDK
現有資源定義方式的不足
通過直接編寫 ROS 模闆,或者通過可視化編輯器生成模闆,然後進行資源部署的方式已然能夠大大提升部署效率,但是也有一些不足之處:
- 缺少對過程式的支援
- 複雜場景的編寫效率較低
- 對程式的友好性較低
- 動态性支援較差
針對這些問題,是否可以更進一步,在模闆之上解決這些不足呢?
ROS CDK 是什麼
是資源編排(ROS)提供的一種指令行工具和多語言SDK,利用面向對象的進階抽象模式對雲資源進行标準定義,進而快速建構雲資源。
ROS CDK 以應用作為資源管理的入口,一個應用管理多個資源棧,而每個資源棧中則可以有多個建構。建構可以了解為雲上資源的元件,能包含一個或多個資源。
我們可以選擇自己熟悉的程式設計語言(TypeScript/JavaScript/Java/Python/C#)編寫應用代碼聲明想要部署的資源,ROS CDK 會将項目代碼轉換成 ROS 模闆,然後使用該模闆進行自動化部署。
使用步驟和項目生命周期
ROS CDK 的使用步驟也很簡單:
- 首先就是初始化項目,配置阿裡雲的通路憑證(AccessKey)
- 其次就是編寫資源代碼和測試用例進行本地測試
- 最後就是進行資源部署(通過CDK CLI或者直接程式部署),并管理資源棧
在進行部署的階段,CDK會根據使用者編寫的資源代碼進行構造,執行個體化出各種資源對象;然後在準備階段做終态前的調整(通常由架構自動完成);進而驗證各種資源屬性,確定能夠正确部署;最終合成出一個 ROS 模闆,并使用該模闆部署為資源棧。
代碼、模闆示例
左圖是 ROS CDK的資源代碼,其中聲明了一個 VPC,并使用循環動态生成3個 VSwitch。而右圖則是由 ROS CDK 生成的 ROS 模闆。由此可以看出針對動态生成的場景,ROS CDK 可以大大簡化模闆編寫的複雜度。
應用程式內建CDK實作持續部署場景
假設我們實作一個CI/CD系統,能夠部署這樣的資源架構:使用API網關中提供API,使用函數計算的函數提供業務邏輯。能夠分别部署測試、預發、線上環境的資源,并且支援從測試釋出到預發,從預發釋出到線上。
在直接使用 ROS 模闆的方式中,需要分别為三個環境準備三個模闆,而環境間的部署則還需要動态拼接模闆,對應用程式來說并不友好。
基于 ROS CDK,應用程式可以根據環境的不同指定對應的變量,生産對應的資源,進而滿足環境的動态性部署。