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)