web-dev-qa-db-ja.com

マスターから子テンプレートにパラメーターを渡そうとしています

マスターテンプレートから子テンプレートにリストパラメーターを渡そうとしていますが、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

12
Mo Ali

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

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

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

次に、子テンプレートでJoin()を使用せずに、子テンプレートでRefを使用しました。これにより、CommaDelimitedListsがリストに作成され、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をリストに変換するので、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"
    }
},

そして、それらはすべて、子テンプレートで結合を使用せずに通常どおり参照されます。

Subnets": {
                "Ref": "ELBSubnets"
            }

これを行うには、さまざまな方法が考えられます。親テンプレートではなく、子テンプレートに結合を設定することもできます。ただし、1つのテンプレートを複雑に保ち、残りをできるだけクリーンに保つことを好みます。これが他の人の助けになることを願っています。

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

12
Mo Ali

CommaDelimtedListは1回しか解析できないため、parentテンプレートでは、タイプを「String」に設定する必要があります。次に、childテンプレートでは、CommaDelimitedListとして保持します。前。

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

4
Tom Kerswill

ですから、私の以前の答えは少し紛らわしいものでしたが、基本はまだ残っていると思います。結局、リストを期待する引数で使用される場合、CommaDelimitedListをJoin()する必要はありません。共有したリポジトリの最新の更新を確認しましたが、順調に進んでいると思います。さらにサポートが必要な場合は、お知らせください。

0
phobologic