实现等效于 AWS “不支持更新”¶
由于 Heat 试图保持与其 AWS 资源的兼容性,用户可以期望使用 Heat 的 AWS 兼容资源模板在 Heat 和 AWS 上都能以相同的方式工作。然而,目前我们在堆栈更新时缺少某些 AWS 资源的特定行为——资源的某个属性可能不支持任何更新,包括 UpdateReplace(目前我们默认的更新行为)。
https://blueprints.launchpad.net/heat/+spec/implement-aws-updates-not-supported
问题描述¶
AWS CloudFormation¶
AWS CloudFormation 对资源的某个属性区分“更新需要:替换”和“更新需要:不支持更新”。在后一种情况下,如果在堆栈更新期间尝试更新此属性,将导致错误,并将资源置于 UPDATE_FAILED 状态。
示例¶
在 AWS 文档中,AWS::EC2::Volume 资源的所有属性均标记为“更新需要:不支持更新” [1]。这是尝试使用 update-stack 命令将卷大小从 10 增加到 11 时 AWS 事件的相关部分
{
"ResourceStatus": "UPDATE_FAILED",
"ResourceType": "AWS::EC2::Volume",
"ResourceStatusReason":
"Update to resource type AWS::EC2::Volume is not supported.",
"ResourceProperties":
"{\"AvailabilityZone\":\"us-west-2a\",\"Size\":\"11\"}"
}
Heat¶
在 Heat 中,我们当前的默认更新行为是 UpdateReplace。任何可更新的属性都必须显式声明为可更新的,并在资源的 handle_update 方法中处理。我们没有明确的方法可以完全拒绝对资源的任何更新(包括将其替换为新资源)。因此,如果有人遵循与 示例 上述相同的场景,堆栈更新将成功,并替换了该卷。
从当前实现的 AWS 兼容资源来看,受影响的是以下资源
提议的变更¶
添加属性模式属性
update_replace_allowed,默认值为True修改
Resource.update_template_diff_properties方法以引发NotSupported错误(类似于检查update_allowed的检查)
那么资源的属性模式可以指定 update_replace_allowed=False,这将导致在尝试更新此类属性时资源更新失败。
备选方案¶
或者,我们可以将所讨论的 AWS 资源的 *所有* 属性标记为 update_allowed,并在资源的 handle_update 中引发相同的错误。但是,这将使 update_allowed 实际上无效,从而使用户和文档感到困惑。
实现¶
负责人¶
- 主要负责人
Pavlo Shchelokovskyy (pshchelo)
里程碑¶
- 完成目标里程碑
Juno-3
工作项¶
添加
update_replace_allowed属性修改默认资源更新逻辑
修改文档生成以显示此属性的状态(可能仅当其为
False时)将 AWS 兼容资源的相应属性标记为
update_replace_allowed = False
依赖项¶
无