Search code examples
amazon-web-servicesterraformterraform-provider-aws

Terraform AWS - deploy modules in multiple regions


I'm trying to deploy multiple mysql instances (two instances) in multiple AWS region (two regions) using terraform and modules.

this is my code: main.tf

terraform {
  required_version = ">= 1.1.4"

  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = ">= 4.3"
    }
  }
}

# --------------------------------------------------------------------------------------------------
# vpc
# --------------------------------------------------------------------------------------------------
module "vpc" {
  source = "./modules/vpc"
  
  aws_profile                   = "monitoring-${var.workspace}"
  cidr_block                    = local.aws.cidr_block
  private_subnets_mysql_cidr    = local.aws.mysql_private_subnets_cidr
  availabity_zone               = local.aws.availabity_zone
  
  for_each = toset(["eu-west-1","eu-west-2"])
  region   = each.value

  tags = local.tags
}

# --------------------------------------------------------------------------------------------------
# RDS MySQL
# --------------------------------------------------------------------------------------------------
module "mysql" {
  source = "./modules/mysql"
  
  for_each                = toset(["service1","service2"])
  service                 = each.value
  aws_vpc_id              = module.vpc.aws_vpc_id
  db_subnet_group_name    = module.vpc.db_subnet_group_name
  ...
  tags = merge({Service = each.value},local.tags)

  depends_on = [module.vpc]
}

modules/vpc/main.tf

...
data "aws_region" "current" {
  name = var.region
}

# Create VPC
resource "aws_vpc" "vpc" {
    cidr_block                           = var.cidr_block
    enable_dns_hostnames                 = true
    enable_dns_support                   = true
    enable_network_address_usage_metrics = false
    instance_tenancy                     = "default"

    tags = merge({Name = "${var.aws_profile}-vpc"},var.tags)
}

# Create private subnet for RDS mysql
resource "aws_subnet" "private_subnet_mysql" {
    vpc_id                  = aws_vpc.vpc.id
    count                   = "${length(var.private_subnets_mysql_cidr)}"
    cidr_block              = "${element(var.private_subnets_mysql_cidr, count.index)}"
    availability_zone       = "${element(var.availabity_zone, count.index)}"
    
    assign_ipv6_address_on_creation                = false
    enable_dns64                                   = false
    enable_resource_name_dns_a_record_on_launch    = false
    enable_resource_name_dns_aaaa_record_on_launch = false
    ipv6_native                                    = false
    map_public_ip_on_launch                        = false
    private_dns_hostname_type_on_launch            = "ip-name"

    tags = merge({Name = "${var.aws_profile}-private-subnet-mysql-${element(var.availabity_zone, count.index)}"},var.tags)
}

resource "aws_db_subnet_group" "db_subnet_group" {
  name = "${var.aws_profile}-private-mysql-subnet-group"
  subnet_ids = aws_subnet.private_subnet_mysql.*.id

  tags   = merge(var.tags)
}
...

modules/vpc/output.tf

output "aws_vpc_id" {
  description = "AWS VPC ID:"
  value       = aws_vpc.vpc.id
}

output "db_subnet_group_name" {
  description = "AWS Private subnet mysql group name:"
  value       = aws_db_subnet_group.db_subnet_group.id
}

but when I try to run terraform apply I receive the errors below:

Error: Invalid value for input variable

│ on main.tf line 41, in module "mysql":
│ 41: aws_vpc_id = module.vpc.aws_vpc_id

│ The given value is not suitable for module.mysql.var.aws_vpc_id declared at modules/mysql/variables.tf:6,1-22: string required.


│ Error: Invalid value for input variable

│ on main.tf line 46, in module "mysql":
│ 46: db_subnet_group_name = module.vpc.db_subnet_group_name

│ The given value is not suitable for module.mysql.var.db_subnet_group_name declared at modules/mysql/variables.tf:31,1-33: string required.

How can pass the correct value of vpc_id for each of the regions?


Solution

  • Thanks to all for the help. I solved in this way:
    outputs.tf

    output "aws_vpc_id" {
      description = "AWS VPC ID:"
      value = { for k, vpc module.vpc: k => vpc.id }
    }
    
    output "db_subnet_group_name" {
      description = "AWS Private subnet mysql group name:"
      value = { for k, vpc module.vpc: k => vpc.db_subnet_group_name }
    }