Hi Community,
Actually I deploy the enterprise scale Terraform Code and I build a custom module Folder. Is there any best practises to locate the Custom module folder, at the .terraform folder or left in the root module structure? Thanks
Hi Community,
Actually I deploy the enterprise scale Terraform Code and I build a custom module Folder. Is there any best practises to locate the Custom module folder, at the .terraform folder or left in the root module structure? Thanks
Hi @Crallbit,
The .terraform
directory inside a Terraform working directory is private to Terraform itself and you should never read or write files directly in there yourself.
Terraform doesn’t have any strong restrictions about how you lay out your directories but a common convention in the community is something like the following:
<COMPONENT-NAME>/
<ENVIRONMENT-NAME>/
<.tf files for root Terraform module for a particular
component in a particular environment>
modules/
<MODULE-NAME>/
<.tf files for a particular module>
(Some teams switch the component end environment names so that the top-level directory has the environments and the subdirectories are components. This is just a matter of personal taste and there isn’t really a universal “correct answer” for whether environment or component should be the top-level grouping.)
With this directory structure the module source addresses for the local shared modules will typically start with ../../modules/
to traverse into one of the subdirectories of modules
:
module "example" {
source = "../../modules/example"
# ...
}
The above directory structure is assuming that you prefer to keep all of your root and shared Terraform modules together in a single repository and use only local paths. Some teams prefer to instead place each shared module in its own repository and make separate releases. Both approaches are valid, and the decision between these will typically depend on how the responsibilities are divided in your team; if you expect that the same people will be maintaining all of the Terraform modules together then this single-repository style tends to be the simplest approach because you can then make changes across all of the modules in a single pull request.
Hi @Crallbit
I wanted to share some guidelines that I find useful when deciding whether to use a separate repository for a module (repository module) or whether to include a module in the same repository as the Terraform projects (local module).
I find it best to use a “repository module” if any of these hold true:
I find it best to use a “local module” when:
There are no hard and fast rules, as @apparentlymart mentions, and each team should choose the structure that works best for them.
I generally use a mixed approach based on the above guidelines.