Reynaldi Wijaya
Reynaldi Wijaya

Reputation: 121

Terraform common variable usage in modules

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

Upvotes: 3

Views: 5328

Answers (2)

Matt Childs
Matt Childs

Reputation: 149

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" {
  # ...
}

Upvotes: 0

BMW
BMW

Reputation: 45243

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"

Upvotes: 1

Related Questions