Есть ли способ получить размонтированный том, когда я вызываю CloudFormation delete-stack?

Я использую CloudFormation для создания моей среды. Часть стека включает в себя создание тома из моментального снимка, связывание его с экземпляром EC2, а затем его установку.

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

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

    "myTestInstance" : {
        "Type" : "AWS::EC2::Instance",
     ...snip...
    }
 },

Когда я пытаюсь вызвать 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

Вызов удаляемого стека второй раз выполняется успешно, потому что экземпляр уже уничтожен.

Есть ли какие-либо крючки в исполняемом экземпляре, которые вызываются с помощью stackpoint delete-stack, где я мог бы восстановить громкость? Любой другой способ сделать это?

Ответ 1

Чтобы получить эту работу, мне пришлось изменить способ прикрепления тома. Вместо использования 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...
    }
 },

Прикрепление тома таким образом означает, что CloudFormation удаляет экземпляр и том в правильном порядке. То есть, экземпляр отключается до того, как том будет удален.

Убедитесь, что EBSData не использует ссылки на myTestInstance или вы получите круговую зависимость.

Ответ 2

Я нашел ответ на свою проблему здесь с атрибутом ресурса DependsOn.

По сути, это удалось решить мою проблему (описанную в комментарии к вашему вопросу):

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

    "myTestInstance" : {
        "Type" : "AWS::EC2::Instance",
     ...snip...
    }
 },

Обратите внимание на добавление "DependsOn": "myTestInstance" в ресурсе тома. Поскольку ресурс VolumeAttachment имеет встроенный "DependsOn" для тома, все должно быть хорошо.

Дополнительное примечание: Это не было протестировано, но будет обновляться после его тестирования.

Ответ 3

Что CloudFormation не делает, он не может отменить: ваш том установлен вами (с CloudInit через UserData или еще), а CloudFormation не знает, как отменить это. Таким образом, удаление стека прекращается, поскольку устройство остается отключенным, а том находится в состоянии "Занят".

рекомендуемый способ заключается в использовании CloudFormation CustomRessource для объявления точки монтирования:

"ExampleVolumeMount" : {
    "Type" : "Custom::VolumeMount",
    "Version" : "1.0",
    "DependsOn" : ["VolumeAttachment", "ExampleWaitCondition"],
    "Properties" : {
        "ServiceToken" : { "Fn::GetAtt" : ["CustomResourcePipeline", "Outputs.CustomResourceTopicARN"] },
        "Device" : "/dev/xvdh",
        "MountPoint" : "/mnt/disk",
        "FsType" : "ext3",
        "Format" : "true"
    }
},

Он использует ServiceToken, созданный дополнительным шаблоном: https://s3.amazonaws.com/cloudformation-examples/cr-backend-substack-template.template, которые содержат очередь SQS и тему SNS.

Вы можете проверить полный пример и скрипты на AWSlabs github account.