Попытка передать параметры от Мастера к дочернему шаблону

Я пытаюсь передать параметры списка от основного к дочернему шаблону, но я сталкиваюсь с двумя ошибками. Это мои текущие параметры в главном шаблоне.

"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, когда он используется в аргументе, который ожидает список. Я только что посмотрел ваши последние обновления репо, которым вы поделились, и думаю, что вы на правильном пути. Если вам нужна дополнительная помощь, дайте мне знать!

Другие вопросы по тегам