У нас есть шаблон CloudFormation, который создает экземпляр EC2 и группу безопасности (среди многих других ресурсов), но мы должны иметь возможность добавлять некоторые дополнительные ранее существовавшие группы безопасности в тот же экземпляр EC2.
Проблема заключается в том, что количество ранее существовавших групп безопасности не всегда будет одинаковым, и мы хотим иметь один шаблон, который будет обрабатывать все случаи.
В настоящее время у нас есть входной параметр, который выглядит так:
"WebTierSgAdditional": {
"Type": "String",
"Default": "",
"Description": ""
}
Мы передаем этому параметру строку с разделителями-запятыми ранее существовавших групп безопасности, например 'sg-abc123,sg-abc456'
.
Тег SecurityGroup экземпляра EC2 выглядит следующим образом:
"SecurityGroups": [
{
"Ref": "WebSg"
},
{
"Ref": "WebTierSgAdditional"
}
]
С помощью этого кода, когда экземпляр создается, мы получаем эту ошибку в консоли AWS:
Необходимо использовать либо идентификатор группы, либо имя группы для всех групп безопасности, а не одновременно в обоих случаях
Параметр "WebSg" выше - это одна из групп безопасности, созданных в другом месте шаблона. Эта же ошибка появляется, если мы передаем список имен групп, а не список идентификаторов группы через входной параметр.
Когда мы меняем поле "Тип" входного параметра как "CommaDelimitedList", мы получаем сообщение об ошибке:
Значение свойства SecurityGroups должно быть типа List of String
Очевидно, он не может присоединиться к списку со строкой, чтобы сделать его новым.
Когда параметр содержит только один идентификатор sg, все создается успешно, однако нам нужно иметь возможность добавлять не более одного идентификатора sg.
Мы использовали множество различных комбинаций использования Fn::Join
в теге SecurityGroups, но ничего не работает. Нам действительно нужна какая-то функция "Explode", чтобы извлечь отдельный идентификатор из строки параметров.
Кто-нибудь знает хороший способ заставить это работать?