在 terraform.tfvars 中声明列表和映射变量值

Imr*_*ozi 6 variables terraform

我最近将 terraform 代码中的变量值移至 terraform.tfvars。我现在收到一个错误,这是由于我声明列表和映射变量的方式造成的。我收到错误的代码复制如下:

image_id             = var.web_amis[var.region]
Run Code Online (Sandbox Code Playgroud)

这就是我在 terraform.tfvars 中指定这些变量的方式:

web_amis                      = ["ami-0dacb0c129b49f529", "ami-00068cd7555f543d5", ]
Run Code Online (Sandbox Code Playgroud)

这是我收到的错误代码:

Error: Invalid index

  on autoscaling.tf line 3, in resource "aws_launch_configuration" "web_lc":
   3:   image_id             = var.web_amis[var.region]
    |----------------
    | var.region is "us-east-2"
    | var.web_amis is tuple with 2 elements

The given key does not identify an element in this collection value: a number
is required.
Run Code Online (Sandbox Code Playgroud)

上面给出的错误消息的屏幕截图显示 Terraform 已突出显示 var.region 部分作为源代码片段中有问题的部分。

yda*_*coR 6

您正在尝试使用非索引键而不是按位置访问列表元素。

您可能想要的是让您的web_amis变量成为由区域名称作为键控的地图:

主.tf

variable "region" {}
variable "web_amis" {}

resource "foo_bar" "baz" {
  # ...
  image_id = var.web_amis[var.region]
} 
Run Code Online (Sandbox Code Playgroud)

terraform.tfvars

web_amis = {
  us-east-2 = "ami-0dacb0c129b49f529"
  us-west-2 = "ami-00068cd7555f543d5"
}
Run Code Online (Sandbox Code Playgroud)

但是,现在这是一种非常老派且不优雅的 Terraform 处理方式。相反,您可以使用aws_ami数据源根据标签或 AMI 名称等过滤器查找该区域的 AMI。

aws_instance资源文档中给出了一个基本示例:

provider "aws" {
  region = "us-west-2"
}

data "aws_ami" "ubuntu" {
  most_recent = true

  filter {
    name   = "name"
    values = ["ubuntu/images/hvm-ssd/ubuntu-trusty-14.04-amd64-server-*"]
  }

  filter {
    name   = "virtualization-type"
    values = ["hvm"]
  }

  owners = ["099720109477"] # Canonical
}

resource "aws_instance" "web" {
  ami           = data.aws_ami.ubuntu.id
  instance_type = "t2.micro"

  tags = {
    Name = "HelloWorld"
  }
}
Run Code Online (Sandbox Code Playgroud)