如何通过Terraform创建AWS SSM Parameter并传入JSON格式参数值
报错根因
你遇到的Extra characters after interpolation expression错误是因为jsonencode({my-json})不符合Terraform语法规范:jsonencode的入参必须是合法的Terraform对象结构,如果你直接传入原生JSON内容或者错误的占位符,就会因为特殊字符识别失败触发报错。
正确实现方案
根据你的使用场景,有两种常见的实现方式:
- 场景1:JSON内容已保存在本地文件
已经序列化完成的JSON字符串不需要再次用jsonencode包装,直接用file函数读取文件内容即可:
resource "aws_ssm_parameter" "my-cloudwatch" { name = "my-cloudwatch" type = "String" value = file("./cloudwatch_config.json") # 替换为你的JSON文件实际路径 }
- 场景2:JSON结构直接在Terraform代码中定义
如果不想单独维护JSON文件,可以把JSON字段转换为Terraform对象格式传入jsonencode,不需要手动写引号、冒号等JSON原生语法:
resource "aws_ssm_parameter" "my-cloudwatch" { name = "my-cloudwatch" type = "String" value = jsonencode({ region = "cn-north-1" metric_name = "CPUUtilization" threshold = 80 # 按实际需求补充其他字段即可 }) }
跨区域部署补充配置
因为你需要跨区域复制参数,需要提前配置目标区域的AWS Provider,还可以直接通过数据源读取源区域参数实现自动同步,无需手动维护本地文件:
# 源区域Provider(示例为北京区) provider "aws" { alias = "cn-north-1" region = "cn-north-1" } # 目标区域Provider(示例为宁夏区) provider "aws" { alias = "cn-northwest-1" region = "cn-northwest-1" } # 读取源区域已有SSM参数 data "aws_ssm_parameter" "source_param" { provider = aws.cn-north-1 name = "my-cloudwatch" } # 在目标区域创建相同参数 resource "aws_ssm_parameter" "target_param" { provider = aws.cn-northwest-1 name = data.aws_ssm_parameter.source_param.name type = data.aws_ssm_parameter.source_param.type value = data.aws_ssm_parameter.source_param.value }
内容的提问来源于stack exchange,提问作者pvpkiran
相关产品推荐
相关产品推荐

