Terraform Advanced — depends_on Advanced

less than 1 minute read

When Terraform can’t infer a dependency, you need explicit depends_on.


When You Need depends_on

Terraform auto-detects dependencies from references:
  subnet_id = aws_subnet.main.id  →  implicit dependency ✅

But some dependencies are invisible:
  IAM policy must propagate before EC2 can assume role
  SG rule must exist before instance launches

Example: IAM Propagation Delay

resource "aws_iam_role_policy_attachment" "eks" {
  role       = aws_iam_role.eks.name
  policy_arn = "arn:aws:iam::aws:policy/AmazonEKSClusterPolicy"
}

resource "aws_eks_cluster" "main" {
  name     = "prod"
  role_arn = aws_iam_role.eks.arn
  # ...

  depends_on = [aws_iam_role_policy_attachment.eks]
  # Without this, EKS creation may fail because IAM hasn't propagated
}

depends_on for Modules

module "app" {
  source = "./modules/app"

  depends_on = [module.networking, module.database]
}

Anti-Pattern: Overusing depends_on

# ❌ Anti-pattern: depends_on when a reference would work
resource "aws_instance" "app" {
  subnet_id = aws_subnet.main.id   # Already creates dependency
  depends_on = [aws_subnet.main]   # Redundant!
}

💡 Production Tip: Only use depends_on when there’s no attribute reference between resources. If you’re referencing an attribute, the dependency is already implicit.


What’s Next?

Force resource replacement on external changes.

← lifecycle Block replace_triggered_by →

Updated: