Hello, I wanted to understand how linear dependencies are handled. In my example,
resource "example" "example1" {
//some code here
count = 1
}
resource "example" "example2" {
count = local.if_needed ? 1: 0
depends_on = [example.example1]
}
resource "new_resource" "example3" {
depends_on = [example.example2]
}
Now suppose when the count of example.example2
is 0, I want new_resource.example3
to be dependent on example.example1
. As example.example2
is dependent on example.example1
, will example.example3
now depend on example.example1
when the configuration is evaluated or should I change my implementation to
resource "new_resource" "example3" {
depends_on = [example.example1, example.example2]
}
Hi @chiraniamanav15,
Dependencies are between resource blocks in the configuration, not between the dynamic instances of those resources. A dependency on a resource with count = 0
is valid, because the resource block still exists even though it declares zero instances.
Hi, thanks for the reply. Does that mean that for the first code block, new_resource.example3
will be created only after example.example1
if the count of example2
is zero?
Yes. Specifically, Terraform will wait until example1 is complete before even calculating how many instances of example2 there are. Terraform won’t know there are zero instances until it reaches that resource during evaluation. Only after it’s decided how many instances of example2 there are and evaluated each of them (which might be zero of them) will it move on to evaluate example3.
I tried this particular code -
resource "null_resource" "test1" {
}
resource "null_resource" "test2" {
depends_on = [null_resource.test1]
}
resource "null_resource" "test3" {
count = 0
depends_on = [null_resource.test2]
}
resource "null_resource" "test4" {
depends_on = [null_resource.test3]
}
resource "null_resource" "test5" {
depends_on = [null_resource.test2, null_resource.test3]
}
So, here test4
should’ve been created after test2
is created but the output I get is -
null_resource.test4: Creating...
null_resource.test1: Creating...
null_resource.test4: Creation complete after 0s [id=1547977163223384883]
null_resource.test1: Creation complete after 0s [id=5878378976281927211]
null_resource.test2: Creating...
null_resource.test2: Creation complete after 0s [id=955801719549354720]
null_resource.test5: Creating...
null_resource.test5: Creation complete after 0s [id=4426660689960026593]
Am i missing something here?
Hi @chiraniamanav15,
I think that might be considered a bug in the dependency handling, though I’m not sure how it should be resolved at the moment.
What is happening is that test4
depends on the test3
configuration being evaluated, but there are no instances planned to go long with that evaluation. Because there are no instances there is nothing to connect the test4
instances with the test2
instances. The test3
config (the config is represented by (expand)
here) does depend on test2 (expand)
, but that does not depend on the test2
instances because the dependency travels in the inverse direction.
This results in the configuration evaluation happening in the correct order, but the actual resource instances may be applied in a different order. This doesn’t normally matter because once once the configuration is complete most resources can be applied without a problem, but depends_on
is also used to represent dependencies outside of terraform which are not visible via the instance configuration.
I’ll file an issue to go along with the explanation so we can track it.
1 Like
Oh okay, got it! Thanks @jbardin for the explanation.