Я использую cloudformation для создания стека, который включает автомасштабированный экземпляр ec2 и ведро S3. Для ведра S3 у меня DeletionPolicy установлен на Retain, который отлично работает, пока я не хочу снова запустить мою облачную среду script. Поскольку в предыдущих запусках, script создал ведро S3, он не работает при последующих запусках, говоря, что мой ведро S3 уже существует. Разумеется, ни один из других ресурсов не создается. Мой вопрос заключается в том, как проверить, существует ли мой веток S3 сначала внутри облачной среды script, и если да, то пропустите создание этих ресурсов. Я просмотрел условия в AWS, но, похоже, все параметры основаны, мне еще предстоит найти функцию, которая проверяет существующие ресурсы.
Ответ 3
Если вы делаете обновления (потенциально стеки в пакетах aka Nested Stacks), неизменные части не обновляются.
https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-stack.html?icmpid=docs_cfn_console_designer
Затем вы можете установить политики, как указано для предотвращения удаления. [запомнить "отменить обновление" для откатов]
https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/protect-stack-resources.html
Также есть вывод Cross-Stack, добавляя Export Names к выводам стека.
http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/outputs-section-structure.html
Прохождение...
http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/walkthrough-crossstackref.html
Затем вам нужно использовать Fn:: ImportValue...
http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-importvalue.html
Это означает, что можно использовать параметр имени сетевого стека.
К сожалению, у вас появляется такая ошибка, когда вы пытаетесь использовать их в Условиях.
Ошибка проверки шаблона: ошибка шаблона: нельзя использовать Fn:: ImportValue в условиях.
Или в параметрах?
Ошибка проверки шаблона: ошибка формата шаблона: каждый член по умолчанию должен быть строкой.
Также это может произойти при попытке...
Ошибка формата шаблона: вывод ExportOut неверен. Поле Имя экспорта не должны зависеть от каких-либо ресурсов, импортированных значений или Fn:: GetAZs.
Таким образом, вы не можете остановить его, сделав существующий ресурс снова из того же файла. Только при переносе в другой стек и использовании ссылки на импорт экспорта.
Но если вы разделите два, тогда существует зависимость, которая остановит и откатит, например, удаление зависимостей, благодаря ссылке через функцию ImportValue.
Пример:
Сначала создайте групповой шаблон
{
"AWSTemplateFormatVersion": "2010-09-09",
"Metadata": {
"AWS::CloudFormation::Designer": {
"6927bf3d-85ec-449d-8ee1-f3e1804d78f7": {
"size": {
"width": 60,
"height": 60
},
"position": {
"x": -390,
"y": 130
},
"z": 0,
"embeds": []
},
"6fe3a2b8-16a1-4ce0-b412-4d4f87e9c54c": {
"source": {
"id": "ac295134-9e38-4425-8d20-2c50ef0d51b3"
},
"target": {
"id": "6927bf3d-85ec-449d-8ee1-f3e1804d78f7"
},
"z": 1
}
}
},
"Resources": {
"TestGroup": {
"Type": "AWS::IAM::Group",
"Properties": {},
"Metadata": {
"AWS::CloudFormation::Designer": {
"id": "6927bf3d-85ec-449d-8ee1-f3e1804d78f7"
}
},
"Condition": ""
}
},
"Parameters": {},
"Outputs": {
"GroupNameOut": {
"Description": "The Group Name",
"Value": {
"Ref": "TestGroup"
},
"Export": {
"Name": "Exported-GroupName"
}
}
}
}
Затем создайте шаблон пользователя, который нуждается в группе.
{
"AWSTemplateFormatVersion": "2010-09-09",
"Metadata": {
"AWS::CloudFormation::Designer": {
"ac295134-9e38-4425-8d20-2c50ef0d51b3": {
"size": {
"width": 60,
"height": 60
},
"position": {
"x": -450,
"y": 130
},
"z": 0,
"embeds": [],
"isrelatedto": [
"6927bf3d-85ec-449d-8ee1-f3e1804d78f7"
]
},
"6fe3a2b8-16a1-4ce0-b412-4d4f87e9c54c": {
"source": {
"id": "ac295134-9e38-4425-8d20-2c50ef0d51b3"
},
"target": {
"id": "6927bf3d-85ec-449d-8ee1-f3e1804d78f7"
},
"z": 1
}
}
},
"Resources": {
"TestUser": {
"Type": "AWS::IAM::User",
"Properties": {
"UserName": {
"Ref": "UserNameParam"
},
"Groups": [
{
"Fn::ImportValue": "Exported-GroupName"
}
]
},
"Metadata": {
"AWS::CloudFormation::Designer": {
"id": "ac295134-9e38-4425-8d20-2c50ef0d51b3"
}
}
}
},
"Parameters": {
"UserNameParam": {
"Default": "testerUser",
"Description": "Username For Test",
"Type": "String",
"MinLength": "1",
"MaxLength": "16",
"AllowedPattern": "[a-zA-Z][a-zA-Z0-9]*",
"ConstraintDescription": "must begin with a letter and contain only alphanumeric characters."
}
},
"Outputs": {
"UserNameOut": {
"Description": "The User Name",
"Value": {
"Ref": "TestUser"
}
}
}
}
Вы получите
Нет экспорта с именем Exported-GroupName. Откат, запрошенный пользователем.
если выполняется запуск пользователя без какой-либо группы. Экспортировано.
Затем вы можете использовать подход вложенного стека.
{
"AWSTemplateFormatVersion": "2010-09-09",
"Metadata": {
"AWS::CloudFormation::Designer": {
"66470873-b2bd-4a5a-af19-5d54b11f48ef": {
"size": {
"width": 60,
"height": 60
},
"position": {
"x": -815,
"y": 169
},
"z": 0,
"embeds": []
},
"ed1de011-f1bb-4788-b63e-dcf5494d10d1": {
"size": {
"width": 60,
"height": 60
},
"position": {
"x": -710,
"y": 170
},
"z": 0,
"dependson": [
"66470873-b2bd-4a5a-af19-5d54b11f48ef"
]
},
"c978f2d9-3fb2-4420-b255-74941f10a28a": {
"source": {
"id": "ed1de011-f1bb-4788-b63e-dcf5494d10d1"
},
"target": {
"id": "66470873-b2bd-4a5a-af19-5d54b11f48ef"
},
"z": 1
}
}
},
"Resources": {
"GroupStack": {
"Type": "AWS::CloudFormation::Stack",
"Properties": {
"TemplateURL": "https://s3-us-west-2.amazonaws.com/cf-templates-x-TestGroup.json"
},
"Metadata": {
"AWS::CloudFormation::Designer": {
"id": "66470873-b2bd-4a5a-af19-5d54b11f48ef"
}
}
},
"UserStack": {
"Type": "AWS::CloudFormation::Stack",
"Properties": {
"TemplateURL": "https://s3-us-west-2.amazonaws.com/cf-templates-x-TestUserFindsGroup.json"
},
"Metadata": {
"AWS::CloudFormation::Designer": {
"id": "ed1de011-f1bb-4788-b63e-dcf5494d10d1"
}
},
"DependsOn": [
"GroupStack"
]
}
}
}
К сожалению, вы все равно можете удалить стек пользователя, даже если он был сделан MultiStack в этом примере, но с политиками удаления и другими вещами, которые он может просто помочь.
Затем вы только обновляете различные стеки, которые он создает, и вы не будете делать Multi Stack, если вы, например, повторно используете Bucket.
В противном случае вы будете искать API и скрипты в различных вариантах.