Skip to content

Commit 3634462

Browse files
authored
feat: Added wrappers automatically generated via hook (#156)
1 parent 6388103 commit 3634462

File tree

15 files changed

+214
-85
lines changed

15 files changed

+214
-85
lines changed

.github/workflows/pre-commit.yml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,14 @@ jobs:
7171
id: minMax
7272
uses: clowdhaus/[email protected]
7373

74+
- name: Install hcledit (for terraform_wrapper_module_for_each hook)
75+
shell: bash
76+
run: |
77+
curl -L "$(curl -s https://api.github.com/repos/minamijoyo/hcledit/releases/latest | grep -o -E -m 1 "https://.+?_linux_amd64.tar.gz")" > hcledit.tgz
78+
sudo tar -xzf hcledit.tgz -C /usr/bin/ hcledit
79+
rm -f hcledit.tgz 2> /dev/null
80+
hcledit version
81+
7482
- name: Pre-commit Terraform ${{ steps.minMax.outputs.maxVersion }}
7583
uses: clowdhaus/terraform-composite-actions/[email protected]
7684
with:

.pre-commit-config.yaml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
repos:
22
- repo: https://github.com/antonbabenko/pre-commit-terraform
3-
rev: v1.66.0
3+
rev: v1.71.0
44
hooks:
55
- id: terraform_fmt
6+
- id: terraform_wrapper_module_for_each
67
- id: terraform_validate
78
- id: terraform_docs
89
args:

README.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,14 @@ inputs = {
9797
}
9898
```
9999

100+
101+
## Module wrappers
102+
103+
Users of this Terraform module can create multiple similar resources by using [`for_each` meta-argument within `module` block](https://www.terraform.io/language/meta-arguments/for_each) which became available in Terraform 0.13.
104+
105+
Users of Terragrunt can achieve similar results by using modules provided in the [wrappers](https://github.com/terraform-aws-modules/terraform-aws-s3-bucket/tree/master/wrappers) directory, if they prefer to reduce amount of configuration files.
106+
107+
100108
## Examples:
101109

102110
- [Complete](https://github.com/terraform-aws-modules/terraform-aws-s3-bucket/tree/master/examples/complete) - Complete S3 bucket with most of supported features enabled

wrappers/README.md

Lines changed: 36 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,20 @@ This wrapper does not implement any extra functionality.
1212

1313
```hcl
1414
terraform {
15-
source = "git::[email protected]:terraform-aws-modules/terraform-aws-s3-bucket.git?ref=master//wrappers"
15+
source = "tfr:///terraform-aws-modules/s3-bucket/aws//wrappers"
16+
# Alternative source:
17+
# source = "git::[email protected]:terraform-aws-modules/terraform-aws-s3-bucket.git?ref=master//wrappers"
1618
}
1719
1820
inputs = {
21+
defaults = { # Default values
22+
create = true
23+
tags = {
24+
Terraform = "true"
25+
Environment = "dev"
26+
}
27+
}
28+
1929
items = {
2030
my-item = {
2131
# omitted... can be any argument supported by the module
@@ -34,6 +44,14 @@ inputs = {
3444
module "wrapper" {
3545
source = "terraform-aws-modules/s3-bucket/aws//wrappers"
3646
47+
defaults = { # Default values
48+
create = true
49+
tags = {
50+
Terraform = "true"
51+
Environment = "dev"
52+
}
53+
}
54+
3755
items = {
3856
my-item = {
3957
# omitted... can be any argument supported by the module
@@ -52,18 +70,30 @@ module "wrapper" {
5270

5371
```hcl
5472
terraform {
55-
source = "git::[email protected]:terraform-aws-modules/terraform-aws-s3-bucket.git?ref=master//wrappers"
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?ref=master//wrappers"
5676
}
5777
5878
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+
5988
items = {
6089
bucket1 = {
61-
bucket = "my-random-bucket-1"
62-
force_destroy = true
90+
bucket = "my-random-bucket-1"
6391
}
6492
bucket2 = {
65-
bucket = "my-random-bucket-2"
66-
force_destroy = true
93+
bucket = "my-random-bucket-2"
94+
tags = {
95+
Secure = "probably"
96+
}
6797
}
6898
}
6999
}

wrappers/main.tf

Lines changed: 34 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -3,37 +3,38 @@ module "wrapper" {
33

44
for_each = var.items
55

6-
create_bucket = try(each.value.create_bucket, true)
7-
attach_elb_log_delivery_policy = try(each.value.attach_elb_log_delivery_policy, false)
8-
attach_lb_log_delivery_policy = try(each.value.attach_lb_log_delivery_policy, false)
9-
attach_deny_insecure_transport_policy = try(each.value.attach_deny_insecure_transport_policy, false)
10-
attach_require_latest_tls_policy = try(each.value.attach_require_latest_tls_policy, false)
11-
attach_policy = try(each.value.attach_policy, false)
12-
attach_public_policy = try(each.value.attach_public_policy, true)
13-
bucket = try(each.value.bucket, null)
14-
bucket_prefix = try(each.value.bucket_prefix, null)
15-
acl = try(each.value.acl, null)
16-
policy = try(each.value.policy, null)
17-
tags = try(each.value.tags, {})
18-
force_destroy = try(each.value.force_destroy, false)
19-
acceleration_status = try(each.value.acceleration_status, null)
20-
request_payer = try(each.value.request_payer, null)
21-
website = try(each.value.website, {})
22-
cors_rule = try(each.value.cors_rule, [])
23-
versioning = try(each.value.versioning, {})
24-
logging = try(each.value.logging, {})
25-
grant = try(each.value.grant, [])
26-
owner = try(each.value.owner, {})
27-
expected_bucket_owner = try(each.value.expected_bucket_owner, null)
28-
lifecycle_rule = try(each.value.lifecycle_rule, [])
29-
replication_configuration = try(each.value.replication_configuration, {})
30-
server_side_encryption_configuration = try(each.value.server_side_encryption_configuration, {})
31-
object_lock_configuration = try(each.value.object_lock_configuration, {})
32-
block_public_acls = try(each.value.block_public_acls, false)
33-
block_public_policy = try(each.value.block_public_policy, false)
34-
ignore_public_acls = try(each.value.ignore_public_acls, false)
35-
restrict_public_buckets = try(each.value.restrict_public_buckets, false)
36-
control_object_ownership = try(each.value.control_object_ownership, false)
37-
object_ownership = try(each.value.object_ownership, "ObjectWriter")
38-
putin_khuylo = try(each.value.putin_khuylo, true)
6+
create_bucket = try(each.value.create_bucket, var.defaults.create_bucket, true)
7+
attach_elb_log_delivery_policy = try(each.value.attach_elb_log_delivery_policy, var.defaults.attach_elb_log_delivery_policy, false)
8+
attach_lb_log_delivery_policy = try(each.value.attach_lb_log_delivery_policy, var.defaults.attach_lb_log_delivery_policy, false)
9+
attach_deny_insecure_transport_policy = try(each.value.attach_deny_insecure_transport_policy, var.defaults.attach_deny_insecure_transport_policy, false)
10+
attach_require_latest_tls_policy = try(each.value.attach_require_latest_tls_policy, var.defaults.attach_require_latest_tls_policy, false)
11+
attach_policy = try(each.value.attach_policy, var.defaults.attach_policy, false)
12+
attach_public_policy = try(each.value.attach_public_policy, var.defaults.attach_public_policy, true)
13+
bucket = try(each.value.bucket, var.defaults.bucket, null)
14+
bucket_prefix = try(each.value.bucket_prefix, var.defaults.bucket_prefix, null)
15+
acl = try(each.value.acl, var.defaults.acl, null)
16+
policy = try(each.value.policy, var.defaults.policy, null)
17+
tags = try(each.value.tags, var.defaults.tags, {})
18+
force_destroy = try(each.value.force_destroy, var.defaults.force_destroy, false)
19+
acceleration_status = try(each.value.acceleration_status, var.defaults.acceleration_status, null)
20+
request_payer = try(each.value.request_payer, var.defaults.request_payer, null)
21+
website = try(each.value.website, var.defaults.website, {})
22+
cors_rule = try(each.value.cors_rule, var.defaults.cors_rule, [])
23+
versioning = try(each.value.versioning, var.defaults.versioning, {})
24+
logging = try(each.value.logging, var.defaults.logging, {})
25+
grant = try(each.value.grant, var.defaults.grant, [])
26+
owner = try(each.value.owner, var.defaults.owner, {})
27+
expected_bucket_owner = try(each.value.expected_bucket_owner, var.defaults.expected_bucket_owner, null)
28+
lifecycle_rule = try(each.value.lifecycle_rule, var.defaults.lifecycle_rule, [])
29+
replication_configuration = try(each.value.replication_configuration, var.defaults.replication_configuration, {})
30+
server_side_encryption_configuration = try(each.value.server_side_encryption_configuration, var.defaults.server_side_encryption_configuration, {})
31+
object_lock_configuration = try(each.value.object_lock_configuration, var.defaults.object_lock_configuration, {})
32+
object_lock_enabled = try(each.value.object_lock_enabled, var.defaults.object_lock_enabled, false)
33+
block_public_acls = try(each.value.block_public_acls, var.defaults.block_public_acls, false)
34+
block_public_policy = try(each.value.block_public_policy, var.defaults.block_public_policy, false)
35+
ignore_public_acls = try(each.value.ignore_public_acls, var.defaults.ignore_public_acls, false)
36+
restrict_public_buckets = try(each.value.restrict_public_buckets, var.defaults.restrict_public_buckets, false)
37+
control_object_ownership = try(each.value.control_object_ownership, var.defaults.control_object_ownership, false)
38+
object_ownership = try(each.value.object_ownership, var.defaults.object_ownership, "ObjectWriter")
39+
putin_khuylo = try(each.value.putin_khuylo, var.defaults.putin_khuylo, true)
3940
}

wrappers/notification/README.md

Lines changed: 36 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,20 @@ This wrapper does not implement any extra functionality.
1212

1313
```hcl
1414
terraform {
15-
source = "git::[email protected]:terraform-aws-modules/terraform-aws-s3-bucket.git?ref=master//wrappers/notification"
15+
source = "tfr:///terraform-aws-modules/s3-bucket/aws//wrappers/notification"
16+
# Alternative source:
17+
# source = "git::[email protected]:terraform-aws-modules/terraform-aws-s3-bucket.git?ref=master//wrappers/notification"
1618
}
1719
1820
inputs = {
21+
defaults = { # Default values
22+
create = true
23+
tags = {
24+
Terraform = "true"
25+
Environment = "dev"
26+
}
27+
}
28+
1929
items = {
2030
my-item = {
2131
# omitted... can be any argument supported by the module
@@ -34,6 +44,14 @@ inputs = {
3444
module "wrapper" {
3545
source = "terraform-aws-modules/s3-bucket/aws//wrappers/notification"
3646
47+
defaults = { # Default values
48+
create = true
49+
tags = {
50+
Terraform = "true"
51+
Environment = "dev"
52+
}
53+
}
54+
3755
items = {
3856
my-item = {
3957
# omitted... can be any argument supported by the module
@@ -52,18 +70,30 @@ module "wrapper" {
5270

5371
```hcl
5472
terraform {
55-
source = "git::[email protected]:terraform-aws-modules/terraform-aws-s3-bucket.git?ref=master//wrappers"
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?ref=master//wrappers"
5676
}
5777
5878
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+
5988
items = {
6089
bucket1 = {
61-
bucket = "my-random-bucket-1"
62-
force_destroy = true
90+
bucket = "my-random-bucket-1"
6391
}
6492
bucket2 = {
65-
bucket = "my-random-bucket-2"
66-
force_destroy = true
93+
bucket = "my-random-bucket-2"
94+
tags = {
95+
Secure = "probably"
96+
}
6797
}
6898
}
6999
}

wrappers/notification/main.tf

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,13 @@ module "wrapper" {
33

44
for_each = var.items
55

6-
create = try(each.value.create, true)
7-
create_sns_policy = try(each.value.create_sns_policy, true)
8-
create_sqs_policy = try(each.value.create_sqs_policy, true)
9-
bucket = try(each.value.bucket, "")
10-
bucket_arn = try(each.value.bucket_arn, null)
11-
eventbridge = try(each.value.eventbridge, null)
12-
lambda_notifications = try(each.value.lambda_notifications, {})
13-
sqs_notifications = try(each.value.sqs_notifications, {})
14-
sns_notifications = try(each.value.sns_notifications, {})
6+
create = try(each.value.create, var.defaults.create, true)
7+
create_sns_policy = try(each.value.create_sns_policy, var.defaults.create_sns_policy, true)
8+
create_sqs_policy = try(each.value.create_sqs_policy, var.defaults.create_sqs_policy, true)
9+
bucket = try(each.value.bucket, var.defaults.bucket, "")
10+
bucket_arn = try(each.value.bucket_arn, var.defaults.bucket_arn, null)
11+
eventbridge = try(each.value.eventbridge, var.defaults.eventbridge, null)
12+
lambda_notifications = try(each.value.lambda_notifications, var.defaults.lambda_notifications, {})
13+
sqs_notifications = try(each.value.sqs_notifications, var.defaults.sqs_notifications, {})
14+
sns_notifications = try(each.value.sns_notifications, var.defaults.sns_notifications, {})
1515
}

wrappers/notification/outputs.tf

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

wrappers/notification/variables.tf

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

wrappers/object/README.md

Lines changed: 36 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,20 @@ This wrapper does not implement any extra functionality.
1212

1313
```hcl
1414
terraform {
15-
source = "git::[email protected]:terraform-aws-modules/terraform-aws-s3-bucket.git?ref=master//wrappers/object"
15+
source = "tfr:///terraform-aws-modules/s3-bucket/aws//wrappers/object"
16+
# Alternative source:
17+
# source = "git::[email protected]:terraform-aws-modules/terraform-aws-s3-bucket.git?ref=master//wrappers/object"
1618
}
1719
1820
inputs = {
21+
defaults = { # Default values
22+
create = true
23+
tags = {
24+
Terraform = "true"
25+
Environment = "dev"
26+
}
27+
}
28+
1929
items = {
2030
my-item = {
2131
# omitted... can be any argument supported by the module
@@ -34,6 +44,14 @@ inputs = {
3444
module "wrapper" {
3545
source = "terraform-aws-modules/s3-bucket/aws//wrappers/object"
3646
47+
defaults = { # Default values
48+
create = true
49+
tags = {
50+
Terraform = "true"
51+
Environment = "dev"
52+
}
53+
}
54+
3755
items = {
3856
my-item = {
3957
# omitted... can be any argument supported by the module
@@ -52,18 +70,30 @@ module "wrapper" {
5270

5371
```hcl
5472
terraform {
55-
source = "git::[email protected]:terraform-aws-modules/terraform-aws-s3-bucket.git?ref=master//wrappers"
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?ref=master//wrappers"
5676
}
5777
5878
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+
5988
items = {
6089
bucket1 = {
61-
bucket = "my-random-bucket-1"
62-
force_destroy = true
90+
bucket = "my-random-bucket-1"
6391
}
6492
bucket2 = {
65-
bucket = "my-random-bucket-2"
66-
force_destroy = true
93+
bucket = "my-random-bucket-2"
94+
tags = {
95+
Secure = "probably"
96+
}
6797
}
6898
}
6999
}

0 commit comments

Comments
 (0)