当我调用CloudFormation删除堆栈时,有没有办法将卷卸载?

chr*_*ris 10 amazon-ec2 amazon-web-services aws-cloudformation

我正在使用CloudFormation来创建我的环境.堆栈的一部分包括从快照创建卷,将其与EC2实例关联,然后安装它.

"Resources" : {
    "EBSData" : {
        "Type" : "AWS::EC2::Volume",
     ...snip...
    },

    "MountPoint" : {
        "Type" : "AWS::EC2::VolumeAttachment",
     ...snip...
    },

    "myTestInstance" : {
        "Type" : "AWS::EC2::Instance",
     ...snip...
    }
 },
Run Code Online (Sandbox Code Playgroud)

当我尝试调用delete-stack时,它会因为仍然挂载卷而失败:

  "StackStatusReason": "The following resource(s) failed to delete: [EBSData, MountPoint].", 
  "CreationTime": "2013-12-03T13:40:58.646Z", 
  "StackName": "myTestStack", 
  "StackStatus": "DELETE_FAILED", 
  "DisableRollback": false
Run Code Online (Sandbox Code Playgroud)

第二次调用delete-stack成功,因为实例已经被破坏了.

是否有任何钩子进入正在运行的实例,由cloudformation delete-stack调用,我可以卸载卷?还有其他办法吗?

小智 6

为了使这个工作,我不得不改变我附加音量的方式.AWS::EC2::VolumeAttachment您可以指定EBS卷以附加到该实例的属性中的实例,而不是使用;

"Resources" : {
    "EBSData" : {
        "Type" : "AWS::EC2::Volume",
     ...snip...
    },

    "myTestInstance" : {
        "Type" : "AWS::EC2::Instance",
        "Properties": {
            "Volumes": [ { "VolumeId": { "Ref": "EBSData" }, "Device": "<device mount point>" }]
        ...snip...
        },
     ...snip...
    }
 },
Run Code Online (Sandbox Code Playgroud)

以这种方式附加卷似乎使CloudFormation以正确的顺序删除实例和卷.也就是说,在删除卷之前关闭实例.

确保EBSData不使用任何引用,myTestInstance否则您将获得循环依赖.


Dav*_*lpy 3

我在这里通过“DependsOn”资源属性找到了问题的答案。

本质上,这能够解决我的问题(在对您的问题的评论中描述):

"Resources" : {
    "EBSData" : {
        "Type" : "AWS::EC2::Volume",
        "DependsOn": "myTestInstance",
     ...snip...
    },
    "MountPoint" : {
        "Type" : "AWS::EC2::VolumeAttachment",
     ...snip...
    },

    "myTestInstance" : {
        "Type" : "AWS::EC2::Instance",
     ...snip...
    }
 },
Run Code Online (Sandbox Code Playgroud)

"DependsOn": "myTestInstance"请注意在 Volume 资源中添加了。由于 VolumeAttachment 资源具有内置的“DependsOn”卷,因此一切都应该很好。

附加说明:尚未经过测试,但测试后将更新。