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


16

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

我的堆栈陷入了这样的境地:只需销毁和创建资源即可解决该问题,而不是必须删除整个堆栈才能继续工作。

编辑:

这个问题打了我两次。首先,我创建了具有一些默认值的AWS :: RDS :: Instance,然后尝试将其降级为“ EngineVersion”:“ 5.5”。更改它可能会发生一些中断,但是mysql实例不能从5.6降级到5.5,因此堆栈处于UPDATE_FAILED状态,并且我不能在没有麻烦的情况下重新创建RDS。

另一个情况是我有多个“ AWS :: EC2 :: Instance”,显然,如果Y更改了下载的脚本,则必须从其“ UserData”下载并执行脚本,我必须重写该实例,并且没有办法。我再次使用相同的技巧来重新创建计算机。

讨厌的把戏:

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


需要更多信息来回答。您的实例在启动时是否冻结?服务会变得无响应吗?如果要手动重新创建EC2实例,则可以使用一个实例创建一个自动扩展组。当您终止实例时,将创建另一个实例。
Edwin


这不会直接回答您的问题,但是要在更改后重新运行UserData脚本,可以查看cfn-hupdocs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/…–
Reed Kraft-Murphy,

Answers:


10

对于实例存储支持的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 ...
                    ]]}
            }
        }
    }
}

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

对于RDS,您可以获取当前RDS实例的数据库快照,然后修改模板以通过以下方式使用该快照DBSnapshotIdentifier

{
    "Resources" : {
        "MyDB" : {
        "Type" : "AWS::RDS::DBInstance",
        "Properties" : {
            // ... other properties ...
            "DBSnapshotIdentifier": "<db snapshot ID>"
        }
    }    
}

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

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

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


似乎唯一的解决方案是做“肮脏的把戏”,问了一段时间后,我达到了一个类似的解决方案(强制更改可用区域):
theist

4
只想指出,实例已替换,因此当实例存储支持EC2实例时执行UserData。如果是EBS支持的,则UserData的更改只会使实例重新启动,并且不会再次执行UserData。即使在这种情况下,也可以使用cfn-hup再次运行UserData,但实例保持不变。
Kaitsu 2015年

@Kaitsu:谢谢,这是非常有价值的澄清。我相应地更新了我的答案。
markusk

@Kaitsu,但是如果您手动重新运行脚本(位于/ var / lib / cloud / instance / scripts / part-001),则必须确保该脚本可防御多次运行相同命令:(
c24w

1

如果将其放入AutoScalingGroup中,则可以将AutoScalingGroup的最小/最大/默认值编辑为0,然后一旦它开始销毁旧实例,则可以将最小/最大/默认值设置为1/1/1,然后presto:新实例。


0

如果您的EC2属于AutoScalingGroup,则可以在AutoScalingGroupName属性中设置版本号。

每次更改该版本号CFN都会:1.创建一个新的自动伸缩组并启动所需的实例2.杀死旧的自动伸缩组中的实例并将其删除

这是我堆栈中的一部分代码,在其中我使用这种技术来强制大量EC2计算机重新创建并自动从S3中提取新软件。

AutoScalingGroup:
    Type: AWS::AutoScaling::AutoScalingGroup
    Properties:
        AutoScalingGroupName: !Sub "${StackName}-${ServiceName}-${ServiceVersion}"
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.