Design pattern is a general, reusable solution to a commonly occurring problem within a given context in software design
.
โโโ environment
โย ย โโโ dev
โย ย โย ย โโโ _settings.tf
โย ย โย ย โโโ output.tf
โย ย โย ย โโโ database.tf # Calls a local database module
โย ย โย ย โโโ environment.tf # Calls a local environment module
โย ย โโโ preproduction
โย ย โย ย โโโ _settings.tf
โย ย โย ย โโโ output.tf
โย ย โย ย โโโ environment.tf # Calls a local environment module
โย ย โโโ production
โย ย ย ย โโโ _settings.tf
โย ย ย ย โโโ output.tf
โย ย ย ย โโโ organisation.tf # Calls aresource directly
โย ย ย ย โโโ environment.tf # Calls a local environment module
โโโ application
โย ย โโโ app_1
| โย ย โโโ dev
| โย ย โย ย โโโ _settings.tf
| โย ย โย ย โโโ output.tf
| โย ย โย ย โโโ rds.tf
| โย ย โย ย โโโ app.tf # Calls a remote app module
| โ โโโ preproduction
| โย ย โย ย โโโ _settings.tf
| โย ย โย ย โโโ output.tf
| โย ย โย ย โโโ app.tf # Calls a remote app module
| โ โโโ production
| โย ย ย ย โโโ _settings.tf
| โย ย ย ย โโโ output.tf
| โย ย ย ย โโโ app.tf # Calls a remote app module
โย ย โโโ app_2
โย ย โโโ app_3
โโโ modules
โโโ environment
โย ย โโโ README.md
โย ย โโโ _settings.tf
โย ย โโโ bastion.tf
โย ย โโโ bucket.tf
โย ย โโโ dns.tf
โย ย โโโ ip_ranges.tf
โย ย โโโ eks.tf
โย ย โโโ variables.tf
โโโ database
Keep it simple stupid.
Donโt put too much thought on the friendly name of files, the point is that a newcomer can easily find code to understand the infrastructure and make modification.
A layer is a directory in which you use apply/destroy
resource on your provider, thus a terraform state.
A folder is used to regroup these layers, and it should be named with a project need in mind (Ex: environments, applications).
A project can host multiple folder to regroup different type of project need.
_settings.tf
The size of a layer is important when deciding the segmentation of folder and layers within a project.
The following factors are indication of too large states
Modules are created for two reasons:
Each file in a module is named with a friendly name (Ex: node_pool, roles, monitoring)
Module can be be located either
Versioning of IAC is important to assure the resilience of an infrastructure. It allows you to:
layers
using the same moduleThis versioning can be done on several layers:
v2
and change source of module to test a breaking changeKeep it simple, stupid.
_settings.tf
Defines
output.tf
is the interface of my layer with the rest of the worldreader_friendly_name.tf
after what they define
Pros:
Cons
Main repository
.
โโโ environment
โ โโโ dev
โ โ โโโ layer-1
โ โ โย ย โโโ _settings.tf
โ โ ย ย โย ย โโโ output.tf
โ โ ย ย โย ย โโโ database.tf # Call local database module
โ โ ย โย ย โโโ environment.tf # Call local environment module
โ โ โโโ layer-2
โ โ ย ย โโโ _settings.tf
โ โ ย ย โโโ output.tf
โ โ ย ย ย โโโ kubernetes.tf # Call local kubernetes module
โย ย โโโ preproduction
โย ย โโโ production
โโโ modules
โโโ environment
โย ย โโโ README.md
โย ย โโโ _settings.tf
โย ย โโโ bastion.tf
โย ย โโโ bucket.tf
โย ย โโโ dns.tf
โย ย โโโ ip_ranges.tf
โย ย โโโ eks.tf
โย ย โโโ variables.tf
โโโ database
Main repository
.
โโโ apps
ย ย โโโ api_1
| โโโ dev
โย ย |ย โโโ _settings.tf
โย ย |ย โโโ output.tf
โย ย |ย โโโ app.tf # Call remote module application
| โโโ preproduction
โย ย |ย โโโ _settings.tf
โย ย |ย โโโ output.tf
โย ย |ย โโโ app.tf # Call remote module application
| โโโ production
โย ย ย ย โโโ _settings.tf
โย ย ย ย โโโ output.tf
โย ย ย ย โโโ datadog.tf # Call community module for Datadog
โย ย ย ย โโโ app.tf # Call remote module application
ย ย โโโ api_2
ย ย โโโ api_3
Remote module
.
โโโ application
ย ย โโโ README.md
ย ย โโโ _settings.tf
ย ย โโโ bucket.tf
ย ย โโโ cloudrun.tf
ย ย โโโ variables.tf