Skip to content

Commit 7c0c8b3

Browse files
authored
feat: added support for enabling Event Notifications integration when passing an existing secrets manager instance (#162)
1 parent c9225ba commit 7c0c8b3

File tree

14 files changed

+72
-46
lines changed

14 files changed

+72
-46
lines changed

README.md

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ You need the following permissions to run this module.
6868
| Name | Version |
6969
|------|---------|
7070
| <a name="requirement_terraform"></a> [terraform](#requirement\_terraform) | >= v1.0.0 |
71-
| <a name="requirement_ibm"></a> [ibm](#requirement\_ibm) | >= 1.62.0, < 2.0.0 |
71+
| <a name="requirement_ibm"></a> [ibm](#requirement\_ibm) | >= 1.65.0, <2.0.0 |
7272
| <a name="requirement_time"></a> [time](#requirement\_time) | >= 0.9.1, < 1.0.0 |
7373

7474
### Modules
@@ -87,6 +87,7 @@ You need the following permissions to run this module.
8787
| [ibm_resource_instance.secrets_manager_instance](https://registry.terraform.io/providers/IBM-Cloud/ibm/latest/docs/resources/resource_instance) | resource |
8888
| [ibm_sm_en_registration.sm_en_registration](https://registry.terraform.io/providers/IBM-Cloud/ibm/latest/docs/resources/sm_en_registration) | resource |
8989
| [time_sleep.wait_for_authorization_policy](https://registry.terraform.io/providers/hashicorp/time/latest/docs/resources/sleep) | resource |
90+
| [ibm_resource_instance.sm_instance](https://registry.terraform.io/providers/IBM-Cloud/ibm/latest/docs/data-sources/resource_instance) | data source |
9091

9192
### Inputs
9293

@@ -98,12 +99,13 @@ You need the following permissions to run this module.
9899
| <a name="input_endpoint_type"></a> [endpoint\_type](#input\_endpoint\_type) | The type of endpoint (public or private) to connect to the Secrets Manager API. The Terraform provider uses this endpoint type to interact with the Secrets Manager API and configure Event Notifications. | `string` | `"public"` | no |
99100
| <a name="input_existing_en_instance_crn"></a> [existing\_en\_instance\_crn](#input\_existing\_en\_instance\_crn) | The CRN of the Event Notifications service to enable lifecycle notifications for your Secrets Manager instance. | `string` | `null` | no |
100101
| <a name="input_existing_kms_instance_guid"></a> [existing\_kms\_instance\_guid](#input\_existing\_kms\_instance\_guid) | The GUID of the Hyper Protect Crypto Services or Key Protect instance in which the key specified in `kms_key_crn` is coming from. Required only if `kms_encryption_enabled` is set to true, and `skip_kms_iam_authorization_policy` is set to false. | `string` | `null` | no |
102+
| <a name="input_existing_sm_instance_crn"></a> [existing\_sm\_instance\_crn](#input\_existing\_sm\_instance\_crn) | An existing Secrets Manager instance CRN. If not provided an new instance will be provisioned. | `string` | `null` | no |
101103
| <a name="input_kms_encryption_enabled"></a> [kms\_encryption\_enabled](#input\_kms\_encryption\_enabled) | Set this to true to control the encryption keys used to encrypt the data that you store in Secrets Manager. If set to false, the data that you store is encrypted at rest by using envelope encryption. For more details, see https://cloud.ibm.com/docs/secrets-manager?topic=secrets-manager-mng-data&interface=ui#about-encryption. | `bool` | `false` | no |
102104
| <a name="input_kms_key_crn"></a> [kms\_key\_crn](#input\_kms\_key\_crn) | The root key CRN of a Key Management Service like Key Protect or Hyper Protect Crypto Services (HPCS) that you want to use for encryption. Only used if `kms_encryption_enabled` is set to true. | `string` | `null` | no |
103-
| <a name="input_region"></a> [region](#input\_region) | The region to provision the Secrets Manager instance to. | `string` | n/a | yes |
104-
| <a name="input_resource_group_id"></a> [resource\_group\_id](#input\_resource\_group\_id) | The ID of the resource group to provision the Secrets Manager instance to. | `string` | n/a | yes |
105+
| <a name="input_region"></a> [region](#input\_region) | The region where the resource will be provisioned.Its not required if passing a value for `existing_sm_instance_crn`. | `string` | `null` | no |
106+
| <a name="input_resource_group_id"></a> [resource\_group\_id](#input\_resource\_group\_id) | The ID of the resource group | `string` | n/a | yes |
105107
| <a name="input_secrets"></a> [secrets](#input\_secrets) | Secret Manager secrets configurations. | <pre>list(object({<br> secret_group_name = string<br> secret_group_description = optional(string)<br> existing_secret_group = optional(bool, false)<br> secrets = optional(list(object({<br> secret_name = string<br> secret_description = optional(string)<br> secret_type = optional(string)<br> imported_cert_certificate = optional(string)<br> imported_cert_private_key = optional(string)<br> imported_cert_intermediate = optional(string)<br> secret_username = optional(string)<br> secret_labels = optional(list(string), [])<br> secret_payload_password = optional(string, "")<br> secret_auto_rotation = optional(bool, true)<br> secret_auto_rotation_unit = optional(string, "day")<br> secret_auto_rotation_interval = optional(number, 89)<br> service_credentials_ttl = optional(string, "7776000") # 90 days<br> service_credentials_source_service_crn = optional(string)<br> service_credentials_source_service_role = optional(string)<br> })))<br> }))</pre> | `[]` | no |
106-
| <a name="input_secrets_manager_name"></a> [secrets\_manager\_name](#input\_secrets\_manager\_name) | The name to give the Secrets Manager instance. | `string` | n/a | yes |
108+
| <a name="input_secrets_manager_name"></a> [secrets\_manager\_name](#input\_secrets\_manager\_name) | The name of the Secrets Manager instance to create | `string` | n/a | yes |
107109
| <a name="input_skip_en_iam_authorization_policy"></a> [skip\_en\_iam\_authorization\_policy](#input\_skip\_en\_iam\_authorization\_policy) | Set to true to skip the creation of an IAM authorization policy that permits all Secrets Manager instances (scoped to the resource group) an 'Event Source Manager' role to the given Event Notifications instance passed in the `existing_en_instance_crn` input variable. In addition, no policy is created if `enable_event_notification` is set to false. | `bool` | `false` | no |
108110
| <a name="input_skip_kms_iam_authorization_policy"></a> [skip\_kms\_iam\_authorization\_policy](#input\_skip\_kms\_iam\_authorization\_policy) | Set to true to skip the creation of an IAM authorization policy that permits all Secrets Manager instances in the resource group to read the encryption key from the KMS instance. If set to false, pass in a value for the KMS instance in the `existing_kms_instance_guid` variable. In addition, no policy is created if `kms_encryption_enabled` is set to false. | `bool` | `false` | no |
109111
| <a name="input_sm_service_plan"></a> [sm\_service\_plan](#input\_sm\_service\_plan) | The Secrets Manager plan to provision. | `string` | `"standard"` | no |

examples/basic/version.tf

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ terraform {
66
required_providers {
77
ibm = {
88
source = "IBM-Cloud/ibm"
9-
version = "1.62.0"
9+
version = "1.65.0"
1010
}
1111
}
1212
}

examples/complete/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ This examples handles the provisioning of a new Secrets Manager instance.
88
| Name | Version |
99
|------|---------|
1010
| <a name="requirement_terraform"></a> [terraform](#requirement\_terraform) | >= v1.0.0 |
11-
| <a name="requirement_ibm"></a> [ibm](#requirement\_ibm) | >= 1.62.0 |
11+
| <a name="requirement_ibm"></a> [ibm](#requirement\_ibm) | >= 1.65.0 |
1212

1313
### Modules
1414

examples/complete/version.tf

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ terraform {
33
required_providers {
44
ibm = {
55
source = "IBM-Cloud/ibm"
6-
version = ">= 1.62.0"
6+
version = ">= 1.65.0"
77
}
88
}
99
}

examples/fscloud/version.tf

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ terraform {
44
# Use latest version of provider in non-basic examples to verify latest version works with module
55
ibm = {
66
source = "IBM-Cloud/ibm"
7-
version = ">=1.62.0, <2.0.0"
7+
version = ">=1.65.0, <2.0.0"
88
}
99
}
1010
}

main.tf

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,25 @@ locals {
1515
validate_event_notification = var.enable_event_notification && var.existing_en_instance_crn == null ? tobool("When setting var.enable_event_notification to true, a value must be passed for var.existing_en_instance_crn") : true
1616
# tflint-ignore: terraform_unused_declarations
1717
validate_endpoint = var.enable_event_notification && var.endpoint_type == "public" && var.allowed_network == "private-only" ? tobool("It is not allowed to have conflicting var.endpoint_type and var.allowed_network values.") : true
18+
# tflint-ignore: terraform_unused_declarations
19+
validate_region = var.existing_sm_instance_crn == null && var.region == null ? tobool("When existing_sm_instance_crn is null, a value must be passed for var.region") : true
20+
}
21+
22+
locals {
23+
parsed_existing_sm_instance_crn = var.existing_sm_instance_crn != null ? split(":", var.existing_sm_instance_crn) : []
24+
existing_sm_guid = length(local.parsed_existing_sm_instance_crn) > 0 ? local.parsed_existing_sm_instance_crn[7] : null
25+
existing_sm_region = length(local.parsed_existing_sm_instance_crn) > 0 ? local.parsed_existing_sm_instance_crn[5] : null
26+
}
27+
28+
29+
data "ibm_resource_instance" "sm_instance" {
30+
count = var.existing_sm_instance_crn == null ? 0 : 1
31+
identifier = var.existing_sm_instance_crn
1832
}
1933

2034
# Create Secrets Manager Instance
2135
resource "ibm_resource_instance" "secrets_manager_instance" {
36+
count = var.existing_sm_instance_crn == null ? 1 : 0
2237
depends_on = [ibm_iam_authorization_policy.kms_policy]
2338
name = var.secrets_manager_name
2439
service = "secrets-manager"
@@ -65,7 +80,8 @@ resource "time_sleep" "wait_for_authorization_policy" {
6580

6681

6782
locals {
68-
secrets_manager_guid = tolist(ibm_resource_instance.secrets_manager_instance[*].guid)[0]
83+
secrets_manager_guid = var.existing_sm_instance_crn != null ? local.existing_sm_guid : tolist(ibm_resource_instance.secrets_manager_instance[*].guid)[0]
84+
secrets_manager_region = var.existing_sm_instance_crn != null ? local.existing_sm_region : var.region
6985
}
7086

7187
##############################################################################
@@ -123,7 +139,7 @@ resource "ibm_sm_en_registration" "sm_en_registration" {
123139
count = var.enable_event_notification ? 1 : 0
124140
depends_on = [time_sleep.wait_for_authorization_policy]
125141
instance_id = local.secrets_manager_guid
126-
region = var.region
142+
region = local.secrets_manager_region
127143
event_notifications_instance_crn = var.existing_en_instance_crn
128144
event_notifications_source_description = "Secret Manager"
129145
event_notifications_source_name = var.secrets_manager_name
@@ -137,7 +153,7 @@ resource "ibm_sm_en_registration" "sm_en_registration" {
137153
module "secrets" {
138154
source = "./modules/secrets"
139155
existing_sm_instance_guid = local.secrets_manager_guid
140-
existing_sm_instance_region = var.region
156+
existing_sm_instance_region = local.secrets_manager_region
141157
secrets = var.secrets
142158
endpoint_type = var.endpoint_type
143159
}

moved.tf

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,3 +2,8 @@ moved {
22
from = ibm_iam_authorization_policy.policy
33
to = ibm_iam_authorization_policy.kms_policy
44
}
5+
6+
moved {
7+
from = ibm_resource_instance.secrets_manager_instance
8+
to = ibm_resource_instance.secrets_manager_instance[0]
9+
}

outputs.tf

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,22 +8,23 @@ output "secrets_manager_guid" {
88
}
99

1010
output "secrets_manager_id" {
11-
value = ibm_resource_instance.secrets_manager_instance.id
11+
value = var.existing_sm_instance_crn != null ? var.existing_sm_instance_crn : ibm_resource_instance.secrets_manager_instance[0].crn
1212
description = "ID of the Secrets Manager instance"
1313
}
1414

15+
1516
output "secrets_manager_name" {
16-
value = ibm_resource_instance.secrets_manager_instance.name
17+
value = var.existing_sm_instance_crn != null ? data.ibm_resource_instance.sm_instance[0].name : ibm_resource_instance.secrets_manager_instance[0].name
1718
description = "Name of the Secrets Manager instance"
1819
}
1920

2021
output "secrets_manager_crn" {
21-
value = ibm_resource_instance.secrets_manager_instance.crn
22+
value = var.existing_sm_instance_crn != null ? var.existing_sm_instance_crn : ibm_resource_instance.secrets_manager_instance[0].crn
2223
description = "CRN of the Secrets Manager instance"
2324
}
2425

2526
output "secrets_manager_region" {
26-
value = var.region
27+
value = var.existing_sm_instance_crn != null ? local.existing_sm_region : var.region
2728
description = "Region of the Secrets Manager instance"
2829
}
2930

solutions/standard/main.tf

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ module "resource_group" {
1818
# KMS Key
1919
#######################################################################################################################
2020
locals {
21-
kms_key_crn = var.existing_secrets_manager_crn == null ? (var.existing_secrets_manager_kms_key_crn != null ? var.existing_secrets_manager_kms_key_crn : module.kms[0].keys[format("%s.%s", local.kms_key_ring_name, local.kms_key_name)].crn) : null
21+
kms_key_crn = var.existing_secrets_manager_crn == null ? (var.existing_secrets_manager_kms_key_crn != null ? var.existing_secrets_manager_kms_key_crn : module.kms[0].keys[format("%s.%s", local.kms_key_ring_name, local.kms_key_name)].crn) : var.existing_secrets_manager_kms_key_crn
2222
kms_key_ring_name = var.prefix != null ? "${var.prefix}-${var.kms_key_ring_name}" : var.kms_key_ring_name
2323
kms_key_name = var.prefix != null ? "${var.prefix}-${var.kms_key_name}" : var.kms_key_name
2424

@@ -91,22 +91,22 @@ module "kms" {
9191

9292
locals {
9393
parsed_existing_secrets_manager_crn = var.existing_secrets_manager_crn != null ? split(":", var.existing_secrets_manager_crn) : []
94-
secrets_manager_guid = var.existing_secrets_manager_crn != null ? (length(local.parsed_existing_secrets_manager_crn) > 0 ? local.parsed_existing_secrets_manager_crn[7] : null) : module.secrets_manager[0].secrets_manager_guid
95-
secrets_manager_crn = var.existing_secrets_manager_crn != null ? var.existing_secrets_manager_crn : module.secrets_manager[0].secrets_manager_crn
96-
secrets_manager_region = var.existing_secrets_manager_crn != null ? (length(local.parsed_existing_secrets_manager_crn) > 0 ? local.parsed_existing_secrets_manager_crn[5] : null) : module.secrets_manager[0].secrets_manager_region
94+
secrets_manager_guid = var.existing_secrets_manager_crn != null ? (length(local.parsed_existing_secrets_manager_crn) > 0 ? local.parsed_existing_secrets_manager_crn[7] : null) : module.secrets_manager.secrets_manager_guid
95+
secrets_manager_crn = var.existing_secrets_manager_crn != null ? var.existing_secrets_manager_crn : module.secrets_manager.secrets_manager_crn
96+
secrets_manager_region = var.existing_secrets_manager_crn != null ? (length(local.parsed_existing_secrets_manager_crn) > 0 ? local.parsed_existing_secrets_manager_crn[5] : null) : module.secrets_manager.secrets_manager_region
9797
sm_endpoint_type = var.existing_secrets_manager_crn != null ? var.existing_secrets_endpoint_type : var.allowed_network == "private-only" ? "private" : "public"
9898
}
9999

100100
module "secrets_manager" {
101-
count = var.existing_secrets_manager_crn != null ? 0 : 1
102-
depends_on = [time_sleep.wait_for_authorization_policy]
103-
source = "../.."
104-
resource_group_id = module.resource_group[0].resource_group_id
105-
region = var.region
106-
secrets_manager_name = var.prefix != null ? "${var.prefix}-${var.secrets_manager_instance_name}" : var.secrets_manager_instance_name
107-
sm_service_plan = var.service_plan
108-
allowed_network = var.allowed_network
109-
sm_tags = var.secret_manager_tags
101+
depends_on = [time_sleep.wait_for_authorization_policy]
102+
source = "../.."
103+
existing_sm_instance_crn = var.existing_secrets_manager_crn
104+
resource_group_id = var.existing_secrets_manager_crn == null ? module.resource_group[0].resource_group_id : data.ibm_resource_instance.existing_sm[0].resource_group_id
105+
region = var.region
106+
secrets_manager_name = var.prefix != null ? "${var.prefix}-${var.secrets_manager_instance_name}" : var.secrets_manager_instance_name
107+
sm_service_plan = var.service_plan
108+
allowed_network = var.allowed_network
109+
sm_tags = var.secret_manager_tags
110110
# kms dependency
111111
kms_encryption_enabled = true
112112
existing_kms_instance_guid = local.existing_kms_guid

solutions/standard/outputs.tf

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,11 @@ output "secrets_manager_guid" {
1515

1616
output "secrets_manager_id" {
1717
description = "ID of Secrets Manager instance. Same value as secrets_manager_guid"
18-
value = var.existing_secrets_manager_crn == null ? module.secrets_manager[0].secrets_manager_id : local.secrets_manager_guid
18+
value = var.existing_secrets_manager_crn == null ? module.secrets_manager.secrets_manager_id : local.secrets_manager_guid
1919
}
2020

2121
output "secrets_manager_name" {
22-
value = var.existing_secrets_manager_crn == null ? module.secrets_manager[0].secrets_manager_name : data.ibm_resource_instance.existing_sm[0].resource_name
22+
value = var.existing_secrets_manager_crn == null ? module.secrets_manager.secrets_manager_name : data.ibm_resource_instance.existing_sm[0].resource_name
2323
description = "Name of the Secrets Manager instance"
2424
}
2525

0 commit comments

Comments
 (0)