是否可以在 amazon cloudformation 中强制重新创建 EC2::Instance 或 RDS::DBInstance?

the*_*ist 18 amazon-ec2 amazon-rds amazon-cloudformation

是否可以使用 cloudformation 堆栈强制重新创建 EC2 或 RDS 实例?

我的堆栈卡在一个点上,简单地销毁和创建资源就可以修复它,而不是我必须删除整个堆栈才能继续工作。

编辑:

这个问题打了我两次。首先,我创建了一个具有一些默认值的 AWS::RDS::Instance,然后尝试将其降级为 "EngineVersion" : "5.5"。更改它应该会发生一些中断,但是 mysql 实例无法从 5.6 降级到 5.5,因此堆栈处于 UPDATE_FAILED 状态,我无法在没有讨厌的技巧的情况下重新创建 RDS。

另一种情况是,我有几个“AWS::EC2::Instance”,它们显然从“UserData”下载并执行脚本,如果 Y 更改下载的脚本,我必须重新构建实例,而没有办法这样做。我再一次使用相同的讨厌的技巧来重新创建机器。

讨厌的伎俩:

我没有使用一台机器的自动缩放组,而是解决了更改属性中的可用区的两个问题......但让我感觉很糟糕

mar*_*usk 13

对于实例存储支持的 EC2 实例,一个技巧是向包含版本号、日期或类似内容的用户数据脚本添加注释,然后在您想要重新创建实例时进行更改:

{
    "Resources" : {
        "MyEC2Instance" : {
            "Type" : "AWS::EC2::Instance",
            "Properties" : {
                // ... other properties ...
                "UserData": { 
                    "Fn::Base64" : {
                        "Fn::Join" : [ ":", [
                        "#!/bin/bash\n",
                        "# Version: 1.0\n",
                        // ... rest of user data ...
                    ]]}
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

对 的任何更改都UserData将导致实例被替换(即,重新生成)。不过,用户数据脚本的行为应该是相同的,因为唯一的修改是注释。请注意,这不适用于 EBS 支持的实例。

对于 RDS,您可以拍摄当前 RDS 实例的数据库快照,然后修改您的模板以使用该快照DBSnapshotIdentifier

{
    "Resources" : {
        "MyDB" : {
        "Type" : "AWS::RDS::DBInstance",
        "Properties" : {
            // ... other properties ...
            "DBSnapshotIdentifier": "<db snapshot ID>"
        }
    }    
}
Run Code Online (Sandbox Code Playgroud)

每当DBSnapshotIdentifier更改时,数据库实例将被替换。使用快照还可以让您保留创建快照时的数据。(如果您擦除数据,您可以创建一个空快照并将其作为输入传递。或者删除并重新创建整个 CloudFormation 堆栈。)

更通用的方法是更改​​资源的逻辑名称。从 CloudFormation 文档中的修改堆栈模板

对于大多数资源,更改资源的逻辑名称等同于删除该资源并用新资源替换它。依赖重命名资源的任何其他资源也需要更新,并可能导致它们被替换。其他资源需要您更新属性(不仅仅是逻辑名称)才能触发更新。

  • 只是想指出,当 EC2 实例是实例存储支持时,实例已被替换,因此 UserData 被执行。如果是EBS支持的,UserData的改变只会让实例重启,不会再次执行UserData。即使在这种情况下,您也可以使用 cfn-hup 再次运行 UserData,但实例保持不变。 (5认同)