Skip to content

Commit e6eba07

Browse files
authored
feat: Add wrapper modules (#26)
1 parent 5508c9c commit e6eba07

File tree

6 files changed

+165
-1
lines changed

6 files changed

+165
-1
lines changed

.pre-commit-config.yaml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
repos:
22
- repo: https://github.com/antonbabenko/pre-commit-terraform
3-
rev: v1.83.5
3+
rev: v1.86.0
44
hooks:
55
- id: terraform_fmt
66
- id: terraform_validate
7+
- id: terraform_wrapper_module_for_each
78
- id: terraform_docs
89
args:
910
- '--args=--lockfile=false'

wrappers/README.md

Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
# Wrapper for the root module
2+
3+
The configuration in this directory contains an implementation of a single module wrapper pattern, which allows managing several copies of a module in places where using the native Terraform 0.13+ `for_each` feature is not feasible (e.g., with Terragrunt).
4+
5+
You may want to use a single Terragrunt configuration file to manage multiple resources without duplicating `terragrunt.hcl` files for each copy of the same module.
6+
7+
This wrapper does not implement any extra functionality.
8+
9+
## Usage with Terragrunt
10+
11+
`terragrunt.hcl`:
12+
13+
```hcl
14+
terraform {
15+
source = "tfr:///terraform-aws-modules/kms/aws//wrappers"
16+
# Alternative source:
17+
# source = "git::[email protected]:terraform-aws-modules/terraform-aws-kms.git//wrappers?ref=master"
18+
}
19+
20+
inputs = {
21+
defaults = { # Default values
22+
create = true
23+
tags = {
24+
Terraform = "true"
25+
Environment = "dev"
26+
}
27+
}
28+
29+
items = {
30+
my-item = {
31+
# omitted... can be any argument supported by the module
32+
}
33+
my-second-item = {
34+
# omitted... can be any argument supported by the module
35+
}
36+
# omitted...
37+
}
38+
}
39+
```
40+
41+
## Usage with Terraform
42+
43+
```hcl
44+
module "wrapper" {
45+
source = "terraform-aws-modules/kms/aws//wrappers"
46+
47+
defaults = { # Default values
48+
create = true
49+
tags = {
50+
Terraform = "true"
51+
Environment = "dev"
52+
}
53+
}
54+
55+
items = {
56+
my-item = {
57+
# omitted... can be any argument supported by the module
58+
}
59+
my-second-item = {
60+
# omitted... can be any argument supported by the module
61+
}
62+
# omitted...
63+
}
64+
}
65+
```
66+
67+
## Example: Manage multiple S3 buckets in one Terragrunt layer
68+
69+
`eu-west-1/s3-buckets/terragrunt.hcl`:
70+
71+
```hcl
72+
terraform {
73+
source = "tfr:///terraform-aws-modules/s3-bucket/aws//wrappers"
74+
# Alternative source:
75+
# source = "git::[email protected]:terraform-aws-modules/terraform-aws-s3-bucket.git//wrappers?ref=master"
76+
}
77+
78+
inputs = {
79+
defaults = {
80+
force_destroy = true
81+
82+
attach_elb_log_delivery_policy = true
83+
attach_lb_log_delivery_policy = true
84+
attach_deny_insecure_transport_policy = true
85+
attach_require_latest_tls_policy = true
86+
}
87+
88+
items = {
89+
bucket1 = {
90+
bucket = "my-random-bucket-1"
91+
}
92+
bucket2 = {
93+
bucket = "my-random-bucket-2"
94+
tags = {
95+
Secure = "probably"
96+
}
97+
}
98+
}
99+
}
100+
```

wrappers/main.tf

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
module "wrapper" {
2+
source = "../"
3+
4+
for_each = var.items
5+
6+
aliases = try(each.value.aliases, var.defaults.aliases, [])
7+
aliases_use_name_prefix = try(each.value.aliases_use_name_prefix, var.defaults.aliases_use_name_prefix, false)
8+
bypass_policy_lockout_safety_check = try(each.value.bypass_policy_lockout_safety_check, var.defaults.bypass_policy_lockout_safety_check, null)
9+
computed_aliases = try(each.value.computed_aliases, var.defaults.computed_aliases, {})
10+
create = try(each.value.create, var.defaults.create, true)
11+
create_external = try(each.value.create_external, var.defaults.create_external, false)
12+
create_replica = try(each.value.create_replica, var.defaults.create_replica, false)
13+
create_replica_external = try(each.value.create_replica_external, var.defaults.create_replica_external, false)
14+
custom_key_store_id = try(each.value.custom_key_store_id, var.defaults.custom_key_store_id, null)
15+
customer_master_key_spec = try(each.value.customer_master_key_spec, var.defaults.customer_master_key_spec, null)
16+
deletion_window_in_days = try(each.value.deletion_window_in_days, var.defaults.deletion_window_in_days, null)
17+
description = try(each.value.description, var.defaults.description, null)
18+
enable_default_policy = try(each.value.enable_default_policy, var.defaults.enable_default_policy, true)
19+
enable_key_rotation = try(each.value.enable_key_rotation, var.defaults.enable_key_rotation, true)
20+
enable_route53_dnssec = try(each.value.enable_route53_dnssec, var.defaults.enable_route53_dnssec, false)
21+
grants = try(each.value.grants, var.defaults.grants, {})
22+
is_enabled = try(each.value.is_enabled, var.defaults.is_enabled, null)
23+
key_administrators = try(each.value.key_administrators, var.defaults.key_administrators, [])
24+
key_asymmetric_public_encryption_users = try(each.value.key_asymmetric_public_encryption_users, var.defaults.key_asymmetric_public_encryption_users, [])
25+
key_asymmetric_sign_verify_users = try(each.value.key_asymmetric_sign_verify_users, var.defaults.key_asymmetric_sign_verify_users, [])
26+
key_hmac_users = try(each.value.key_hmac_users, var.defaults.key_hmac_users, [])
27+
key_material_base64 = try(each.value.key_material_base64, var.defaults.key_material_base64, null)
28+
key_owners = try(each.value.key_owners, var.defaults.key_owners, [])
29+
key_service_roles_for_autoscaling = try(each.value.key_service_roles_for_autoscaling, var.defaults.key_service_roles_for_autoscaling, [])
30+
key_service_users = try(each.value.key_service_users, var.defaults.key_service_users, [])
31+
key_statements = try(each.value.key_statements, var.defaults.key_statements, {})
32+
key_symmetric_encryption_users = try(each.value.key_symmetric_encryption_users, var.defaults.key_symmetric_encryption_users, [])
33+
key_usage = try(each.value.key_usage, var.defaults.key_usage, null)
34+
key_users = try(each.value.key_users, var.defaults.key_users, [])
35+
multi_region = try(each.value.multi_region, var.defaults.multi_region, false)
36+
override_policy_documents = try(each.value.override_policy_documents, var.defaults.override_policy_documents, [])
37+
policy = try(each.value.policy, var.defaults.policy, null)
38+
primary_external_key_arn = try(each.value.primary_external_key_arn, var.defaults.primary_external_key_arn, null)
39+
primary_key_arn = try(each.value.primary_key_arn, var.defaults.primary_key_arn, null)
40+
route53_dnssec_sources = try(each.value.route53_dnssec_sources, var.defaults.route53_dnssec_sources, [])
41+
source_policy_documents = try(each.value.source_policy_documents, var.defaults.source_policy_documents, [])
42+
tags = try(each.value.tags, var.defaults.tags, {})
43+
valid_to = try(each.value.valid_to, var.defaults.valid_to, null)
44+
}

wrappers/outputs.tf

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
output "wrapper" {
2+
description = "Map of outputs of a wrapper."
3+
value = module.wrapper
4+
# sensitive = false # No sensitive module output found
5+
}

wrappers/variables.tf

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
variable "defaults" {
2+
description = "Map of default values which will be used for each item."
3+
type = any
4+
default = {}
5+
}
6+
7+
variable "items" {
8+
description = "Maps of items to create a wrapper from. Values are passed through to the module."
9+
type = any
10+
default = {}
11+
}

wrappers/versions.tf

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
terraform {
2+
required_version = ">= 0.13.1"
3+
}

0 commit comments

Comments
 (0)