AWS CloudFormation CodePipeline、ParameterOverrides、将列表传递给嵌套堆栈

Posted

技术标签:

【中文标题】AWS CloudFormation CodePipeline、ParameterOverrides、将列表传递给嵌套堆栈【英文标题】:AWS CloudFormation CodePipeline, ParameterOverrides, pass list to a nested stack 【发布时间】:2020-06-28 11:08:33 【问题描述】:

问题的范围:

AWS CodeBuild,ParametersOverrides 部分

Using Parameter Override Functions with CodePipeline Pipelines

1) 我可以将字符串传递给 ParameterOverrides, 然后将它们传递给嵌套堆栈,如下所述

-创建字符串参数

-将其传递给 AWS CodeBuild 项目的 ParameterOverrides 部分

-解析嵌套堆栈中的参数

引用官方文档: AWS::CloudFormation::Stack

如果使用 Ref 函数将参数值传递给嵌套 堆栈,逗号分隔的列表参数必须是字符串类型。在 换句话说,您不能传递类型为 CommaDelimitedList 到嵌套堆栈。

2) 我不知道如何将列表转换为字符串 在具有以下配置的 ParameterOverrides 部分内:

- 定义列表类型的参数 服务子网: 类型:列表 说明:与服务关联的子网

-尝试在 ParameterOverrides 部分中将参数作为值传递 对于嵌套堆栈,应用 Join 函数将其转换为字符串

           ParameterOverrides: !Sub |
              
                "ImageURI" :  "Fn::GetParam" : [ "BuildOutput", "imageDetail.json", "ImageURI" ] ,
                "ApplicationRepoName": "$ApplicationRepoName",
                "Cluster": "$Cluster",
                "ListenerArn": "$ListenerArn",
                "TargetGroup": "$TargetGroup",
                "ServiceDesiredCount": "$ServiceDesiredCount",
                "ServiceLoadBalancerPath": "$ServiceLoadBalancerPath",
                "ServiceContainerPort": "$ServiceContainerPort",
                "ServiceSecurityGroups":  "Fn::Join" : [ ",", "$ServiceSecurityGroups"] ] ,
                "ServiceSubnets":  "Fn::Join" : [ ",", "$ServiceSubnets" ] ,
                "TaskContainerPort": "$TaskContainerPort",
                "TaskCpu": "$TaskCpu",
                "TaskMemory": "$TaskMemory",
                "TaskExecutionRoleArn": "$TaskExecutionRoleArn"
              

所以我希望 List 应该转换为 String 和 String 应该传递然后在嵌套堆栈中使用,但是, 尝试部署此类堆栈返回错误:

模板错误:Fn::Sub 表达式中的变量 ServiceSecurityGroups 不解析为字符串

我的问题:

是否可以在 ParameterOverrides 部分中使用 Join 函数 将列表转换为字符串?

如果是的话,如果你能分享,我将不胜感激 和我一起举一些例子来说明如何做到这一点。

谢谢。

【问题讨论】:

【参考方案1】:

很遗憾,您不能在 Fn::Sub 中使用内部函数 Syntax Reference

您仍然可以在 Fn::Sub 变量映射中使用其他内部函数,例如 Fn::Join。因此,您的 ParameterOverrides 将改为:

ParameterOverrides: !Sub 
  - |
    
      "ImageURI" :  "Fn::GetParam" : [ "BuildOutput", "imageDetail.json", "ImageURI" ] ,
      "ApplicationRepoName": "$ApplicationRepoName",
      "Cluster": "$Cluster",
      "ListenerArn": "$ListenerArn",
      "TargetGroup": "$TargetGroup",
      "ServiceDesiredCount": "$ServiceDesiredCount",
      "ServiceLoadBalancerPath": "$ServiceLoadBalancerPath",
      "ServiceContainerPort": "$ServiceContainerPort",
      "ServiceSecurityGroups": "$KEY_NAME_1",
      "ServiceSubnets": "$KEY_NAME_2",
      "TaskContainerPort": "$TaskContainerPort",
      "TaskCpu": "$TaskCpu",
      "TaskMemory": "$TaskMemory",
      "TaskExecutionRoleArn": "$TaskExecutionRoleArn"
    
 - KEY_NAME_1: !Join [ ",", [ !Ref ServiceSecurityGroups ] ]
   KEY_NAME_2: !Join [ ",", [ !Ref ServiceSubnets ] ]

如果您的 ServiceSecurityGroups 和 ServiceSubnets 已经是列表,则删除 !Ref 语句周围的方括号。

【讨论】:

以上是关于AWS CloudFormation CodePipeline、ParameterOverrides、将列表传递给嵌套堆栈的主要内容,如果未能解决你的问题,请参考以下文章

将现有 AWS 资源整合到 CloudFormation 堆栈中

AWS Cloudformation的相关概念

CloudFormation - 将标签应用于其他 AWS 资源

AWS CloudFormation:Cognito LambdaTrigger CustomEmailSender - 属性“AWS CloudFormation 目前不支持。”和 CDK 的使用

AWS学习笔记--利用CloudFormation管理AWS资源

AWS — AWS CloudFormation