Terraform Modules

Structure

tree
.
+--- input.tf
+--- main.tf
+--- modules
|   +--- dynamo_module
|   |   +--- main.tf
|   |   +--- outputs.tf
|   |   +--- README.md
|   |   +--- variables.tf
|   +--- parameter_module
|   |   +--- main.tf
|   |   +--- outputs.tf
|   |   +--- variables.tf
+--- outputs.tf
+--- README
+--- setup.tf

Root module

setup.tf

# Export key and secret credentials first.
# run as -> $ terraform apply
 
 
terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "3.74.1"
    }
  }
 
  backend "s3" {
    region         = "eu-west-2"
    bucket         = "terraform-statefiles"
    key            = "tsg/plan-apply.tfstate"
    dynamodb_table = "tsg-plan-apply-lockfiles"
  }
}

main.tf

provider "aws" {
  region = "eu-west-X"
 
  default_tags {
    tags =  {
      name = "ModuleTest"
    }
  }
}
 
module "dynamo" {
  source  = "./modules/dynamo_module"
  table_name = "Test_table2"
  #email_address = "user@company.com"
}
 
module "parameters" {
  source = "./modules/parameter_module"
  parameter_key = "test_key"
  parameter_value = "Silly_Parameter"
}
output "environment" {
  value = "prod"
}
 
output "table_arn" {
  value = module.dynamo.arn
}
 
output "Parameter_arn" {
  value = module.parameters.parameter_arn
}
 
output "parameter_value" {
  value = module.parameters.parameter_value
  sensitive = true
}

Modules -> dynamo_module

main.tf

resource "aws_dynamodb_table" "dynamo_table" {
  name         = var.table_name
  billing_mode = "PAY_PER_REQUEST"
  hash_key     = "UserID"
  attribute {
    name = "UserID"
    type = "S"
  }
  tags = {
    "BuiltBy" = "Terraform"
    "email" = var.email_address
  }
}

outputs.tf

# Output variable definitions

output "arn" {
  description = "ARN of the VPC"
  value       =aws_dynamodb_table.dynamo_table.arn
}

variables.tf

# Input variable definitions
 
variable "table_name" {
  description = "Name of the table."
  type        = string
}
 
variable "email_address" {
  description = "Owner's email"
  default = "myemail@company.com"
  type        = string
}

Modules -> parameter_module

main.tf

resource "aws_ssm_parameter" "nonsense_parameter" {
  name  = var.parameter_key
  type  = "String"
  value = var.parameter_value
}

outputs.tf

# Output variable definitions
 
output "parameter_value" {
  description = "Value of Parameter"
  value       = aws_ssm_parameter.nonsense_parameter.value
}
 
output "parameter_arn" {
  description = "ARN of parameter"
  value = aws_ssm_parameter.nonsense_parameter.arn
}

variables.tf

# Input variable definitions
 
variable "email_address" {
  description = "Owner's email"
  default     = "myparameteremail@company.com"
  type        = string
}
 
variable "parameter_key" {
  description = "Key name"
  type        = string
}
 
variable "parameter_value" {
  description = "value"
  type        = string
}
 
terraform/modules.txt · Last modified: 30/11/2022 17:41 by andrew