Terraform 数据结构:对象和对象列表问题

Terraform data structures: object and list of object issue

我正在尝试使用 terraform 创建一些 aws 资源。 这是我的问题:

我正在创建一些变量,因此我可以从资源中访问它们。 这是 variables.tf 文件内容:

variables.tf

variable "zones" {
  type = "list"
  default = ["us-east-1a", "us-east-1b"]
}

variable "init" {
    type = object({
                    vpc-id=list(string),
                    public-subnet=string, 
                    aws_region=string, 
                    ami=string,
                    vpc-sec-group= list(string)
            })

    param = {
        vpc-id = ["vpc-1111111"]
        public-subnet = "subnet-98e4567"
        aws_region = "${element(var.zones,0)}"
        ami = "ami-09d95fab7fff3776c",
        vpc-sec-group = ["sg-d60bf3f5"]
    }
}


variable "instances" {
    type = list(object({ type=string, count=string, tags=map(string) }))
    t2-micro ={
        type = "t2.micro"
        count = 4
        tags = { Name = "Test T2"}
    }
    m4-large ={
        type = "m4-large"
        count = 2
        tags = { Name = "Test M4"}
    }
}

我的计划是使用这些变量来创建一些 ec2 实例 这里是ec2.tf

ec2.tf

resource "aws_instance" "Test-T2" {
    type   = lookup(var.insts["t2-micro"],"type")
    ami = lookup(var.init.ami["ami"],var.init.aws_region["aws_region"] )
    count  = lookup(var.insts["t2-micro"],"count")
    tags = lookup(var.insts["t2-micro"],"tags")
    key_name = aws_key_pair.terraform-demo.key_name
    vpc_security_group_ids = toset(lookup(var.init, "vpc-sec-group"))
    subnet_id = lookup(var.init.params["public-subnet"])
}

问题

当我执行

terraform init

我收到以下错误:

Error: Unsupported argument

  on variables.tf line 26, in variable "instances":
  26:     t2-micro ={

An argument named "t2-micro" is not expected here.


Error: Unsupported argument

  on variables.tf line 32, in variable "instances":
  32:     m4-large ={

An argument named "m4-large" is not expected here.


Terraform has initialized, but configuration upgrades may be needed.

Terraform found syntax errors in the configuration that prevented full
initialization. If you've recently upgraded to Terraform v0.12, this may be
because your configuration uses syntax constructs that are no longer valid,
and so must be updated before full initialization is possible.

有人可以帮我改正这些错误吗?

更多细节和我采取的一些行动

据我所知,我尝试了不同的方法来创建变量并遵循 Terraform 文档 无济于事。

我只是在模拟 Python:

这是我的 terraform 版本

terraform  -v                                                        
Terraform v0.12.26
+ provider.aws v2.65.0

更多细节

我正在使用最新版本的 Visual Studio 代码 1.45.1 和用于 "Syntax highlighting, linting, formatting, and validation for Hashicorp's Terraform"

的 Terraform 模块 HashiCop 1.4.0

您需要将变量声明和赋值分开。这些不能在同一个块中共存。

你在 variables.tf 中的声明看起来像(有一些修复和清理):

variable "instances" {
  type = list(object({
    type  = string # removed commas since you specified object type
    count = number # fixed from string type
    tags  = map(string)
  }))
}

您的变量分配应移至 .tfvars 文件。通常这个文件会被命名为 terraform.tfvars:

instances = [ # you specified a list so we add the proper syntax here
  { # you specified an object, so we remove the keys and retain the values
    type  = "t2.micro"
    count = 4
    tags  = { "Name" = "Test T2"} # you specified map(string) so Name becomes string
  },
  {
    type  = "m4-large"
    count = 2
    tags  = { "Name" = "Test M4"}
  }
}]

这将是一个有效的输入变量,根据您的声明进行了适当的赋值。这将修复您的错误。