题 是否有可能强制在亚马逊云形成中重新创建EC2 :: Instance或RDS :: DBInstance?


可以使用云形式堆栈强制重新创建EC2或RDS实例吗?

我的堆栈陷入了一个简单地破坏和创建资源将修复它的点,而不是我必须删除整个堆栈才能继续工作。

编辑:

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

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

令人讨厌的伎俩:

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


13
2017-09-18 15:35




需要更多信息才能回答。你的实例在启动时冻结了吗?服务是否无响应?如果您要手动重新创建EC2实例,则可以使用一个实例创建自动缩放组。终止实例时,将创建另一个实例。 - Edwin
编辑澄清。我也在这里问: forums.aws.amazon.com/thread.jspa?threadID=135295&tstart=0 - theist
这并不直接回答您的问题,但是为了在更改时重新运行UserData脚本,您可以查看 cfn-hup: docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/... - Reed Kraft-Murphy


答案:


例如,存储支持的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文档中:

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


10
2017-07-27 06:38



似乎唯一的解决方案就是做“肮脏的伎俩”我在询问后一段时间达成了类似的解决方案(强制可用区域更改):) - theist
只是想指出实例被替换,因此当EC2实例存储实例时,UserData会执行。如果它是EBS支持的,则UserData的更改将仅使实例重新启动并且不再执行UserData。即使在这种情况下,您也可以使用cfn-hup再次运行UserData,但实例保持不变。 - Kaitsu
@Kaitsu:谢谢,这是一个非常有价值的澄清。我相应地更新了答案。 - markusk
@Kaitsu但是如果您手动重新运行脚本(位于/ var / lib / cloud / instance / scripts / part-001),您必须确保脚本可以防御多次运行相同的命令:( - c24w


如果将其放入AutoScalingGroup,可以将AutoScalingGroup的min / max / default编辑为0,然后一旦它开始销毁旧实例,就可以将min / max / default设置为1/1/1并且presto:新实例。


1
2018-02-06 02:05





如果您的EC2进入AutoScalingGroup,您可以设置 AutoScalingGroupName其中包含版本号的属性。

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

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

AutoScalingGroup:
    Type: AWS::AutoScaling::AutoScalingGroup
    Properties:
        AutoScalingGroupName: !Sub "${StackName}-${ServiceName}-${ServiceVersion}"

0
2018-03-29 11:11