背景
资源编排服务(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"
}
}
]
}
执行更改集
确认变更详情,如果不符合要求,可以创建新的更改集直到符合要求。如果已经符合要求,可以直接执行更改集。
执行完成后,观察资源列表,符合预期。