Skip to content

Commit fb9126c

Browse files
authored
feat: Add support for creating custom repository policy statements (#27)
1 parent 9f4b587 commit fb9126c

File tree

6 files changed

+72
-24
lines changed

6 files changed

+72
-24
lines changed

.pre-commit-config.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
repos:
22
- repo: https://github.com/antonbabenko/pre-commit-terraform
3-
rev: v1.76.0
3+
rev: v1.88.0
44
hooks:
55
- id: terraform_fmt
66
- id: terraform_wrapper_module_for_each
@@ -24,7 +24,7 @@ repos:
2424
- '--args=--only=terraform_standard_module_structure'
2525
- '--args=--only=terraform_workspace_remote'
2626
- repo: https://github.com/pre-commit/pre-commit-hooks
27-
rev: v4.3.0
27+
rev: v4.5.0
2828
hooks:
2929
- id: check-merge-conflict
3030
- id: end-of-file-fixer

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -238,6 +238,7 @@ No modules.
238238
| <a name="input_repository_lifecycle_policy"></a> [repository\_lifecycle\_policy](#input\_repository\_lifecycle\_policy) | The policy document. This is a JSON formatted string. See more details about [Policy Parameters](http://docs.aws.amazon.com/AmazonECR/latest/userguide/LifecyclePolicies.html#lifecycle_policy_parameters) in the official AWS docs | `string` | `""` | no |
239239
| <a name="input_repository_name"></a> [repository\_name](#input\_repository\_name) | The name of the repository | `string` | `""` | no |
240240
| <a name="input_repository_policy"></a> [repository\_policy](#input\_repository\_policy) | The JSON policy to apply to the repository. If not specified, uses the default policy | `string` | `null` | no |
241+
| <a name="input_repository_policy_statements"></a> [repository\_policy\_statements](#input\_repository\_policy\_statements) | A map of IAM policy [statements](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/data-sources/iam_policy_document#statement) for custom permission usage | `any` | `{}` | no |
241242
| <a name="input_repository_read_access_arns"></a> [repository\_read\_access\_arns](#input\_repository\_read\_access\_arns) | The ARNs of the IAM users/roles that have read access to the repository | `list(string)` | `[]` | no |
242243
| <a name="input_repository_read_write_access_arns"></a> [repository\_read\_write\_access\_arns](#input\_repository\_read\_write\_access\_arns) | The ARNs of the IAM users/roles that have read/write access to the repository | `list(string)` | `[]` | no |
243244
| <a name="input_repository_type"></a> [repository\_type](#input\_repository\_type) | The type of repository to create. Either `public` or `private` | `string` | `"private"` | no |

main.tf

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,6 @@ data "aws_iam_policy_document" "repository" {
6262
}
6363
}
6464

65-
6665
dynamic "statement" {
6766
for_each = var.repository_type == "private" && length(var.repository_lambda_read_access_arns) > 0 ? [1] : []
6867

@@ -129,6 +128,47 @@ data "aws_iam_policy_document" "repository" {
129128
]
130129
}
131130
}
131+
132+
dynamic "statement" {
133+
for_each = var.repository_policy_statements
134+
135+
content {
136+
sid = try(statement.value.sid, null)
137+
actions = try(statement.value.actions, null)
138+
not_actions = try(statement.value.not_actions, null)
139+
effect = try(statement.value.effect, null)
140+
resources = try(statement.value.resources, null)
141+
not_resources = try(statement.value.not_resources, null)
142+
143+
dynamic "principals" {
144+
for_each = try(statement.value.principals, [])
145+
146+
content {
147+
type = principals.value.type
148+
identifiers = principals.value.identifiers
149+
}
150+
}
151+
152+
dynamic "not_principals" {
153+
for_each = try(statement.value.not_principals, [])
154+
155+
content {
156+
type = not_principals.value.type
157+
identifiers = not_principals.value.identifiers
158+
}
159+
}
160+
161+
dynamic "condition" {
162+
for_each = try(statement.value.conditions, [])
163+
164+
content {
165+
test = condition.value.test
166+
values = condition.value.values
167+
variable = condition.value.variable
168+
}
169+
}
170+
}
171+
}
132172
}
133173

134174
################################################################################

variables.tf

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,12 @@ variable "repository_read_write_access_arns" {
102102
default = []
103103
}
104104

105+
variable "repository_policy_statements" {
106+
description = "A map of IAM policy [statements](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/data-sources/iam_policy_document#statement) for custom permission usage"
107+
type = any
108+
default = {}
109+
}
110+
105111
################################################################################
106112
# Lifecycle Policy
107113
################################################################################

wrappers/main.tf

Lines changed: 21 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -3,31 +3,32 @@ module "wrapper" {
33

44
for_each = var.items
55

6+
attach_repository_policy = try(each.value.attach_repository_policy, var.defaults.attach_repository_policy, true)
67
create = try(each.value.create, var.defaults.create, true)
7-
tags = try(each.value.tags, var.defaults.tags, {})
8-
repository_type = try(each.value.repository_type, var.defaults.repository_type, "private")
8+
create_lifecycle_policy = try(each.value.create_lifecycle_policy, var.defaults.create_lifecycle_policy, true)
9+
create_registry_policy = try(each.value.create_registry_policy, var.defaults.create_registry_policy, false)
10+
create_registry_replication_configuration = try(each.value.create_registry_replication_configuration, var.defaults.create_registry_replication_configuration, false)
911
create_repository = try(each.value.create_repository, var.defaults.create_repository, true)
10-
repository_name = try(each.value.repository_name, var.defaults.repository_name, "")
11-
repository_image_tag_mutability = try(each.value.repository_image_tag_mutability, var.defaults.repository_image_tag_mutability, "IMMUTABLE")
12-
repository_encryption_type = try(each.value.repository_encryption_type, var.defaults.repository_encryption_type, null)
13-
repository_kms_key = try(each.value.repository_kms_key, var.defaults.repository_kms_key, null)
14-
repository_image_scan_on_push = try(each.value.repository_image_scan_on_push, var.defaults.repository_image_scan_on_push, true)
15-
repository_policy = try(each.value.repository_policy, var.defaults.repository_policy, null)
16-
repository_force_delete = try(each.value.repository_force_delete, var.defaults.repository_force_delete, null)
17-
attach_repository_policy = try(each.value.attach_repository_policy, var.defaults.attach_repository_policy, true)
1812
create_repository_policy = try(each.value.create_repository_policy, var.defaults.create_repository_policy, true)
19-
repository_read_access_arns = try(each.value.repository_read_access_arns, var.defaults.repository_read_access_arns, [])
20-
repository_lambda_read_access_arns = try(each.value.repository_lambda_read_access_arns, var.defaults.repository_lambda_read_access_arns, [])
21-
repository_read_write_access_arns = try(each.value.repository_read_write_access_arns, var.defaults.repository_read_write_access_arns, [])
22-
create_lifecycle_policy = try(each.value.create_lifecycle_policy, var.defaults.create_lifecycle_policy, true)
23-
repository_lifecycle_policy = try(each.value.repository_lifecycle_policy, var.defaults.repository_lifecycle_policy, "")
13+
manage_registry_scanning_configuration = try(each.value.manage_registry_scanning_configuration, var.defaults.manage_registry_scanning_configuration, false)
2414
public_repository_catalog_data = try(each.value.public_repository_catalog_data, var.defaults.public_repository_catalog_data, {})
25-
create_registry_policy = try(each.value.create_registry_policy, var.defaults.create_registry_policy, false)
2615
registry_policy = try(each.value.registry_policy, var.defaults.registry_policy, null)
2716
registry_pull_through_cache_rules = try(each.value.registry_pull_through_cache_rules, var.defaults.registry_pull_through_cache_rules, {})
28-
manage_registry_scanning_configuration = try(each.value.manage_registry_scanning_configuration, var.defaults.manage_registry_scanning_configuration, false)
29-
registry_scan_type = try(each.value.registry_scan_type, var.defaults.registry_scan_type, "ENHANCED")
30-
registry_scan_rules = try(each.value.registry_scan_rules, var.defaults.registry_scan_rules, [])
31-
create_registry_replication_configuration = try(each.value.create_registry_replication_configuration, var.defaults.create_registry_replication_configuration, false)
3217
registry_replication_rules = try(each.value.registry_replication_rules, var.defaults.registry_replication_rules, [])
18+
registry_scan_rules = try(each.value.registry_scan_rules, var.defaults.registry_scan_rules, [])
19+
registry_scan_type = try(each.value.registry_scan_type, var.defaults.registry_scan_type, "ENHANCED")
20+
repository_encryption_type = try(each.value.repository_encryption_type, var.defaults.repository_encryption_type, null)
21+
repository_force_delete = try(each.value.repository_force_delete, var.defaults.repository_force_delete, null)
22+
repository_image_scan_on_push = try(each.value.repository_image_scan_on_push, var.defaults.repository_image_scan_on_push, true)
23+
repository_image_tag_mutability = try(each.value.repository_image_tag_mutability, var.defaults.repository_image_tag_mutability, "IMMUTABLE")
24+
repository_kms_key = try(each.value.repository_kms_key, var.defaults.repository_kms_key, null)
25+
repository_lambda_read_access_arns = try(each.value.repository_lambda_read_access_arns, var.defaults.repository_lambda_read_access_arns, [])
26+
repository_lifecycle_policy = try(each.value.repository_lifecycle_policy, var.defaults.repository_lifecycle_policy, "")
27+
repository_name = try(each.value.repository_name, var.defaults.repository_name, "")
28+
repository_policy = try(each.value.repository_policy, var.defaults.repository_policy, null)
29+
repository_policy_statements = try(each.value.repository_policy_statements, var.defaults.repository_policy_statements, {})
30+
repository_read_access_arns = try(each.value.repository_read_access_arns, var.defaults.repository_read_access_arns, [])
31+
repository_read_write_access_arns = try(each.value.repository_read_write_access_arns, var.defaults.repository_read_write_access_arns, [])
32+
repository_type = try(each.value.repository_type, var.defaults.repository_type, "private")
33+
tags = try(each.value.tags, var.defaults.tags, {})
3334
}

wrappers/outputs.tf

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +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
4+
# sensitive = false # No sensitive module output found
55
}

0 commit comments

Comments
 (0)