Terraform如何实现可选AWS SSM参数查询 避免不存在时报错
可选SSM参数查询实现方案
你可以根据自己使用的AWS Provider版本选择以下两种方案:
方案1:AWS Provider >= v5.30.0 最简实现
新版本AWS Provider的aws_ssm_parameter数据源已经内置了ignore_missing参数,开启后参数不存在时不会抛出报错,直接返回空值:
data "aws_ssm_parameter" "server_tags" { name = "/${var.env_number}/server_tags" # 开启忽略不存在的参数 ignore_missing = true # 如果是SecureString类型参数,需要加下面的配置解密 # with_decryption = true }
对应的locals逻辑调整如下即可:
locals { server_tags = data.aws_ssm_parameter.server_tags.value != null ? jsondecode(data.aws_ssm_parameter.server_tags.value) : {} instance_tags = merge(var.instance_tags, local.server_tags) }
方案2:旧版本Provider兼容实现
如果你的AWS Provider版本低于v5.30.0,可以结合aws_ssm_parameters_by_path数据源做存在性校验,再用count控制数据源是否执行查询:
- 先查询对应环境路径下的所有SSM参数列表
data "aws_ssm_parameters_by_path" "env_params" { path = "/${var.env_number}/" recursive = false # 需要取参数值的话可以加with_decryption = true }
- 只有目标参数存在时才执行实际的参数查询
data "aws_ssm_parameter" "server_tags" { count = contains(data.aws_ssm_parameters_by_path.env_params.names, "/${var.env_number}/server_tags") ? 1 : 0 name = "/${var.env_number}/server_tags" # with_decryption = true }
- 调整locals取值逻辑兼容count为0的情况
locals { server_tags = length(data.aws_ssm_parameter.server_tags) > 0 ? jsondecode(data.aws_ssm_parameter.server_tags[0].value) : {} instance_tags = merge(var.instance_tags, local.server_tags) }
内容的提问来源于stack exchange,提问作者CallumVass
相关产品推荐
相关产品推荐

