3
votes

I am writing terraform script to create ASG on AWS. I tried to create it with terraform module to have a more reusable code. The problem is when I want to use variable from common-variable.tfvars on the module tf files, it keeps saying it is undefined and need to be declared. This way, the module will be less reuseable .

Here is an example

root
|
|___project 1
|     |_____ main.tf
|     |_____ common-variable.tfvars
|
|___ modules
      |
      |_____ a-module
                 |______ main.tf

So inside project 1 common-variable.tfvars, basically it looks like this

variable "a" { 
    description = "a variable"
    default = "a" 
}

variable "b" { 
    description = "a variable"
    default = "b" 
}

Inside a-module / main.tf looks like this

variable "name" {}

resource "aws_autoscaling_group" "asg-1" {
    name = "${var.a}"
    ...
}

When I do terraform init, it says

resource 'aws_autoscaling_group.asg-1' config: unknown variable 
referenced: 'a'. define it with 'variable' blocks

Any idea how i can use this common variable from within the module main .tf?


Update

I managed to pass terraform init by redeclaring the variable in each module. However, when i run terraform plan, this kind of error appears invalid value "common-variable.tfvars" for flag -var-file: multiple map declarations not supported for variables

2

2 Answers

1
votes

Wrong tfvars format, should be key / value only, such as:

a = "a"
b = "b"

Second, check how do you refer the module, should be something like this:

source = "../modules/a-module"
0
votes

You need to declare the variables required by the module within the module, and then pass them in when instantiating the module from your project.

Example stolen from hashicorp documentation

In your project:

module "assets_bucket" {
  source = "./publish_bucket"
  name   = "assets"
}

module "media_bucket" {
  source = "./publish_bucket"
  name   = "media"
}

In your module:

# publish_bucket/bucket-and-cloudfront.tf

variable "name" {} # this is the input parameter of the module

resource "aws_s3_bucket" "the_bucket" {
  # ...
}

resource "aws_iam_user" "deploy_user" {
  # ...
}