2

我正在编写创建 AWS Service Catalog 产品的 AWS CloudFormation 模板(使用 yaml)。我正在使用参数 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

我尝试使用 !Sub 和 !Ref 替换 URL,如下所示:

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?谢谢。

4

3 回答 3

1

您可以直接在内部引用任何参数或 LogicalResourceId,!Sub如下所示:

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

这应该工作得很好。当您想在!Sub.

于 2020-08-06T19:30:59.493 回答
1

这是一个示例: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}
于 2020-08-06T17:21:43.893 回答
0

我认为应该很简单:

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

这至少是我在自己的AWS::ServiceCatalog::CloudFormationProduct模板中所拥有的。

      ProvisioningArtifactParameters: 
        - DisableTemplateValidation: false
          Info: 
            LoadTemplateFromURL: !Ref S3FilePath
于 2020-08-07T00:24:12.423 回答