snippetterraformMinor
How to make Terraform Modules wait for resources to be created in place of using computed values
Viewed 0 times
modulescomputedwaitcreatedplacemakeforusinghowvalues
Problem
Today I am working on building out several custom Terraform Modules. The issue that I am trying to figure out how to work around dependencies within modules. Until TF 0.12 is released we cannot declare a module to be dependent upon another module. So, in this root level main.tf:
The result output is:
```
------ SNIP -----
module.vpc_nat_gateway.aws_nat_gateway.nat[1]: Creation complete after 1m50s (ID: nat-02a7f4279cec3a6c8)
module.vpc_nat_gateway.aws_nat_gateway.nat.0: Still creating... (2m0s elapsed)
module.vpc_nat_gateway.aws_nat_gateway.nat[0]: Creation complete after 2m0s (ID: nat-0695a12d9c0305e4c)
Error: Error applying plan:
3 error(s) occurred:
* module.vpc_private_route.data.aws_subnet_ids.private: data.aws_subnet_ids.private: no matching subnet found for vpc with id vpc-0b530d1885e74067b
* module.vpc_private_route.data.aws_nat_gateway.az2:
# ROOT level main.tf
# -------------------------------------------------------------------
# Create NAT Gateway - Associates EIP as well
# -------------------------------------------------------------------
module "vpc_nat_gateway" {
source = "./vpc_nat_gateway"
vpc_id = "${ module.vpc.id }"
public_subnet_ids = "${ module.vpc_subnets.public_subnet_ids }"
private_cidr = "${ var.private_cidr }"
common_tags = "${ local.common_tags }"
}
# -------------------------------------------------------------------
# Create Private Routes
# -------------------------------------------------------------------
module "vpc_private_route" {
source = "./vpc_private_route"
vpc_id. = "${ module.vpc.id }"
nat_gateway_id = "${ module.vpc_nat_gateway.nat_gateway_id }"
common_tags = "${ local.common_tags }"
}
# vpc_private_route module - main.tf
data "aws_nat_gateway" "az1" {
vpc_id = "${ var.vpc_id }"
tags {
Name = "*NAT GW AZ 1"
}
}
data "aws_nat_gateway" "az2" {
vpc_id = "${ var.vpc_id }"
tags {
Name = "*NAT GW AZ 2"
}
}The result output is:
```
------ SNIP -----
module.vpc_nat_gateway.aws_nat_gateway.nat[1]: Creation complete after 1m50s (ID: nat-02a7f4279cec3a6c8)
module.vpc_nat_gateway.aws_nat_gateway.nat.0: Still creating... (2m0s elapsed)
module.vpc_nat_gateway.aws_nat_gateway.nat[0]: Creation complete after 2m0s (ID: nat-0695a12d9c0305e4c)
Error: Error applying plan:
3 error(s) occurred:
* module.vpc_private_route.data.aws_subnet_ids.private: data.aws_subnet_ids.private: no matching subnet found for vpc with id vpc-0b530d1885e74067b
* module.vpc_private_route.data.aws_nat_gateway.az2:
Solution
Update: As of TF 0.13x,
The previous most popular answer is out of date with Terraform 0.12.24.
In addition there are a few syntax differences.
I've updated the example below.
depends_on is supported to create dependencies between modules. Using depends_on should be preferable over using the method detailed below.The previous most popular answer is out of date with Terraform 0.12.24.
depends_on is a protected variable, and cannot be used in a module.In addition there are a few syntax differences.
I've updated the example below.
# ROOT level main.tf
# -------------------------------------------------------------------
# Create NAT Gateway - Associates EIP as well
# -------------------------------------------------------------------
module "vpc_nat_gateway" {
source = "./vpc_nat_gateway"
vpc_id = module.vpc.id
public_subnet_ids = module.vpc_subnets.public_subnet_ids
private_cidr = var.private_cidr
common_tags = local.common_tags
}
# -------------------------------------------------------------------
# Create Private Routes
# -------------------------------------------------------------------
module "vpc_private_route" {
source = "./vpc_private_route"
vpc_id. = module.vpc.id
nat_gateway_id = module.vpc_nat_gateway.nat_gateway_id
common_tags = local.common_tags
# Depends is a custom variable, depends_on is a reserved keyword.
depends = [module.vpc_nat_gateway.nat_gateway_id]
}# vpc_private_route module - main.tf
variable "depends" {
default = []
}
resource "null_resource" "depends_on" {
triggers = {
depends_on = "${join("", var.depends)}"
}
}
data "aws_nat_gateway" "az1" {
vpc_id = var.vpc_id
depends_on = [
null_resource.depends_on
]
}
data "aws_nat_gateway" "az2" {
vpc_id = var.vpc_id
depends_on = [
null_resource.depends_on
]
}Code Snippets
# ROOT level main.tf
# -------------------------------------------------------------------
# Create NAT Gateway - Associates EIP as well
# -------------------------------------------------------------------
module "vpc_nat_gateway" {
source = "./vpc_nat_gateway"
vpc_id = module.vpc.id
public_subnet_ids = module.vpc_subnets.public_subnet_ids
private_cidr = var.private_cidr
common_tags = local.common_tags
}
# -------------------------------------------------------------------
# Create Private Routes
# -------------------------------------------------------------------
module "vpc_private_route" {
source = "./vpc_private_route"
vpc_id. = module.vpc.id
nat_gateway_id = module.vpc_nat_gateway.nat_gateway_id
common_tags = local.common_tags
# Depends is a custom variable, depends_on is a reserved keyword.
depends = [module.vpc_nat_gateway.nat_gateway_id]
}# vpc_private_route module - main.tf
variable "depends" {
default = []
}
resource "null_resource" "depends_on" {
triggers = {
depends_on = "${join("", var.depends)}"
}
}
data "aws_nat_gateway" "az1" {
vpc_id = var.vpc_id
depends_on = [
null_resource.depends_on
]
}
data "aws_nat_gateway" "az2" {
vpc_id = var.vpc_id
depends_on = [
null_resource.depends_on
]
}Context
StackExchange DevOps Q#6163, answer score: 7
Revisions (0)
No revisions yet.