I found an example of an ML flow deployment on aws using terraform here: https://github.com/Glovo/terraform-aws-mlflow/blob/master/terratest/examples/main.tf. The problem is that it declares a "vpc" module, and it seems this is deprecated with the latest version of terraform (v 1.4.6). The vpc is declared like this
module "vpc" {
source = "terraform-aws-modules/vpc/aws"
version = "2.44.0"
name = "mlflow-${random_id.id.hex}"
cidr = "10.0.0.0/16"
azs = ["eu-west-1a", "eu-west-1b", "eu-west-1c"]
private_subnets = ["10.0.1.0/24", "10.0.2.0/24", "10.0.3.0/24"]
public_subnets = ["10.0.101.0/24", "10.0.102.0/24", "10.0.103.0/24"]
database_subnets = ["10.0.201.0/24", "10.0.202.0/24", "10.0.203.0/24"]
enable_nat_gateway = true
tags = {
"built-using" = "terratest"
"env" = "test"
}
}
The vpc is then referenced in the mlf flow module:
module "mlflow" {
source = "../../"
unique_name = "mlflow-terratest-${random_id.id.hex}"
tags = {
"owner" = "terratest"
}
vpc_id = module.vpc.vpc_id
database_subnet_ids = module.vpc.database_subnets
service_subnet_ids = module.vpc.private_subnets
load_balancer_subnet_ids = var.is_private ? module.vpc.private_subnets : module.vpc.public_subnets
load_balancer_ingress_cidr_blocks = var.is_private ? [module.vpc.vpc_cidr_block] : ["0.0.0.0/0"]
load_balancer_is_internal = var.is_private
artifact_bucket_id = var.artifact_bucket_id
database_password_secret_arn = aws_secretsmanager_secret_version.db_password.secret_id
database_skip_final_snapshot = true
}
My guess is that I would have to refactor this using resource declarations for the vpc instead of the module. The thing I can't understand is why are the subnets declared as a list of strings in the vpc module, and then assigned to subnet id variables in the ml flow module? And how would I do this in the latest version of terraform?
Any help would be much appreciated.