diff --git a/data-solutions/cmek-via-centralized-kms/main.tf b/data-solutions/cmek-via-centralized-kms/main.tf
index 66b7e6a3..94832905 100644
--- a/data-solutions/cmek-via-centralized-kms/main.tf
+++ b/data-solutions/cmek-via-centralized-kms/main.tf
@@ -79,10 +79,6 @@ module "kms" {
location = var.location
}
keys = { key-gce = null, key-gcs = null }
- key_iam_roles = {
- key-gce = ["roles/cloudkms.cryptoKeyEncrypterDecrypter"]
- key-gcs = ["roles/cloudkms.cryptoKeyEncrypterDecrypter"]
- }
key_iam_members = {
key-gce = {
"roles/cloudkms.cryptoKeyEncrypterDecrypter" = [
diff --git a/data-solutions/gcs-to-bq-with-dataflow/main.tf b/data-solutions/gcs-to-bq-with-dataflow/main.tf
index 61bc24cf..41eca04a 100644
--- a/data-solutions/gcs-to-bq-with-dataflow/main.tf
+++ b/data-solutions/gcs-to-bq-with-dataflow/main.tf
@@ -120,11 +120,6 @@ module "kms" {
location = var.location
}
keys = { key-gce = null, key-gcs = null, key-bq = null }
- key_iam_roles = {
- key-gce = ["roles/cloudkms.cryptoKeyEncrypterDecrypter"]
- key-gcs = ["roles/cloudkms.cryptoKeyEncrypterDecrypter"]
- key-bq = ["roles/cloudkms.cryptoKeyEncrypterDecrypter"]
- }
key_iam_members = {
key-gce = {
"roles/cloudkms.cryptoKeyEncrypterDecrypter" = [
@@ -155,9 +150,6 @@ module "kms-regional" {
location = var.region
}
keys = { key-df = null }
- key_iam_roles = {
- key-df = ["roles/cloudkms.cryptoKeyEncrypterDecrypter"]
- }
key_iam_members = {
key-df = {
"roles/cloudkms.cryptoKeyEncrypterDecrypter" = [
diff --git a/modules/kms/README.md b/modules/kms/README.md
index 69ceb882..98c5743e 100644
--- a/modules/kms/README.md
+++ b/modules/kms/README.md
@@ -16,7 +16,6 @@ In this module **no lifecycle blocks are set on resources to prevent destroy**,
module "kms" {
source = "../modules/kms"
project_id = "my-project"
- iam_roles = ["roles/owner"]
iam_members = {
"roles/owner" = ["user:user1@example.com"]
}
@@ -32,9 +31,6 @@ module "kms" {
module "kms" {
source = "../modules/kms"
project_id = "my-project"
- key_iam_roles = {
- key-a = ["roles/owner"]
- }
key_iam_members = {
key-a = {
"roles/owner" = ["user:user1@example.com"]
@@ -76,10 +72,8 @@ module "kms" {
|---|---|:---: |:---:|:---:|
| keyring | Keyring attributes. | object({...})
| ✓ | |
| project_id | Project id where the keyring will be created. | string
| ✓ | |
-| *iam_members* | Keyring IAM members. | map(list(string))
| | {}
|
-| *iam_roles* | Keyring IAM roles. | list(string)
| | []
|
-| *key_iam_members* | IAM members keyed by key name and role. | map(map(list(string)))
| | {}
|
-| *key_iam_roles* | IAM roles keyed by key name. | map(list(string))
| | {}
|
+| *iam_members* | Keyring IAM members. | map(set(string))
| | {}
|
+| *key_iam_members* | IAM members keyed by key name and role. | map(map(set(string)))
| | {}
|
| *key_purpose* | Per-key purpose, if not set defaults will be used. If purpose is not `ENCRYPT_DECRYPT` (the default), `version_template.algorithm` is required. | map(object({...}))
| | {}
|
| *key_purpose_defaults* | Defaults used for key purpose when not defined at the key level. If purpose is not `ENCRYPT_DECRYPT` (the default), `version_template.algorithm` is required. | object({...})
| | ...
|
| *keyring_create* | Set to false to manage keys and IAM bindings in an existing keyring. | bool
| | true
|
diff --git a/modules/kms/main.tf b/modules/kms/main.tf
index e69f3381..a6f4795f 100644
--- a/modules/kms/main.tf
+++ b/modules/kms/main.tf
@@ -15,14 +15,15 @@
*/
locals {
- key_iam_pairs = flatten([
- for name, roles in var.key_iam_roles :
- [for role in roles : { name = name, role = role }]
+ key_iam_members = flatten([
+ for key, roles in var.key_iam_members : [
+ for role, members in roles : {
+ key = key
+ role = role
+ members = members
+ }
+ ]
])
- key_iam_keypairs = {
- for pair in local.key_iam_pairs :
- "${pair.name}-${pair.role}" => pair
- }
key_purpose = {
for key, attrs in var.keys : key => try(
var.key_purpose[key], var.key_purpose_defaults
@@ -47,16 +48,13 @@ resource "google_kms_key_ring" "default" {
project = var.project_id
name = var.keyring.name
location = var.keyring.location
- # lifecycle {
- # prevent_destroy = true
- # }
}
resource "google_kms_key_ring_iam_binding" "default" {
- for_each = toset(var.iam_roles)
+ for_each = var.iam_members
key_ring_id = local.keyring.self_link
- role = each.value
- members = lookup(var.iam_members, each.value, [])
+ role = each.key
+ members = each.value
}
resource "google_kms_crypto_key" "default" {
@@ -73,16 +71,14 @@ resource "google_kms_crypto_key" "default" {
protection_level = local.key_purpose[each.key].version_template.protection_level
}
}
- # lifecycle {
- # prevent_destroy = true
- # }
}
resource "google_kms_crypto_key_iam_binding" "default" {
- for_each = local.key_iam_keypairs
+ for_each = {
+ for binding in local.key_iam_members :
+ "${binding.key}.${binding.role}" => binding
+ }
role = each.value.role
- crypto_key_id = google_kms_crypto_key.default[each.value.name].self_link
- members = lookup(
- lookup(var.key_iam_members, each.value.name, {}), each.value.role, []
- )
+ crypto_key_id = google_kms_crypto_key.default[each.value.key].self_link
+ members = each.value.members
}
diff --git a/modules/kms/variables.tf b/modules/kms/variables.tf
index 42ec689b..1f104cdf 100644
--- a/modules/kms/variables.tf
+++ b/modules/kms/variables.tf
@@ -16,25 +16,13 @@
variable "iam_members" {
description = "Keyring IAM members."
- type = map(list(string))
+ type = map(set(string))
default = {}
}
-variable "iam_roles" {
- description = "Keyring IAM roles."
- type = list(string)
- default = []
-}
-
variable "key_iam_members" {
description = "IAM members keyed by key name and role."
- type = map(map(list(string)))
- default = {}
-}
-
-variable "key_iam_roles" {
- description = "IAM roles keyed by key name."
- type = map(list(string))
+ type = map(map(set(string)))
default = {}
}
diff --git a/tests/modules/kms/fixture/main.tf b/tests/modules/kms/fixture/main.tf
index f027f978..45fd119b 100644
--- a/tests/modules/kms/fixture/main.tf
+++ b/tests/modules/kms/fixture/main.tf
@@ -17,9 +17,7 @@
module "test" {
source = "../../../../modules/kms"
iam_members = var.iam_members
- iam_roles = var.iam_roles
key_iam_members = var.key_iam_members
- key_iam_roles = var.key_iam_roles
key_purpose = var.key_purpose
key_purpose_defaults = var.key_purpose_defaults
keyring = var.keyring
diff --git a/tests/modules/kms/fixture/variables.tf b/tests/modules/kms/fixture/variables.tf
index 10f3f318..04b77d84 100644
--- a/tests/modules/kms/fixture/variables.tf
+++ b/tests/modules/kms/fixture/variables.tf
@@ -21,11 +21,6 @@ variable "iam_members" {
}
}
-variable "iam_roles" {
- type = list(string)
- default = ["roles/owner"]
-}
-
variable "key_iam_members" {
type = map(map(list(string)))
default = {
@@ -35,13 +30,6 @@ variable "key_iam_members" {
}
}
-variable "key_iam_roles" {
- type = map(list(string))
- default = {
- key-a = ["roles/owner"]
- }
-}
-
variable "key_purpose" {
type = map(object({
purpose = string