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 堆栈中
CloudFormation - 将标签应用于其他 AWS 资源
AWS CloudFormation:Cognito LambdaTrigger CustomEmailSender - 属性“AWS CloudFormation 目前不支持。”和 CDK 的使用