====== 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
}