Skip to content

Commit 8d7ab07

Browse files
authored
Convert secret module to create multiple secrets (#877)
- Rename modules/secret to modules/secrets with the following changes: - Accept multiple secrets instead of a single secret - Accept the service name - Outputs multiple secret arns instead of a single secret arn - Refactor service layer root modules based on module changes
1 parent c805160 commit 8d7ab07

File tree

8 files changed

+81
-65
lines changed

8 files changed

+81
-65
lines changed

infra/modules/secret/main.tf

Lines changed: 0 additions & 26 deletions
This file was deleted.

infra/modules/secret/outputs.tf

Lines changed: 0 additions & 3 deletions
This file was deleted.

infra/modules/secret/variables.tf

Lines changed: 0 additions & 22 deletions
This file was deleted.

infra/modules/secrets/main.tf

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
locals {
2+
generated_secrets = {
3+
for name, config in var.secrets :
4+
name => config if config.manage_method == "generated"
5+
}
6+
manual_secrets = {
7+
for name, config in var.secrets :
8+
name => config if config.manage_method == "manual"
9+
}
10+
}
11+
12+
resource "random_password" "secrets" {
13+
for_each = local.generated_secrets
14+
15+
length = 64
16+
special = true
17+
override_special = "!#$%&*()-_=+[]{}<>:?"
18+
}
19+
20+
resource "aws_ssm_parameter" "secrets" {
21+
for_each = local.generated_secrets
22+
23+
name = each.value.secret_store_name
24+
type = "SecureString"
25+
value = random_password.secrets[each.key].result
26+
}
27+
28+
data "aws_ssm_parameter" "secrets" {
29+
for_each = local.manual_secrets
30+
31+
name = each.value.secret_store_name
32+
}

infra/modules/secrets/outputs.tf

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
output "secret_arns" {
2+
value = merge(
3+
{ for k, v in aws_ssm_parameter.secrets : k => v.arn },
4+
{ for k, v in data.aws_ssm_parameter.secrets : k => v.arn }
5+
)
6+
}

infra/modules/secrets/variables.tf

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
variable "service_name" {
2+
type = string
3+
description = "Name of the service these secrets belong to"
4+
}
5+
6+
variable "secrets" {
7+
type = map(object({
8+
# Method to manage the secret. Options are 'manual' or 'generated'.
9+
# Set to 'generated' to generate a random secret.
10+
# Set to 'manual' to reference a secret that was manually created and stored in AWS parameter store.
11+
# Defaults to 'generated'.
12+
manage_method = string
13+
14+
# If manage_method is 'generated', path to store the secret in AWS parameter store.
15+
# If manage_method is 'manual', path to reference the secret in AWS parameter store.
16+
secret_store_name = string
17+
}))
18+
description = "Map of secret configurations"
19+
20+
validation {
21+
condition = alltrue([for s in values(var.secrets) : can(regex("^(manual|generated)$", s.manage_method))])
22+
error_message = "Invalid manage_method. Must be 'manual' or 'generated'."
23+
}
24+
}

infra/{{app_name}}/service/main.tf

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -101,9 +101,9 @@ module "service" {
101101
)
102102

103103
secrets = concat(
104-
[for secret_name in keys(local.service_config.secrets) : {
104+
[for secret_name, secret_arn in module.secrets.secret_arns : {
105105
name = secret_name
106-
valueFrom = module.secrets[secret_name].secret_arn
106+
valueFrom = secret_arn
107107
}],
108108
local.feature_flags_secrets,
109109
module.app_config.enable_identity_provider ? [{
Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,21 @@
11
module "secrets" {
2-
for_each = local.service_config.secrets
2+
source = "../../modules/secrets"
33

4-
source = "../../modules/secret"
4+
service_name = local.service_name
5+
secrets = {
6+
for name, config in local.service_config.secrets :
7+
name => {
8+
manage_method = config.manage_method
59

6-
# When generating secrets and storing them in parameter store, append the
7-
# terraform workspace to the secret store path if the environment is temporary
8-
# to avoid conflicts with existing environments.
9-
# Don't do this for secrets that are managed manually since the temporary
10-
# environments will need to share those secrets.
11-
secret_store_name = (each.value.manage_method == "generated" && local.is_temporary ?
12-
"${each.value.secret_store_name}/${terraform.workspace}" :
13-
each.value.secret_store_name
14-
)
15-
manage_method = each.value.manage_method
10+
# When generating secrets and storing them in parameter store, append the
11+
# terraform workspace to the secret store path if the environment is temporary
12+
# to avoid conflicts with existing environments.
13+
# Don't do this for secrets that are managed manually since the temporary
14+
# environments will need to share those secrets.
15+
secret_store_name = (config.manage_method == "generated" && local.is_temporary ?
16+
"${config.secret_store_name}/${terraform.workspace}" :
17+
config.secret_store_name
18+
)
19+
}
20+
}
1621
}

0 commit comments

Comments
 (0)