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

Итак, вы бы:

  1. Создайте свой единственный экземпляр из шаблона CFN, подтвердите его работоспособность и создайте новый AMI.
  2. Возьмите новый идентификатор изображения AMI и обновите шаблон CFN вашей группы Autoscale.
  3. Обновите свою группу 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);
Другие вопросы по тегам