【问题标题】:How to properly map an SSM parameter store StringList to a Lambda VpcConfig section如何将 SSM 参数存储 StringList 正确映射到 Lambda VpcConfig 部分
【发布时间】:2020-01-18 02:35:27
【问题描述】:

我是 Cloudformation 的新手(来自 Terraform)。我在 SSM 中有一个参数

Key: /qa0/myService/lambda/subnetIds
Value: subnet-1234abcd, subnet-5678abcd
Type: StringList

我想 dynamically reference Cloudformation 模板中 Lambda 的 VpcConfig 部分中的此参数,但我没有做对。我尝试了很多不同的东西。另外,我使用StackEnv 参数来允许在多个环境中重复使用,因此该参数将填充为 qa0、qa1 等。


VpcConfig:
    SecurityGroupIds: !Ref VpcSecurityGroupIds
    SubnetIds: !Sub '{{resolve:ssm:/${StackEnv}/myService/lambda/subnetIds:1}}'

结果:“属性 SubnetIds 的值必须是字符串列表类型”


VpcConfig:
    SecurityGroupIds: !Ref VpcSecurityGroupIds
    SubnetIds: [!Split [",", !Sub '{{resolve:ssm:/${StackEnv}/myService/lambda/subnetIds:1}}']]

结果:“子网 ID 'subnet-1234abcd,subnet-5678abcd' 不存在”。由于某种原因,它没有在这里拆分 StringList。

编辑:在 cmets 中建议的 404 将 Split 从数组中取出 (SubnetIds: !Split [ ",", !Sub '{{resolve:ssm:/${StackEnv}/myService/lambda/subnetIds:1}}']) 得到相同的结果。


如果我尝试defining the SSM parameter as a Cloudformation template parameter (AWS::SSM::Parameter::Value<List<String>>),我会卡住,因为我需要使用默认值替换StackEnv,而不是静态字符串,这是不受支持的。模板抱怨 Default 必须是字符串。


我尝试了将动态查找结果嵌套在方括号中的各种版本,但没有成功:

SubnetIds: [ !Sub '{{resolve:ssm:/${StackEnv}/myService/lambda/subnetIds:1}}' ]

我在这里做错了什么?

【问题讨论】:

  • Split 返回一个数组,所以不要放在数组中:SubnetIds: [!Split -> SubnetIds: !Split
  • 似乎无关紧要。编辑我的问题以涵盖数组之外的!Split

标签: amazon-web-services amazon-cloudformation


【解决方案1】:

我通过 AWS 官方支持确认 - CloudFormation 是“在此处的内联引用之前执行内部函数,这是 CloudFormation 的错误行为。” (他们的话)需要明确的是,对于我和这个 SubnetIds 字段来说,错误的行为是 100% 一致的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-13
    相关资源
    最近更新 更多