Skip to content

Commit b625533

Browse files
authored
feat: Add Terragrunt wrapper generation (#287)
* Added wrappers/ * feat: Generated wrappers with pre-commit hook
1 parent 4e2cba7 commit b625533

File tree

6 files changed

+226
-0
lines changed

6 files changed

+226
-0
lines changed

.pre-commit-config.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ repos:
33
rev: v1.96.1
44
hooks:
55
- id: terraform_fmt
6+
- id: terraform_wrapper_module_for_each
67
- id: terraform_docs
78
args:
89
- '--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/autoscaling/aws//wrappers"
16+
# Alternative source:
17+
# source = "git::git@github.com:terraform-aws-modules/terraform-aws-autoscaling.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/autoscaling/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::git@github.com: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: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
module "wrapper" {
2+
source = "../"
3+
4+
for_each = var.items
5+
6+
autoscaling_group_tags = try(each.value.autoscaling_group_tags, var.defaults.autoscaling_group_tags, {})
7+
availability_zone_distribution = try(each.value.availability_zone_distribution, var.defaults.availability_zone_distribution, {})
8+
availability_zones = try(each.value.availability_zones, var.defaults.availability_zones, null)
9+
block_device_mappings = try(each.value.block_device_mappings, var.defaults.block_device_mappings, [])
10+
capacity_rebalance = try(each.value.capacity_rebalance, var.defaults.capacity_rebalance, null)
11+
capacity_reservation_specification = try(each.value.capacity_reservation_specification, var.defaults.capacity_reservation_specification, {})
12+
cpu_options = try(each.value.cpu_options, var.defaults.cpu_options, {})
13+
create = try(each.value.create, var.defaults.create, true)
14+
create_iam_instance_profile = try(each.value.create_iam_instance_profile, var.defaults.create_iam_instance_profile, false)
15+
create_launch_template = try(each.value.create_launch_template, var.defaults.create_launch_template, true)
16+
create_scaling_policy = try(each.value.create_scaling_policy, var.defaults.create_scaling_policy, true)
17+
create_schedule = try(each.value.create_schedule, var.defaults.create_schedule, true)
18+
credit_specification = try(each.value.credit_specification, var.defaults.credit_specification, {})
19+
default_cooldown = try(each.value.default_cooldown, var.defaults.default_cooldown, null)
20+
default_instance_warmup = try(each.value.default_instance_warmup, var.defaults.default_instance_warmup, null)
21+
default_version = try(each.value.default_version, var.defaults.default_version, null)
22+
delete_timeout = try(each.value.delete_timeout, var.defaults.delete_timeout, null)
23+
desired_capacity = try(each.value.desired_capacity, var.defaults.desired_capacity, null)
24+
desired_capacity_type = try(each.value.desired_capacity_type, var.defaults.desired_capacity_type, null)
25+
disable_api_stop = try(each.value.disable_api_stop, var.defaults.disable_api_stop, null)
26+
disable_api_termination = try(each.value.disable_api_termination, var.defaults.disable_api_termination, null)
27+
ebs_optimized = try(each.value.ebs_optimized, var.defaults.ebs_optimized, null)
28+
elastic_gpu_specifications = try(each.value.elastic_gpu_specifications, var.defaults.elastic_gpu_specifications, {})
29+
elastic_inference_accelerator = try(each.value.elastic_inference_accelerator, var.defaults.elastic_inference_accelerator, {})
30+
enable_monitoring = try(each.value.enable_monitoring, var.defaults.enable_monitoring, true)
31+
enabled_metrics = try(each.value.enabled_metrics, var.defaults.enabled_metrics, [])
32+
enclave_options = try(each.value.enclave_options, var.defaults.enclave_options, {})
33+
force_delete = try(each.value.force_delete, var.defaults.force_delete, null)
34+
health_check_grace_period = try(each.value.health_check_grace_period, var.defaults.health_check_grace_period, null)
35+
health_check_type = try(each.value.health_check_type, var.defaults.health_check_type, null)
36+
hibernation_options = try(each.value.hibernation_options, var.defaults.hibernation_options, {})
37+
iam_instance_profile_arn = try(each.value.iam_instance_profile_arn, var.defaults.iam_instance_profile_arn, null)
38+
iam_instance_profile_name = try(each.value.iam_instance_profile_name, var.defaults.iam_instance_profile_name, null)
39+
iam_role_description = try(each.value.iam_role_description, var.defaults.iam_role_description, null)
40+
iam_role_name = try(each.value.iam_role_name, var.defaults.iam_role_name, null)
41+
iam_role_path = try(each.value.iam_role_path, var.defaults.iam_role_path, null)
42+
iam_role_permissions_boundary = try(each.value.iam_role_permissions_boundary, var.defaults.iam_role_permissions_boundary, null)
43+
iam_role_policies = try(each.value.iam_role_policies, var.defaults.iam_role_policies, {})
44+
iam_role_tags = try(each.value.iam_role_tags, var.defaults.iam_role_tags, {})
45+
iam_role_use_name_prefix = try(each.value.iam_role_use_name_prefix, var.defaults.iam_role_use_name_prefix, true)
46+
ignore_desired_capacity_changes = try(each.value.ignore_desired_capacity_changes, var.defaults.ignore_desired_capacity_changes, false)
47+
ignore_failed_scaling_activities = try(each.value.ignore_failed_scaling_activities, var.defaults.ignore_failed_scaling_activities, false)
48+
image_id = try(each.value.image_id, var.defaults.image_id, "")
49+
initial_lifecycle_hooks = try(each.value.initial_lifecycle_hooks, var.defaults.initial_lifecycle_hooks, [])
50+
instance_initiated_shutdown_behavior = try(each.value.instance_initiated_shutdown_behavior, var.defaults.instance_initiated_shutdown_behavior, null)
51+
instance_maintenance_policy = try(each.value.instance_maintenance_policy, var.defaults.instance_maintenance_policy, {})
52+
instance_market_options = try(each.value.instance_market_options, var.defaults.instance_market_options, {})
53+
instance_name = try(each.value.instance_name, var.defaults.instance_name, "")
54+
instance_refresh = try(each.value.instance_refresh, var.defaults.instance_refresh, {})
55+
instance_requirements = try(each.value.instance_requirements, var.defaults.instance_requirements, {})
56+
instance_type = try(each.value.instance_type, var.defaults.instance_type, null)
57+
kernel_id = try(each.value.kernel_id, var.defaults.kernel_id, null)
58+
key_name = try(each.value.key_name, var.defaults.key_name, null)
59+
launch_template_description = try(each.value.launch_template_description, var.defaults.launch_template_description, null)
60+
launch_template_id = try(each.value.launch_template_id, var.defaults.launch_template_id, null)
61+
launch_template_name = try(each.value.launch_template_name, var.defaults.launch_template_name, "")
62+
launch_template_tags = try(each.value.launch_template_tags, var.defaults.launch_template_tags, {})
63+
launch_template_use_name_prefix = try(each.value.launch_template_use_name_prefix, var.defaults.launch_template_use_name_prefix, true)
64+
launch_template_version = try(each.value.launch_template_version, var.defaults.launch_template_version, null)
65+
license_specifications = try(each.value.license_specifications, var.defaults.license_specifications, {})
66+
maintenance_options = try(each.value.maintenance_options, var.defaults.maintenance_options, {})
67+
max_instance_lifetime = try(each.value.max_instance_lifetime, var.defaults.max_instance_lifetime, null)
68+
max_size = try(each.value.max_size, var.defaults.max_size, null)
69+
metadata_options = try(each.value.metadata_options, var.defaults.metadata_options, {})
70+
metrics_granularity = try(each.value.metrics_granularity, var.defaults.metrics_granularity, null)
71+
min_elb_capacity = try(each.value.min_elb_capacity, var.defaults.min_elb_capacity, null)
72+
min_size = try(each.value.min_size, var.defaults.min_size, null)
73+
mixed_instances_policy = try(each.value.mixed_instances_policy, var.defaults.mixed_instances_policy, null)
74+
name = try(each.value.name, var.defaults.name)
75+
network_interfaces = try(each.value.network_interfaces, var.defaults.network_interfaces, [])
76+
placement = try(each.value.placement, var.defaults.placement, {})
77+
placement_group = try(each.value.placement_group, var.defaults.placement_group, null)
78+
private_dns_name_options = try(each.value.private_dns_name_options, var.defaults.private_dns_name_options, {})
79+
protect_from_scale_in = try(each.value.protect_from_scale_in, var.defaults.protect_from_scale_in, false)
80+
putin_khuylo = try(each.value.putin_khuylo, var.defaults.putin_khuylo, true)
81+
ram_disk_id = try(each.value.ram_disk_id, var.defaults.ram_disk_id, null)
82+
scaling_policies = try(each.value.scaling_policies, var.defaults.scaling_policies, {})
83+
schedules = try(each.value.schedules, var.defaults.schedules, {})
84+
security_groups = try(each.value.security_groups, var.defaults.security_groups, [])
85+
service_linked_role_arn = try(each.value.service_linked_role_arn, var.defaults.service_linked_role_arn, null)
86+
suspended_processes = try(each.value.suspended_processes, var.defaults.suspended_processes, [])
87+
tag_specifications = try(each.value.tag_specifications, var.defaults.tag_specifications, [])
88+
tags = try(each.value.tags, var.defaults.tags, {})
89+
termination_policies = try(each.value.termination_policies, var.defaults.termination_policies, [])
90+
traffic_source_attachments = try(each.value.traffic_source_attachments, var.defaults.traffic_source_attachments, {})
91+
update_default_version = try(each.value.update_default_version, var.defaults.update_default_version, null)
92+
use_mixed_instances_policy = try(each.value.use_mixed_instances_policy, var.defaults.use_mixed_instances_policy, false)
93+
use_name_prefix = try(each.value.use_name_prefix, var.defaults.use_name_prefix, true)
94+
user_data = try(each.value.user_data, var.defaults.user_data, null)
95+
vpc_zone_identifier = try(each.value.vpc_zone_identifier, var.defaults.vpc_zone_identifier, null)
96+
wait_for_capacity_timeout = try(each.value.wait_for_capacity_timeout, var.defaults.wait_for_capacity_timeout, null)
97+
wait_for_elb_capacity = try(each.value.wait_for_elb_capacity, var.defaults.wait_for_elb_capacity, null)
98+
warm_pool = try(each.value.warm_pool, var.defaults.warm_pool, {})
99+
}

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: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
terraform {
2+
required_version = ">= 1.3"
3+
4+
required_providers {
5+
aws = {
6+
source = "hashicorp/aws"
7+
version = ">= 5.85"
8+
}
9+
}
10+
}

0 commit comments

Comments
 (0)