Получение информации из одного стека CloudFormation для использования в другом
Я пытаюсь настроить конвейер сборки для веб-службы в AWS. Планируется запустить службу в группе автоматического масштабирования и использовать Jenkins для создания отдельного экземпляра EC2, выполнения тестов и, в случае успеха, создания образа экземпляра и передачи его в существующую группу автоматического масштабирования.
Чтобы создать для этого все необходимые ресурсы, я создал два шаблона CloudFormation: один для создания группы Autoscale и окружающих ресурсов, а другой - для создания одного экземпляра, который можно протестировать.
Я заметил проблему с этим: существуют разные базовые изображения для каждого региона и каждого типа экземпляра EC2. Это означает, что Дженкинс должен знать регион и тип экземпляра, для которого нужно построить.
Идеальным решением будет способ выбора целевого стека CloudFormation и извлечения информации (региона, типа экземпляра и т. Д.) Оттуда. Это означает, что если мы внесем какие-либо изменения в группу автоматического масштабирования, они будут автоматически отражены в сборке Jenkins. Если мы создали вторую группу, мы можем скопировать задание Jenkins и изменить один параметр, чтобы он указывал на новый стек. Но это не похоже на вариант...
Вот потенциальные решения, о которых я могу подумать, но мне не особо нравится ни одно из них:
Жесткий код этой информации в обоих шаблонах
Это идет вразрез с идеей иметь шаблоны CF, так как в идеале я хотел бы сохранить эти вещи гибкими.Отправьте информацию в API, а затем попросите Дженкинса найти ее.
Это довольно много дополнительной работы, так как я должен построить и поддерживать машину только для хранения пары переменных. Не говоря уже о том, что я не уверен, что могу вывести информацию в API из сценария, поэтому придется обернуть ее в другой сценарий, чтобы получить информацию из инструмента CLI AWS.Категоризировать окончательное изображение
Я мог бы позволить гибкость во всех параметрах, а затем классифицировать окончательное изображение по этим параметрам. Затем я могу убедиться, что группа автоматического масштабирования загружает только изображения с правильными параметрами. Это предотвратит использование неверного базового изображения, но может привести к созданию с неверной информацией (если мы изменим одно, мы должны помнить, чтобы изменить другое).
Такое ощущение, что то, что я хочу сделать, не должно быть таким сложным, но я не могу найти лучший способ сделать это.
3 ответа
CloudFormation включает в себя псевдопараметр AWS::Region
где он может запросить регион, в котором он работает. См. http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/pseudo-parameter-reference.html
Вы можете использовать сопоставления, чтобы получить список изображений AMI, где вы выбираете свой AMI в зависимости от региона. См. http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-findinmap.html
Обычно на выбор AMI не влияет тип экземпляра. Однако я не знаком с вашим вариантом использования, поэтому он может иметь значение.
Что касается вашего рабочего процесса, я бы не стал "вносить изменения" в вашу группу автомасштабирования. Все должно пойти по другому пути: внести изменения в шаблоны CloudFormation, которые, в свою очередь, обновят ваши стеки, чтобы обновить группы автоматического масштабирования.
Итак, вы бы:
- Создайте свой единственный экземпляр из шаблона CFN, подтвердите его работоспособность и создайте новый AMI.
- Возьмите новый идентификатор изображения AMI и обновите шаблон CFN вашей группы Autoscale.
- Обновите свою группу Autoscale, обновив ее стек
Опасность внесения изменений непосредственно в вашу группу автоматического масштабирования заключается в том, что эти изменения не будут отражены в шаблоне стека. Если вам пришлось перестроить стек или сделать копию, эти изменения будут пропущены. В идеале ресурсы, созданные из стека CloudFormation, должны рассматриваться как доступные только для чтения и могут обновляться только путем внесения изменений в шаблон CFN.
Определите информацию, которую вы хотите передать как выходы из первого стека. Используйте псевдопараметры для региона и т. Д.
Когда вы создаете второй стек, вызовите description-stack для первого, чтобы получить Outputs, и передайте значения в качестве параметров во второй стек.
Несколько лучший вариант, чем перечисленные выше (и фактически возможный), - использовать инструмент CLI AWS для получения информации о текущих стеках. Это можно обернуть в скрипт, чтобы получить возвращенный JSON и найти нужные параметры / выходы.
Он все еще немного запутывает его, перемещая его во внешний скрипт, а не помещая его в шаблон CloudFormation, поэтому я собираюсь оставить вопрос открытым в надежде, что кто-то получит лучший ответ.
Вот нелепо простой пример:
<?php
$result = `aws cloudformation describe-stacks --stack-name=GROUPSTACKNAME`;
$stack = json_decode($result);
$stack = $stack->Stacks[0];
if(!$stack) {
throw new Exception("Stack no found");
}
$parameters = [];
foreach($stack->Parameters as $param) {
$parameters[$param->ParameterValue] = $param->ParameterKey;
}
echo http_build_query($parameters);