Есть ли способ получить размонтированный том, когда я вызываю 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.