首页 > 解决方案 > 如何将 SSM 参数存储 StringList 正确映射到 Lambda VpcConfig 部分

问题描述

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

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

我想在 Cloudformation 模板中的 Lambda 的VpcConfig部分中动态引用此参数,但我没有做对。我尝试了很多不同的东西。另外,我使用了一个参数来允许在多个环境中重用,所以这个参数将被填充为 qa0、qa1 等。StackEnv


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。

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


如果我尝试将 SSM 参数定义为 Cloudformation模板AWS::SSM::Parameter::Value<List<String>>参数(StackEnv模板抱怨 Default 必须是一个字符串。


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

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

我在这里做错了什么?

标签: amazon-web-servicesamazon-cloudformation

解决方案


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


推荐阅读