AWS CloudFormation - с помощью! Ref внутри! Sub - PullRequest
2 голосов
/ 06 августа 2020

Я пишу AWS шаблон CloudFormation (с использованием yaml), который создает AWS Service Catalog Product. Я получаю шаблон для продукта, используя параметр S3FilePath, который имеет значение, подобное указанному выше пути: https://bucket.s3-eu-west-1.amazonaws.com/template.yml. URL-адрес файла необходимо отправить в формате JSON, как показано здесь (этот пример работает):

Resources:
    Type: AWS::ServiceCatalog::CloudFormationProduct
    Properties: 
      Description: Example Product
      Distributor: xyz
      Name: ExampleProduct
      Owner: xyz
      ProvisioningArtifactParameters: 
        - Description: Example Product
          Info: { "LoadTemplateFromURL": "https://bucket.s3-eu-west-1.amazonaws.com/template.yml" }
          Name: Version1

Я попытался заменить URL-адрес с помощью! Sub и! Ref, как показано ниже:

Parameters:
  S3FilePath:
      Type: String
      Description: file name
Resources:
    Type: AWS::ServiceCatalog::CloudFormationProduct
    Properties: 
      Description: Example Product
      Distributor: xyz
      Name: ExampleProduct
      Owner: xyz
      ProvisioningArtifactParameters: 
        - Description: Example Product
          Info: !Sub
            - '{ "LoadTemplateFromURL": "${FILEPATH}" }'
            - {FILEPATH: !Ref S3FilePath}
          Name: Version1

Но стек CloudFormation не работает с ошибкой: «недопустимый ввод». Думаю, я неправильно строю JSON, я пытался использовать \ перед каждым '"', но это тоже не помогло, и я не смог найти пример, объясняющий, как это правильно построить. Нет проблема с параметром S3FilePath.

Не могли бы вы посоветовать, как правильно использовать! Sub и! Ref для сборки JSON? Спасибо.

Ответы [ 3 ]

1 голос
/ 06 августа 2020

Вы можете ссылаться на любой Parameters или LogicalResourceId прямо внутри !Sub, например:

  ProvisioningArtifactParameters: 
    - Description: Example Product
      Info: !Sub '{ "LoadTemplateFromURL": "${S3FilePath}" }'
      Name: Version1

Это должно работать нормально. То, как вы делали замены, полезно, когда вы хотите использовать условия и / или отображение внутри !Sub.

1 голос
/ 06 августа 2020

Вот пример: https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html#w2ab1c25c28c59c11

Несмотря на то, что в документации указано, что параметр Info равен JSON, в примере показана только пара имя / значение (карта): https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-servicecatalog-cloudformationproduct-provisioningartifactproperties.html

Попробуйте отформатировать строку как

Info: !Sub
  - "LoadTemplateFromURL": "${FILEPATH}"
  - {FILEPATH: !Ref S3FilePath}
0 голосов
/ 07 августа 2020

Думаю, это должно быть просто:

     ProvisioningArtifactParameters: 
        - Description: Example Product
          Info: 
            LoadTemplateFromURL: !Ref S3FilePath
          Name: Version1

Это по крайней мере то, что у меня есть в своих AWS::ServiceCatalog::CloudFormationProduct шаблонах.

      ProvisioningArtifactParameters: 
        - DisableTemplateValidation: false
          Info: 
            LoadTemplateFromURL: !Ref S3FilePath
...