Terraform Entrypoints


9 June 2021

When working with Terraform in a dedicated infrastructure repository, we often see main.tf and similar files scattered directly in the root. This is so we can jump into the repo and immediately run terraform plan and terraform apply. Folder are then used for modules that need to be sourced in those top-level Terraform files.

But that is not the only way to structure Terraform files! To Terraform, any folder where you run terraform plan is essentially an entrypoint. It will look for its terraform { ...} block with configuration for backends and providers. On our projects, we have been following a pattern where we create at least two of these entrypoints: roles and infra.

The roles entrypoint has a single purprose: create application specific roles that can be used in the infra entrypoint to provision any infrastructure our application needs. The infra entrypoint on the other hand creates any infra we need. Its reach is bounded by whatever permissions were granted to it in the roles entrypoint.

Sometimes we will create more entrypoints with dedicated purproses: shared-infra for resources that are shared across multiple environments (e.g. AWS ECRs) or datadog (or other monitoring tool) where we define application/tool-specific resources.