实现等效于 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 兼容资源来看,受影响的是以下资源

  • AWS::EC2::Volume - 不支持更新 [1]

  • AWS::EC2::VolumeAttachment - 不支持更新 [2]

  • AWS::CloudFormation::WaitCondition - 不支持更新 [3]

  • AWS::CloudFormation::Stack - 不支持 TimeoutInMinutes 属性的更新 [4]

提议的变更

  • 添加属性模式属性 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

依赖项