マスターテンプレートから子テンプレートにリストパラメーターを渡そうとしていますが、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
問題は、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つのテンプレートを複雑に保ち、残りをできるだけクリーンに保つことを好みます。これが他の人の助けになることを願っています。
また、子テンプレートのリストとしてリストを渡すことができたはずですが、「不明なパラメーターの種類:リスト」というエラーが表示されました。
CommaDelimtedListは1回しか解析できないため、parentテンプレートでは、タイプを「String」に設定する必要があります。次に、childテンプレートでは、CommaDelimitedListとして保持します。前。
CloudFormationが親テンプレートのCommaDelimitedListを解析していて、子テンプレートで再度解析しようとしているため、問題が発生しています。
ですから、私の以前の答えは少し紛らわしいものでしたが、基本はまだ残っていると思います。結局、リストを期待する引数で使用される場合、CommaDelimitedListをJoin()する必要はありません。共有したリポジトリの最新の更新を確認しましたが、順調に進んでいると思います。さらにサポートが必要な場合は、お知らせください。