计划时Terraform输出“错误:不允许变量”

时间:2019-11-05 14:02:14

标签: terraform

我在variables.tf中声明了一个变量,如下所示:

variable "MyAmi" {
  type = map(string)
}

但是当我这样做时:

terraform plan -var 'MyAmi=xxxx'

我得到:

Error: Variables not allowed

  on <value for var.MyAmi> line 1:
  (source code not available)

Variables may not be used here.

最小代码示例:

test.tf

provider "aws" {
}

# S3
module "my-s3" {
  source = "terraform-aws-modules/s3-bucket/aws"

  bucket = "${var.MyAmi}-bucket"
}

variables.tf

variable "MyAmi" {
  type = map(string)
}

terraform plan -var 'MyAmi=test'

Error: Variables not allowed

  on <value for var.MyAmi> line 1:
  (source code not available)

Variables may not be used here.

有什么建议吗?

3 个答案:

答案 0 :(得分:1)

我看到可能导致您看到错误的两件事。链接到terraform plan documentation

  1. 运行terraform plan时,它将自动加载当前目录中的所有.tfvars文件。如果您的.tfvars文件在另一个目录中,则必须将其作为-var-file参数提供。您在问题中说您的变量在文件variables.tf中,这意味着terraform plan命令不会自动加载该文件。 FIX:将variables.tf重命名为variables.tfvars

  2. 使用-var参数时,应确保HCL正确解释要传递给它的内容。如果您要传递的变量是一个映射,则该变量必须可解析为映射。

我期望的不是terraform plan -var 'MyAmi=xxxx',而是terraform plan -var 'MyAmi={"us-east-1":"ami-123", "us-east-2":"ami-456"}'

有关声明变量并通过命令行专门传递变量的更多信息,请参见此documentation

答案 1 :(得分:0)

尝试从动态资源(例如,子模块的输出)设置变量的值时,也会发生此错误:

{
  "message" : {
    "_0": "first part ",
    "_1": "after first variable. ",
    "_2": "after another variable"
  }
}

使用${message._0}${variable}${message._1}${var2}${message._2}块代替变量将解决此问题:

variable  "some_arn" {
  description = "Some description"
  default     = module.some_module.some_output # <--- Error: Variables not allowed
}

答案 2 :(得分:0)

我遇到了同样的错误,但就我而言,我忘记将变量值括在 terraform.tfvars 文件中的引号 (" ") 内。

这在官方 terraform 存储库中记录为问题: https://github.com/hashicorp/terraform/issues/24391