如何在CloudFormation中通过SSM Parameter Store生成动态AllowedValues下拉列表
问题原因
首先明确CloudFormation的两个核心规则限制了你的原有写法生效:
AllowedValues属于模板静态校验规则,在模板提交到CloudFormation、控制台渲染参数表单时就会读取,这个阶段CloudFormation不会调用SSM接口解析动态值,也不支持在AllowedValues中使用{{resolve:ssm}}动态引用。AWS::SSM::Parameter::Value<List<String>>类型的参数作用是:你在创建堆栈时输入SSM参数路径,CloudFormation会在资源部署阶段自动拉取该路径对应的StringList值返回,该类型参数的AllowedValues只能限制允许输入的SSM路径,无法将路径对应的值填充为下拉选项。
解决方案
方案1:仅需动态获取值,不需要控制台下拉框
直接使用正确的SSM参数类型定义即可,不需要在AllowedValues中写动态引用:
Parameters: # S3存储桶场景 myS3Buckets: Type: AWS::SSM::Parameter::Value<List<String>> Default: /s3/lists # 可选:限制允许传入的SSM路径 AllowedValues: - /s3/lists - /s3/other-bucket-lists # EC2实例类型场景 InstanceTypesDynamic: Type: AWS::SSM::Parameter::Value<String> Default: /ec2/lists/default-type AllowedValues: - /ec2/lists/default-type - /ec2/lists/test-type
如果需要取StringList中的单个值,用!Select内置函数即可,比如取第一个存储桶:!Select [0, !Ref myS3Buckets]
方案2:需要控制台展示下拉选择框
因为CloudFormation控制台不会主动拉取SSM值渲染表单,所以需要在部署模板前做预处理,动态把SSM中的值填充到模板的AllowedValues中,示例流程如下:
- 编写预处理脚本(以bash为例,依赖aws cli):
# 拉取SSM中存储的实例类型列表,转换为YAML列表格式 INSTANCE_TYPE_ALLOWED=$(aws ssm get-parameter --name /ec2/lists --query Parameter.Value --output text | tr ',' '\n' | sed 's/^/ - /') # 拉取S3存储桶列表 S3_BUCKET_ALLOWED=$(aws ssm get-parameter --name /s3/lists --query Parameter.Value --output text | tr ',' '\n' | sed 's/^/ - /') # 渲染生成最终的CloudFormation模板 cat > final-cfn-template.yaml << EOF Parameters: InstanceTypesDynamic: Type: String AllowedValues: ${INSTANCE_TYPE_ALLOWED} myS3Buckets: Type: String AllowedValues: ${S3_BUCKET_ALLOWED} Resources: MyInstance: Type: AWS::EC2::Instance Properties: AvailabilityZone: us-east-1a ImageId: ami-0742b4e673072066f InstanceType: !Ref InstanceTypesDynamic EOF
- 执行脚本生成模板后,再用生成的模板创建堆栈,控制台就会正常展示带可选值的下拉框。每次SSM中的可选值更新后,重新执行一次脚本即可,不需要手动修改模板内容。
内容的提问来源于stack exchange,提问作者GeoCom
相关产品推荐
相关产品推荐

