Amazon web services 为Cloudformation将值从父堆栈传递到嵌套堆栈
我是嵌套堆栈的新手,我正在尝试将输入参数从父模板传递到子模板。我的父堆栈如下所示:Amazon web services 为Cloudformation将值从父堆栈传递到嵌套堆栈,amazon-web-services,amazon-cloudformation,Amazon Web Services,Amazon Cloudformation,我是嵌套堆栈的新手,我正在尝试将输入参数从父模板传递到子模板。我的父堆栈如下所示: AWSTemplateFormatVersion: "2010-09-09" Transform: 'AWS::Serverless-2016-10-31' Description: "ParentStack with all child stack" Parameters: AccountName: Description: Please Enter valid Account Name.
AWSTemplateFormatVersion: "2010-09-09"
Transform: 'AWS::Serverless-2016-10-31'
Description: "ParentStack with all child stack"
Parameters:
AccountName:
Description: Please Enter valid Account Name.
Type: "CommaDelimitedList"
Default: "citi"
Region:
Description: Enter Region
Type: "CommaDelimitedList"
Default: "us-east-2"
S3BucketName:
Type: "CommaDelimitedList"
Default: ""
S3KeyName:
Type: "CommaDelimitedList"
Default: "Test-LambdaFunction.zip"
Resources:
LambdaStack1:
Type: "AWS::CloudFormation::Stack"
Properties:
Parameters:
TemplateURL: https://test272t3.s3.us-east-2.amazonaws.com/CFTemplates/lambda.yaml
CodeUri:
Bucket: Fn:Join [ ' ', [!Ref S3BucketName] ]
Key: Fn::Join [ ' ', [!Ref S3KeyName] ]
S3Stack:
Type: AWS::CloudFormation::Stack
Properties:
TemplateURL: https://test272t3.s3.us-east-2.amazonaws.com/CFTemplates/s3child.yaml
Parameters:
BucketName: <<not sure how !sub can be paased in parent stack>>
AccessControl: PublicReadWrite
VersioningConfiguration:
Status: Suspended
问题:我不太确定如何将输入参数从父级传递到子级。我引用了一些链接,比如,但我更困惑的是,输入类型何时必须是CommaDelimitedList vs string。我甚至尝试在父级和子级中保持参数类型为字符串,但仍然出现以下错误:
“属性参数的值必须是具有字符串(或简单类型)属性的对象”
在使用Fn::join时,出现如下错误:
Fn::Join对象需要两个参数,(1)字符串分隔符,(2)要连接的字符串列表或返回要连接的字符串列表(如Fn::GetAZs)的函数
有参考链接:但没有运气。
谁能给我指一下正确的方向吗。提前感谢。我想您上面给出的代码并不是您尝试过的唯一组合,而且参数在父堆栈和子堆栈之间并不完全对齐,但在任何情况下,问题是您试图给出以下参数值:
CodeUri:
Bucket: Fn:Join [ ' ', [!Ref S3BucketName] ]
Key: Fn::Join [ ' ', [!Ref S3KeyName] ]
及
这两个都是对象,而不是“字符串(或简单类型)属性”。错误是整个参数对象必须只有简单的值
顺便说一句,TemplateURL
需要超出参数
对象。我想您上面给出的代码不是您尝试过的唯一组合,并且参数在父堆栈和子堆栈之间并不完全对齐,但在任何情况下,问题是您试图给出以下参数值:
CodeUri:
Bucket: Fn:Join [ ' ', [!Ref S3BucketName] ]
Key: Fn::Join [ ' ', [!Ref S3KeyName] ]
及
这两个都是对象,而不是“字符串(或简单类型)属性”。错误是整个参数对象必须只有简单的值
顺便说一句,TemplateURL
需要超出参数
对象。感谢@gandaliter的指导。根据上面标记的答案,父堆栈只接受字符串,不接受任何对象级参数(参数下的子参数就像我上面代码中的CodeURI)。我做了一些调整,并将所有父模板更改为以下内容:
注意:在子模板和父模板中,所有参数类型都设置为字符串
AWSTemplateFormatVersion: "2010-09-09"
Transform: 'AWS::Serverless-2016-10-31'
Description: "ParentStack with all child stack"
Parameters:
apiGatewayStageName:
Type: String
Default: "dev"
HandlerName:
Type: String
Default: "com.test.tehgsaLambda::handleRequest"
S3BucketName:
Type: String
Default: ""
S3KeyName:
Type: String
Default: "Test-LambdaFunction.zip"
Resources:
LambdaStack1:
Type: AWS::CloudFormation::Stack
Properties:
TemplateURL:
Fn::Sub: "https://testyu2y73.s3.us-east-2.amazonaws.com/CFTemplates/lambda.yaml"
Parameters:
S3BucketName: !Ref S3BucketName
S3KeyName: !Ref S3KeyName
HandlerName: !Ref HandlerName
apiGatewayStageName: !Ref apiGatewayStageName
```
感谢@gandaliter的指导。根据上面标记的答案,父堆栈只接受字符串,不接受任何对象级参数(参数下的子参数就像我上面代码中的CodeURI)。我做了一些调整,并将所有父模板更改为以下内容:
注意:在子模板和父模板中,所有参数类型都设置为字符串
AWSTemplateFormatVersion: "2010-09-09"
Transform: 'AWS::Serverless-2016-10-31'
Description: "ParentStack with all child stack"
Parameters:
apiGatewayStageName:
Type: String
Default: "dev"
HandlerName:
Type: String
Default: "com.test.tehgsaLambda::handleRequest"
S3BucketName:
Type: String
Default: ""
S3KeyName:
Type: String
Default: "Test-LambdaFunction.zip"
Resources:
LambdaStack1:
Type: AWS::CloudFormation::Stack
Properties:
TemplateURL:
Fn::Sub: "https://testyu2y73.s3.us-east-2.amazonaws.com/CFTemplates/lambda.yaml"
Parameters:
S3BucketName: !Ref S3BucketName
S3KeyName: !Ref S3KeyName
HandlerName: !Ref HandlerName
apiGatewayStageName: !Ref apiGatewayStageName
```
你好是的,我试了很多次,现在都迷路了。我对上述答案有点困惑。您的意思是,仅使用字符串类型可以帮助我解决问题吗。同样从上面的“错误是说整个参数对象必须只有简单的值”,这是否意味着我们不能参数化它们?我有点困惑,你能在这里帮助我吗?在你的问题中,你已经给了子模板中的所有参数定义字符串类型,但是在主堆栈中给参数赋值的地方,你使用的是混合类型,包括我上面列出的对象。这些就是它所抱怨的。从参数的角度来看,上面的子模板看起来不错。如果您编写一个主堆栈来设置您定义的属性,那么它将起作用。在你给出的一个例子中,看起来你试图设置嵌套属性,这不是一件事。是的,我整合了我所有的模板来编写一个主堆栈,效果很好。如果我想使用nestedstack,请您指出我的父堆栈中需要做哪些更改。请告诉我最好的方法是什么..当你拆分堆栈时,只需确保只使用简单的键即可。如果你想通过一个完整的块,那么你必须把它分割成几个关键点,并在子堆栈而不是父堆栈中构造块。考虑分配给参数的值是什么,如果您发送的是具有子键的内容,请将其拆分(如问题中的CodeUri,它需要拆分为两个单独的参数)。您可以随意命名它们,因为您将在子堆栈中按名称引用它们。您好。。是的,我试了很多次,现在都迷路了。我对上述答案有点困惑。您的意思是,仅使用字符串类型可以帮助我解决问题吗。同样从上面的“错误是说整个参数对象必须只有简单的值”,这是否意味着我们不能参数化它们?我有点困惑,你能在这里帮助我吗?在你的问题中,你已经给了子模板中的所有参数定义字符串类型,但是在主堆栈中给参数赋值的地方,你使用的是混合类型,包括我上面列出的对象。这些就是它所抱怨的。从参数的角度来看,上面的子模板看起来不错。如果您编写一个主堆栈来设置您定义的属性,那么它将起作用。在你给出的一个例子中,看起来你试图设置嵌套属性,这不是一件事。是的,我整合了我所有的模板来编写一个主堆栈,效果很好。如果我想使用nestedstack,请您指出我的父堆栈中需要做哪些更改。请告诉我最好的方法是什么..当你拆分堆栈时,只需确保只使用简单的键即可。如果你想通过一个完整的块,那么你必须把它分割成几个关键点,并在子堆栈而不是父堆栈中构造块。考虑分配给参数的值是什么,如果您发送的是具有子键的内容,请将其拆分(如CodeUri)