Передача значений из родительского стека во вложенный стек для Cloudformation - PullRequest
1 голос
/ 20 января 2020

Я новичок во вложенном стеке и пытаюсь передать входные параметры из родительского в дочерний шаблон. Мой родительский стек выглядит следующим образом:

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 против строки. Я даже пытался сохранить тип параметра в строке как родительского, так и дочернего, но все же я получаю ошибку ниже: «Значение свойства Параметры должны быть объектом со свойствами String (или простого типа)» и при использовании Fn :: join получаю ошибку, как показано ниже : «Для объекта Fn :: Join требуются два параметра: (1) разделитель строк и (2) список строк, которые нужно объединить, или функция, которая возвращает список строк (таких как Fn :: GetAZs), которые нужно объединить.»

Ссылка на ссылку: Попытка передать параметры от Мастера к дочернему шаблону , но безуспешно. Может кто-нибудь направить меня в правильном направлении, пожалуйста. Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 20 января 2020

Спасибо @gandaliter за ваше руководство. В соответствии с отмеченным выше ответом родительский стек CloudFormation принимает только строки, а не какие-либо параметры уровня объекта (подпараметры под параметрами, как у CodeURI в моем коде выше). Я сделал несколько настроек и изменил весь родительский шаблон на следующий: Примечание. Для всех типов параметров установлено значение String в дочернем и родительском шаблоне

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

        ```
0 голосов
/ 20 января 2020

Я полагаю, что приведенный выше код - не единственная комбинация, которую вы пробовали, и параметры не совсем совпадают между вашим родительским и дочерним стеком, но в любом случае проблема заключается в том, что вы ' мы пытаемся дать значения параметров:

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

и

VersioningConfiguration:
  Status: Suspended

Оба эти объекта являются объектами, а не «свойствами String (или простого типа)». Ошибка говорит о том, что весь объект Parameters должен иметь только простые значения.

Кстати, TemplateURL необходимо go вне объекта Parameters.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...