背景
資源編排服務(Resource Orchestration Service, 簡稱ROS)是阿裡雲提供的一項簡化雲計算資源管理的服務。您可以遵循ROS定義的模闆規範編寫資源棧模闆,在模闆中定義所需的雲計算資源(例如ECS執行個體、RDS資料庫執行個體)、資源間的依賴關系等。ROS的編排引擎将根據模闆自動完成所有資源的建立和配置,實作自動化部署及運維。
當您需要更新資源棧時,在實施之前了解您的更改會如何影響正在運作的資源可以幫助您充滿自信地更新資源棧。使用更改集,您可以預覽提議對資源棧進行的更改可能會對正在運作的資源造成什麼影響,例如,您的更改是否會删除或替換任何關鍵資源,隻有在您決定執行更改集時,ROS 才會對您的資源棧進行更改,這讓您可以決定是否繼續執行提議的更改,還是通過建立另一個更改集來探索其他更改。您可以使用 ROS 控制台、ALIYUN CLI 或 ROS API 來建立和管理更改集。
關于更改集的更多功能介紹,可以參考
這裡。
功能介紹
更新資源棧
使用更改集更新資源棧,與直接更新資源棧的最大差別是多了一個稽核變更的過程。
如下圖所示,使用者有一個資源棧,裡面有三個資源:三角、圓、方塊。使用者更新資源棧時,想知道資源棧到底會發生哪些變更,于是建立了一個更改集。通過檢視更改集的内容,發現三角和圓發生了變化,顔色由白變橘,方塊沒有發生變化。如果使用者覺得符合預期,就可以執行更改集,資源棧就會開始更新。使用者如果覺得不符合預期,可以調整模闆或參數後,重新建立更改集,直至符合預期。
不使用更改集的更新流程中,使用者在執行更新之前,并不知道資源棧會發生何種變化。這可能會導緻一些誤操作,如意外更新或删除了某些資源。一種避免誤操作的方法是使用
資源棧政策,防止意外更新,這是一種防禦措施。主動的辦法是使用更改集,預覽變更内容,一切盡在掌控。當然兩者也可以結合在一起使用。

建立資源棧
更改集不僅可以用來更新資源棧,也可以用來建立資源棧。用來建立資源棧時,可以預覽會建立出哪些資源。目前隻有API和CLI支援該功能,控制台不支援該功能。更推薦的做法是使用資源棧預覽功能,對應的API接口是
PreviewStack,控制台、API和CLI均支援。
示例
建立更改集
我們使用如下模闆在
ROS控制台建立一個資源棧。這個資源棧包含三個資源:Handle1、Handle2、Handle3。
ROSTemplateFormatVersion: '2015-09-01'
Resources:
Handle1:
Type: 'ALIYUN::ROS::WaitConditionHandle'
Properties:
Count: 0
Handle2:
Type: 'ALIYUN::ROS::WaitConditionHandle'
Properties:
Count: 1
Handle3:
Type: 'ALIYUN::ROS::WaitConditionHandle'
Properties:
Count: 2
為這個資源棧建立更改集,目的把Handle1的Count修改為100,删除Handle3,增加一個新資源Handle4。
在選擇模闆,使用如下模闆。
ROSTemplateFormatVersion: '2015-09-01'
Resources:
Handle1:
Type: 'ALIYUN::ROS::WaitConditionHandle'
Properties:
Count: 100
Handle2:
Type: 'ALIYUN::ROS::WaitConditionHandle'
Properties:
Count: 1
Handle4:
Type: 'ALIYUN::ROS::WaitConditionHandle'
Properties:
Count: 3
按照導航指引,完成剩下的配置,建立更改集。
稽核變更
選擇更改集,檢視詳情。
檢視變更摘要。
檢視變更詳情。
變更詳情
下在是JSON更改的具體内容。Changes中的每一項對應于一個資源的變更。
在ResourceChange結構中,Action表示變更類型:
- Add:建立。
- Remove:删除。
- Modfiy:修改。
可以看到Handle3資源會被删除,Handle4資源會被建立,而Handle1和Handle2資源發生了修改。
Handle1資源發生修改是因為我們修改了Count屬性,在更改集中ResourceChange.Details部分也有顯示。
Handle2資源并沒有發生修改,為什麼會出現在更改集中。ResourceChange.Details.ChangeSource為System,是因為ALIYUN::ROS::WaitConditionHandle比較特殊,根據特定的條件或内部機制也會觸發更新,一般的資源不存在這個情況。
關于變更詳情的細節可以參見
更改集資料結構{
"Changes": [
{
"Type": "Resource",
"ResourceChange": {
"Action": "Modify",
"LogicalResourceId": "Handle2",
"Details": [
{
"Evaluation": "Dynamic",
"Target": {
"RequiresRecreation": "Never",
"Attribute": "Properties"
},
"ChangeSource": "System"
}
],
"Scope": [
"Properties"
],
"PhysicalResourceId": "Handle2",
"ResourceType": "ALIYUN::ROS::WaitConditionHandle",
"Replacement": "False"
}
},
{
"Type": "Resource",
"ResourceChange": {
"Action": "Modify",
"LogicalResourceId": "Handle1",
"Details": [
{
"Evaluation": "Static",
"Target": {
"RequiresRecreation": "Never",
"Attribute": "Properties",
"Name": "Count"
},
"ChangeSource": "DirectModification"
}
],
"Scope": [
"Properties"
],
"PhysicalResourceId": "Handle1",
"ResourceType": "ALIYUN::ROS::WaitConditionHandle",
"Replacement": "False"
}
},
{
"Type": "Resource",
"ResourceChange": {
"Action": "Add",
"LogicalResourceId": "Handle4",
"Details": [],
"Scope": [],
"ResourceType": "ALIYUN::ROS::WaitConditionHandle"
}
},
{
"Type": "Resource",
"ResourceChange": {
"Action": "Remove",
"LogicalResourceId": "Handle3",
"Details": [],
"Scope": [],
"PhysicalResourceId": "Handle3",
"ResourceType": "ALIYUN::ROS::WaitConditionHandle"
}
}
]
}
執行更改集
确認變更詳情,如果不符合要求,可以建立新的更改集直到符合要求。如果已經符合要求,可以直接執行更改集。
執行完成後,觀察資源清單,符合預期。