Попытка передать параметры от Мастера к дочернему шаблону
Я пытаюсь передать параметры списка от основного к дочернему шаблону, но я сталкиваюсь с двумя ошибками. Это мои текущие параметры в главном шаблоне.
"Parameters": {
"ELBSubnets": {
"Default": "subnet-5d8fea67,subnet-3e35cf15",
"Type": "CommaDelimitedList"
},
"LCKeyPair": {
"Default": "key-master",
"Type": "String"
},
"LCSecurityGroups": {
"Default": "sg-10a15c74,sg-880e5fec",
"Type": "CommaDelimitedList"
}
},
В этом методе на них ссылаются в том же шаблоне при передаче дочернему шаблону.
"ChildTempate1": {
"Properties": {
"Parameters": {
"ELBSubnets": {
"Ref": "ELBSubnets"
},
"KeyPair": {
"Ref": "LCKeyPair"
},
"LCSecurityGroups": {
"Ref": "LCSecurityGroups"
}
},
На дочернем шаблоне они объявлены точно так же.
"Parameters": {
"ELBSubnets": {
"Type": "CommaDelimitedList"
},
"LCKeyPair": {
"Type": "String"
},
"LCSecurityGroups": {
"Type": "CommaDelimitedList"
}
},
И на них ссылаются в этом методе в дочернем шаблоне.
"KeyName": {
"Ref": "LCKeyPair"
},
"SecurityGroups": {
"Fn::Join": [
",",
[
{
"Ref": "LCSecurityGroups"
}
]
]
}
},
Это еще одна часть шаблона.
"Subnets": {
"Fn::Join": [
",",
[
{
"Ref": "ELBSubnets"
}
]
]
}
},
Когда я пытаюсь использовать fn::join в главном шаблоне, он говорит
"Ошибка проверки шаблона: Ошибка шаблона: для каждого объекта Fn::Join требуются два параметра: (1) разделитель строк и (2) список строк, которые нужно объединить, или функция, которая возвращает список строк (например, Fn::GetAZs).
Когда я не использую fn::join в главном шаблоне, возникает ошибка
Значение свойства Параметры должны быть объектом со свойствами String (или простого типа)
Независимо от того, есть ли у меня fn::join по тем же параметрам в дочернем шаблоне.
Оба шаблона можно найти здесь: https://github.com/slimg00dy/Troposphere-CloudformationTests
3 ответа
Проблема в том, что при использовании Ref для CommaDelimitedList вы передаете список, поэтому он передает "[a,b,c]", а не "a,b,c"
Поэтому в главном шаблоне я использовал Join(",") для передачи списков и Join(" ") для передачи строк. Таким образом, они упоминаются как "a,b,c" и " String"
В дочернем шаблоне я установил параметры как CommaDelimitedLists для списков и String из String. Это из-за способа, которым они передаются из основного шаблона.
Затем я использовал Ref для дочернего шаблона без использования Join() для дочернего шаблона. Это создало CommaDelimitedLists в Lists, и строки, которые были объединены с помощью Join(" "), были переданы в виде строк.
Вот мое объявление параметров на главном шаблоне.
"Parameters": {
"ELBSubnets": {
"Default": "subnet-5d8fea67,subnet-3e35cf15",
"Type": "CommaDelimitedList"
},
"LCKeyPair": {
"Default": "key-master",
"Type": "CommaDelimitedList"
},
"LCSecurityGroups": {
"Default": "sg-10a15c74,sg-880e5fec",
"Type": "CommaDelimitedList"
}
},
Вот как я использовал Join(","), Join(" ") и Ref. Поскольку Ref преобразует CommaDelimitedLists в Lists, я использовал Join(","), чтобы сохранить их как CommaDelimitedLists и передать их дочернему шаблону.
Что касается строки KeyPair, я убедился, что она объявлена как CommaDelimitedList в родительском шаблоне и объединена с помощью Join(" "), что фактически превратило ее в строку при обращении к дочернему шаблону.
"Parameters": {
"ELBSubnets": {
"Fn::Join": [
",",
{
"Ref": "ELBSubnets"
}
]
},
"LCKeyPair": {
"Fn::Join": [
" ",
{
"Ref": "LCKeyPair"
}
]
},
"LCSecurityGroups": {
"Fn::Join": [
",",
{
"Ref": "LCSecurityGroups"
}
]
}
},
На дочернем шаблоне они объявлены так.
"Parameters": {
"ELBSubnets": {
"Type": "CommaDelimitedList"
},
"LCKeyPair": {
"Type": "String"
},
"LCSecurityGroups": {
"Type": "CommaDelimitedList"
}
},
И на них все обычно ссылаются без использования Join на дочернем шаблоне.
Subnets": {
"Ref": "ELBSubnets"
}
Там могло быть много разных способов сделать это. Я мог бы иметь объединения на дочернем шаблоне, а не на родительском шаблоне. Однако я предпочитаю, чтобы один шаблон был сложным, а остальные - максимально чистыми. Надеюсь, что это поможет другим.
Я также должен был быть в состоянии передать список в виде списка на дочернем шаблоне, однако затем я получил ошибку "Неизвестный тип параметра: список"
CommaDelimtedList может быть проанализирован только один раз, поэтому в родительском шаблоне необходимо установить тип как "String", а затем в дочернем шаблоне сохранить его как CommaDelimitedList, как и раньше.
Проблема возникает, потому что CloudFormation анализирует CommaDelimitedList в родительском шаблоне, а затем пытается снова проанализировать его в дочернем шаблоне.
Так что мой предыдущий ответ был немного запутанным - но я думаю, что основы остаются в силе. В конце вам не нужно присоединяться () к CommaDelimitedList, когда он используется в аргументе, который ожидает список. Я только что посмотрел ваши последние обновления репо, которым вы поделились, и думаю, что вы на правильном пути. Если вам нужна дополнительная помощь, дайте мне знать!