如何将 SSM 参数存储 StringList 正确映射到 Lambda VpcConfig 部分

blu*_*res 3 amazon-web-services aws-cloudformation

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

Key: /qa0/myService/lambda/subnetIds
Value: subnet-1234abcd, subnet-5678abcd
Type: StringList
Run Code Online (Sandbox Code Playgroud)

我想在 Cloudformation 模板中的 Lambda 的VpcConfig部分动态引用此参数,但我没有得到正确的结果。我尝试过很多不同的事情。另外,我使用一个参数来允许在多个环境中重用,因此该参数将填充为 qa0、qa1 等。StackEnv


VpcConfig:
    SecurityGroupIds: !Ref VpcSecurityGroupIds
    SubnetIds: !Sub '{{resolve:ssm:/${StackEnv}/myService/lambda/subnetIds:1}}'
Run Code Online (Sandbox Code Playgroud)

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


VpcConfig:
    SecurityGroupIds: !Ref VpcSecurityGroupIds
    SubnetIds: [!Split [",", !Sub '{{resolve:ssm:/${StackEnv}/myService/lambda/subnetIds:1}}']]
Run Code Online (Sandbox Code Playgroud)

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

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


如果我尝试将 SSM 参数定义为 Cloudformation 模板参数( AWS::SSM::Parameter::Value<List<String>>),我会遇到困难,因为我需要替换默认值StackEnv,而不是静态字符串,而静态字符串不受支持。该模板抱怨默认值必须是字符串。


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

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

我在这里做错了什么?

blu*_*res 6

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