簡體   English   中英

將值從父堆棧傳遞到 Cloudformation 的嵌套堆棧

[英]Passing values from parent stack to nested stack for 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.
    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


部分子模板如下:

Parameters:
  AccountName:
    Description: Please Enter valid Account Name.
    Type: String
    Default: citi
  Region:
    Description: Enter Region
    Type: String
    Default: us-east-2

  S3BucketName:
    Type: "String"
    Default: ""

  S3KeyName:
    Type: "String"
    Default: "MeghFlow-DBConnMgmt-Lambda-DBConnMgmtFunction.zip"

testLambda:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: 
        Bucket: !Ref S3BucketName
        Key: !Ref S3KeyName
      Handler: com.testff.testinghand.dbconnmgmt.lambda.testLambda::handleRequest
      Runtime: java8
      MemorySize: 1024
      Policies: AmazonDynamoDBFullAccess
      Environment:
        Variables:
          REGION: us-east-2
          DYNAMODB_NAME: DBConnectionInfo

ArtifactBucket:
  Type: AWS::S3::Bucket
  DeletionPolicy: Delete
  Properties:
    BucketName:  !Sub ${AccountName}-${Region}-artifacts
    AccessControl: PublicReadWrite
    VersioningConfiguration:
    Status: Suspended

問題:我不太確定如何將輸入參數從父級傳遞給子級。 我提到了幾個鏈接,但我更困惑於何時輸入類型必須是 CommaDelimitedList 還是字符串。 我什至嘗試在父級和子級中將 param 類型保持為字符串,但仍然出現以下錯誤:“屬性參數的值必須是具有字符串(或簡單類型)屬性的對象”,並且在使用 Fn::join 時出現如下錯誤:“Fn::Join 對象需要兩個參數,(1) 字符串分隔符和 (2) 要連接的字符串列表或返回要連接的字符串列表(例如 Fn::GetAZs)的函數。”

已引用鏈接: 嘗試將參數從 Master 傳遞到子模板但沒有運氣。 任何人都可以指導我正確的方向。 提前致謝。

感謝@gandaliter 的指導。 根據上面標記的答案 CloudFormation 父堆棧只接受字符串而不接受任何對象級參數(參數下的子參數就像我上面代碼中的 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

        ```

我想您上面給出的代碼並不是您嘗試過的唯一組合,並且參數在您的父級和子級堆棧之間並不完全一致,但無論如何,問題在於您正在嘗試給出以下參數值:

CodeUri:
  Bucket: Fn:Join [ ' ', [!Ref S3BucketName] ]
  Key: Fn::Join [ ' ', [!Ref S3KeyName] ]

VersioningConfiguration:
  Status: Suspended

這兩個都是對象,而不是“字符串(或簡單類型)屬性”。 錯誤是說整個Parameters對象必須只有簡單的值。

順便說一下, TemplateURL需要在Parameters對象之外。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM