Skip to content

Commit 95bc9f7

Browse files
authored
feat: Add module wrappers (terraform-aws-modules#92)
1 parent e5b3f1a commit 95bc9f7

File tree

16 files changed

+339
-0
lines changed

16 files changed

+339
-0
lines changed

.pre-commit-config.yaml

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,21 @@
11
repos:
2+
# - repo: local # @todo: move to pre-commit-terraform, add support for multiple module dirs, and run before terraform_docs
3+
# hooks:
4+
# - id: terraform_wrapper
5+
# name: "Terraform module wrapper - root"
6+
# entry: /Users/Bob/Sites/terraform-aws-modules/scripts/generate-terraform-wrappers.sh --overwrite
7+
# language: system
8+
# pass_filenames: false
9+
# - id: terraform_wrapper
10+
# name: "Terraform module wrapper - object"
11+
# entry: /Users/Bob/Sites/terraform-aws-modules/scripts/generate-terraform-wrappers.sh --module-dir modules/object --overwrite
12+
# language: system
13+
# pass_filenames: false
14+
# - id: terraform_wrapper
15+
# name: "Terraform module wrapper - notification"
16+
# entry: /Users/Bob/Sites/terraform-aws-modules/scripts/generate-terraform-wrappers.sh --module-dir modules/notification --overwrite
17+
# language: system
18+
# pass_filenames: false
219
- repo: git://github.com/antonbabenko/pre-commit-terraform
320
rev: v1.50.0
421
hooks:

wrappers/README.md

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
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 = "git::git@github.com:terraform-aws-modules/terraform-aws-s3-bucket.git?ref=master//wrappers"
16+
}
17+
18+
inputs = {
19+
items = {
20+
my-item = {
21+
# omitted... can be any argument supported by the module
22+
}
23+
my-second-item = {
24+
# omitted... can be any argument supported by the module
25+
}
26+
# omitted...
27+
}
28+
}
29+
```
30+
31+
## Usage with Terraform:
32+
33+
```hcl
34+
module "wrapper" {
35+
source = "terraform-aws-modules/s3-bucket/aws//wrappers"
36+
37+
items = {
38+
my-item = {
39+
# omitted... can be any argument supported by the module
40+
}
41+
my-second-item = {
42+
# omitted... can be any argument supported by the module
43+
}
44+
# omitted...
45+
}
46+
}
47+
```
48+
49+
## Example: Manage multiple S3 buckets in one Terragrunt layer
50+
51+
`eu-west-1/s3-buckets/terragrunt.hcl`:
52+
53+
```hcl
54+
terraform {
55+
source = "git::git@github.com:terraform-aws-modules/terraform-aws-s3-bucket.git?ref=master//wrappers"
56+
}
57+
58+
inputs = {
59+
items = {
60+
bucket1 = {
61+
bucket = "my-random-bucket-1"
62+
force_destroy = true
63+
}
64+
bucket2 = {
65+
bucket = "my-random-bucket-2"
66+
force_destroy = true
67+
}
68+
}
69+
}
70+
```

wrappers/main.tf

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
module "wrapper" {
2+
source = "../"
3+
4+
for_each = var.items
5+
6+
create_bucket = lookup(each.value, "create_bucket", true)
7+
attach_elb_log_delivery_policy = lookup(each.value, "attach_elb_log_delivery_policy", false)
8+
attach_deny_insecure_transport_policy = lookup(each.value, "attach_deny_insecure_transport_policy", false)
9+
attach_policy = lookup(each.value, "attach_policy", false)
10+
attach_public_policy = lookup(each.value, "attach_public_policy", true)
11+
bucket = lookup(each.value, "bucket", null)
12+
bucket_prefix = lookup(each.value, "bucket_prefix", null)
13+
acl = lookup(each.value, "acl", "private")
14+
policy = lookup(each.value, "policy", null)
15+
tags = lookup(each.value, "tags", {})
16+
force_destroy = lookup(each.value, "force_destroy", false)
17+
acceleration_status = lookup(each.value, "acceleration_status", null)
18+
request_payer = lookup(each.value, "request_payer", null)
19+
website = lookup(each.value, "website", {})
20+
cors_rule = lookup(each.value, "cors_rule", [])
21+
versioning = lookup(each.value, "versioning", {})
22+
logging = lookup(each.value, "logging", {})
23+
grant = lookup(each.value, "grant", [])
24+
lifecycle_rule = lookup(each.value, "lifecycle_rule", [])
25+
replication_configuration = lookup(each.value, "replication_configuration", {})
26+
server_side_encryption_configuration = lookup(each.value, "server_side_encryption_configuration", {})
27+
object_lock_configuration = lookup(each.value, "object_lock_configuration", {})
28+
block_public_acls = lookup(each.value, "block_public_acls", false)
29+
block_public_policy = lookup(each.value, "block_public_policy", false)
30+
ignore_public_acls = lookup(each.value, "ignore_public_acls", false)
31+
restrict_public_buckets = lookup(each.value, "restrict_public_buckets", false)
32+
}

wrappers/notification/README.md

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
# Wrapper for module: `modules/notification`
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 = "git::git@github.com:terraform-aws-modules/terraform-aws-s3-bucket.git?ref=master//wrappers/notification"
16+
}
17+
18+
inputs = {
19+
items = {
20+
my-item = {
21+
# omitted... can be any argument supported by the module
22+
}
23+
my-second-item = {
24+
# omitted... can be any argument supported by the module
25+
}
26+
# omitted...
27+
}
28+
}
29+
```
30+
31+
## Usage with Terraform:
32+
33+
```hcl
34+
module "wrapper" {
35+
source = "terraform-aws-modules/s3-bucket/aws//wrappers/notification"
36+
37+
items = {
38+
my-item = {
39+
# omitted... can be any argument supported by the module
40+
}
41+
my-second-item = {
42+
# omitted... can be any argument supported by the module
43+
}
44+
# omitted...
45+
}
46+
}
47+
```
48+
49+
## Example: Manage multiple S3 buckets in one Terragrunt layer
50+
51+
`eu-west-1/s3-buckets/terragrunt.hcl`:
52+
53+
```hcl
54+
terraform {
55+
source = "git::git@github.com:terraform-aws-modules/terraform-aws-s3-bucket.git?ref=master//wrappers"
56+
}
57+
58+
inputs = {
59+
items = {
60+
bucket1 = {
61+
bucket = "my-random-bucket-1"
62+
force_destroy = true
63+
}
64+
bucket2 = {
65+
bucket = "my-random-bucket-2"
66+
force_destroy = true
67+
}
68+
}
69+
}
70+
```

