如何在Terraform的file()中传递变量?CloudFront公钥配置报错修复
修复Terraform创建CloudFront公钥时的"This character is not used within the language"错误
问题场景
需按环境(dev/stage/prod)创建AWS CloudFront公钥,公钥文件存储在public-key-cf目录,命名格式为{env_name}.pem,但编写Terraform资源块时触发了"This character is not used within the language"错误。
错误原因及修复方案
该错误核心是Terraform代码中使用了语法不允许的字符,比如错误的变量引用格式、未转义的特殊符号,或文件路径/名称包含解析器无法识别的字符。以下是针对性修复步骤:
1. 修正公钥文件引用的变量插值语法
如果资源块中直接用{}包裹环境名而非Terraform标准变量语法,会触发解析错误。
- 错误示例:
resource "aws_cloudfront_public_key" "cf_public_key" { name = "cf-public-key-{var.env_name}" encoded_key = file("public-key-cf/{var.env_name}.pem") }
- 修复后(使用Terraform 0.12+支持的变量插值方式):
resource "aws_cloudfront_public_key" "cf_public_key" { name = "cf-public-key-${var.env_name}" encoded_key = file("public-key-cf/${var.env_name}.pem") }
2. 检查公钥文件内容的合法性
确保*.pem文件是标准格式:
- 必须以
-----BEGIN PUBLIC KEY-----开头,-----END PUBLIC KEY-----结尾 - 中间密钥内容为Base64编码,无多余特殊字符或换行错误
3. 规范环境变量的定义
确保env_name变量无非法字符,且仅允许指定的环境值:
variable "env_name" { type = string description = "Environment name (dev/stage/prod)" validation { condition = contains(["dev", "stage", "prod"], var.env_name) error_message = "Valid environment names are dev, stage, prod." } }
4. 验证文件路径的合规性
确保public-key-cf目录及对应*.pem文件存在于Terraform工作目录,路径不含中文、空格等特殊字符。若路径必须包含空格,需用引号包裹:
encoded_key = file("\"public-key-cf/${var.env_name}.pem\"")
(更推荐直接避免路径中使用空格)
验证修复
执行以下命令检查代码合法性:
terraform validate
验证通过后,可执行terraform plan预览资源创建计划。
内容的提问来源于stack exchange,提问作者Jatin Panchal
相关产品推荐
相关产品推荐

