18

マスター テンプレートから子テンプレートにリスト パラメーターを渡そうとしていますが、2 つのエラーが発生しています。これらは、マスター テンプレートの現在のパラメーターです。

"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:: など) の 2 つのパラメーターが必要です。 GetAZs) に参加します。」

マスター テンプレートで fn::join を使用しない場合、エラーは

プロパティ パラメータの値は、文字列 (または単純型) プロパティを持つオブジェクトである必要があります

子テンプレートの同じパラメーターに fn::join があるかどうかに関係なく。

どちらのテンプレートもここにあります: https://github.com/slimg00dy/Troposphere-CloudformationTests

4

3 に答える 3

21

問題は、CommaDelimitedList で Ref を使用する場合、リストを渡すため、"a,b,c" ではなく "[a,b,c]" を渡すことです。

そのため、マスター テンプレートでは、リストを渡すために Join(",") を使用し、文字列を渡すために Join(" ") を使用しました。このようにして、それらは「a、b、c」および「文字列」として参照されます

子テンプレートでは、パラメーターをリストの CommaDelimitedLists と文字列からの文字列として設定しました。これは、マスター テンプレートから渡される方法が原因です。

次に、子テンプレートで Join() を使用せずに、子テンプレートで Ref を使用しました。これにより、CommaDelimitedLists が Lists に作成され、文字列として渡される Join(" ") で結合された Strings が作成されました。

マスター テンプレートのパラメーター宣言は次のとおりです。

"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 String については、親テンプレートで 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"
            }

これを行うには、さまざまな方法があった可能性があります。親テンプレートではなく、子テンプレートに結合することもできました。しかし、私は 1 つのテンプレートを複雑にし、残りはできるだけ簡潔にすることを好みます。これが他の人に役立つことを願っています。

また、リストを子テンプレートのリストとして渡すこともできたはずですが、「不明なパラメーターの型: リスト」というエラーが表示されました。

于 2015-05-23T14:47:28.300 に答える
6

CommaDelimtedList は 1 回しか解析できないため、テンプレートでは型を「文字列」として設定し、テンプレートでは以前と同様に CommaDelimitedList として保持する必要があります。

CloudFormation が親テンプレートで CommaDelimitedList を解析し、子テンプレートで再度解析しようとしているため、問題が発生しています。

于 2015-08-18T10:35:17.893 に答える