wrappers/notification/main.tf

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
module "wrapper" {
2+
source = "../../modules/notification"
3+
4+
for_each = var.items
5+
6+
create = lookup(each.value, "create", true)
7+
create_sns_policy = lookup(each.value, "create_sns_policy", true)
8+
create_sqs_policy = lookup(each.value, "create_sqs_policy", true)
9+
bucket = lookup(each.value, "bucket", "")
10+
bucket_arn = lookup(each.value, "bucket_arn", null)
11+
lambda_notifications = lookup(each.value, "lambda_notifications", {})
12+
sqs_notifications = lookup(each.value, "sqs_notifications", {})
13+
sns_notifications = lookup(each.value, "sns_notifications", {})
14+
}

wrappers/notification/outputs.tf

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

wrappers/notification/variables.tf

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
variable "items" {
2+
description = "Maps of items to create a wrapper from. Values are passed through to the module."
3+
type = any
4+
default = {}
5+
}

wrappers/notification/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"
3+
}

wrappers/object/README.md

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
# Wrapper for module: `modules/object`
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 = "git::git@github.com:terraform-aws-modules/terraform-aws-s3-bucket.git?ref=master//wrappers/object"
16+
}
17+
18+
inputs = {
19+
items = {
20+
my-item = {
21+
# omitted... can be any argument supported by the module
22+
}
23+
my-second-item = {
24+
# omitted... can be any argument supported by the module
25+
}
26+
# omitted...
27+
}
28+
}
29+
```
30+
31+
## Usage with Terraform:
32+
33+
```hcl
34+
module "wrapper" {
35+
source = "terraform-aws-modules/s3-bucket/aws//wrappers/object"
36+
37+
items = {
38+
my-item = {
39+
# omitted... can be any argument supported by the module
40+
}
41+
my-second-item = {
42+
# omitted... can be any argument supported by the module
43+
}
44+
# omitted...
45+
}
46+
}
47+
```
48+
49+
## Example: Manage multiple S3 buckets in one Terragrunt layer
50+
51+
`eu-west-1/s3-buckets/terragrunt.hcl`:
52+
53+
```hcl
54+
terraform {
55+
source = "git::git@github.com:terraform-aws-modules/terraform-aws-s3-bucket.git?ref=master//wrappers"
56+
}
57+
58+
inputs = {
59+
items = {
60+
bucket1 = {
61+
bucket = "my-random-bucket-1"
62+
force_destroy = true
63+
}
64+
bucket2 = {
65+
bucket = "my-random-bucket-2"
66+
force_destroy = true
67+
}
68+
}
69+
}
70+
```

wrappers/object/main.tf

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
module "wrapper" {
2+
source = "../../modules/object"
3+
4+
for_each = var.items
5+
6+
create = lookup(each.value, "create", true)
7+
bucket = lookup(each.value, "bucket", "")
8+
key = lookup(each.value, "key", "")
9+
file_source = lookup(each.value, "file_source", null)
10+
content = lookup(each.value, "content", null)
11+
content_base64 = lookup(each.value, "content_base64", null)
12+
acl = lookup(each.value, "acl", null)
13+
cache_control = lookup(each.value, "cache_control", null)
14+
content_disposition = lookup(each.value, "content_disposition", null)
15+
content_encoding = lookup(each.value, "content_encoding", null)
16+
content_language = lookup(each.value, "content_language", null)
17+
content_type = lookup(each.value, "content_type", null)
18+
website_redirect = lookup(each.value, "website_redirect", null)
19+
storage_class = lookup(each.value, "storage_class", null)
20+
etag = lookup(each.value, "etag", null)
21+
server_side_encryption = lookup(each.value, "server_side_encryption", null)
22+
kms_key_id = lookup(each.value, "kms_key_id", null)
23+
bucket_key_enabled = lookup(each.value, "bucket_key_enabled", null)
24+
metadata = lookup(each.value, "metadata", {})
25+
tags = lookup(each.value, "tags", {})
26+
force_destroy = lookup(each.value, "force_destroy", false)
27+
object_lock_legal_hold_status = lookup(each.value, "object_lock_legal_hold_status", null)
28+
object_lock_mode = lookup(each.value, "object_lock_mode", null)
29+
object_lock_retain_until_date = lookup(each.value, "object_lock_retain_until_date", null)
30+
}

wrappers/object/outputs.tf

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

wrappers/object/variables.tf

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
variable "items" {
2+
description = "Maps of items to create a wrapper from. Values are passed through to the module."
3+
type = any
4+
default = {}
5+
}

wrappers/object/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"
3+
}

wrappers/outputs.tf

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

wrappers/variables.tf

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
variable "items" {
2+
description = "Maps of items to create a wrapper from. Values are passed through to the module."
3+
type = any
4+
default = {}
5+
}

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"
3+
}

0 commit comments

Comments
 (0)