Reputation: 595
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?
Upvotes: 0
Views: 210
Reputation: 595
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 }
}
Upvotes: 0