Caballero500
Caballero500

Reputation: 43

Unable to read variables from Terraform variable file

Here is my setup,

Terraform version - Terraform v0.12.17 OS - OSX 10.15.1

Use Case - define a provider file and access the variables defined in the vars file

Files main.tf - where the code is

provider "aws" {

}

variable "AWS_REGION" {
    type = string
}

variable "AMIS" {
    type = map(string)
    default = {
        us-west-1 = "my ami"
    }
}

resource "aws_instance" "awsInstall" {
    ami = var.AMIS[var.AWS_REGION]
    instance_type = "t2.micro"
}

awsVars.tfvars - where the region is defined

AWS_REGION="eu-region-1"

Execution

$ terraform console

var.AWS_REGION

Error: Result depends on values that cannot be determined until after "terraform apply".

What mistake I have done, I don't see any syntax but have issues in accessing the variables, any pointers would be helpful

Thanks

Upvotes: 4

Views: 20020

Answers (1)

Martin Atkins
Martin Atkins

Reputation: 74219

Terraform does not automatically read a .tfvars file unless its filename ends with .auto.tfvars. Because of that, when you ran terraform console with no arguments Terraform did not know a value for variable AWS_REGION.

To keep your existing filename, you can pass this variables file explicitly on the command line like this:

terraform console -var-file="awsVars.tfvars"

Alternatively, you could rename the file to awsVars.auto.tfvars and then Terraform will read it by default as long as it's in the current working directory when you run Terraform.

There's more information on how you can set values for root module input variables in the Terraform documentation section Assigning Values to Root Module Variables.


Note also that the usual naming convention for input variables and other Terraform-specific objects is to keep the names in lowercase and separate words with underscores. For example, it would be more conventional to name your variables aws_region and amis.

Furthermore, if your goal is to find an AMI for the current region (the one chosen by the AWS_DEFAULT_REGION environment variable, or in the provider configuration), you could use the aws_region data source to allow Terraform to determine that automatically, so you don't have to set it as a variable at all:

variable "amis" {
  type = map(string)
  default = {
    us-west-1 = "my ami"
  }
}

data "aws_region" "current" {}

resource "aws_instance" "awsInstall" {
  ami           = var.amis[data.aws_region.current.name]
  instance_type = "t2.micro"
}

Upvotes: 9

Related Questions