Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 0 additions & 26 deletions infra/modules/secret/main.tf

This file was deleted.

3 changes: 0 additions & 3 deletions infra/modules/secret/outputs.tf

This file was deleted.

22 changes: 0 additions & 22 deletions infra/modules/secret/variables.tf

This file was deleted.

32 changes: 32 additions & 0 deletions infra/modules/secrets/main.tf
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
locals {
generated_secrets = {
for name, config in var.secrets :
name => config if config.manage_method == "generated"
}
manual_secrets = {
for name, config in var.secrets :
name => config if config.manage_method == "manual"
}
}

resource "random_password" "secrets" {
for_each = local.generated_secrets

length = 64
special = true
override_special = "!#$%&*()-_=+[]{}<>:?"
}

resource "aws_ssm_parameter" "secrets" {
for_each = local.generated_secrets

name = each.value.secret_store_name
type = "SecureString"
value = random_password.secrets[each.key].result
}

data "aws_ssm_parameter" "secrets" {
for_each = local.manual_secrets

name = each.value.secret_store_name
}
6 changes: 6 additions & 0 deletions infra/modules/secrets/outputs.tf
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
output "secret_arns" {
value = merge(
{ for k, v in aws_ssm_parameter.secrets : k => v.arn },
{ for k, v in data.aws_ssm_parameter.secrets : k => v.arn }
)
}
24 changes: 24 additions & 0 deletions infra/modules/secrets/variables.tf
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
variable "service_name" {
type = string
description = "Name of the service these secrets belong to"
}

variable "secrets" {
type = map(object({
# Method to manage the secret. Options are 'manual' or 'generated'.
# Set to 'generated' to generate a random secret.
# Set to 'manual' to reference a secret that was manually created and stored in AWS parameter store.
# Defaults to 'generated'.
manage_method = string

# If manage_method is 'generated', path to store the secret in AWS parameter store.
# If manage_method is 'manual', path to reference the secret in AWS parameter store.
secret_store_name = string
}))
description = "Map of secret configurations"

validation {
condition = alltrue([for s in values(var.secrets) : can(regex("^(manual|generated)$", s.manage_method))])
error_message = "Invalid manage_method. Must be 'manual' or 'generated'."
}
}
4 changes: 2 additions & 2 deletions infra/{{app_name}}/service/main.tf
Original file line number Diff line number Diff line change
Expand Up @@ -101,9 +101,9 @@ module "service" {
)

secrets = concat(
[for secret_name in keys(local.service_config.secrets) : {
[for secret_name, secret_arn in module.secrets.secret_arns : {
name = secret_name
valueFrom = module.secrets[secret_name].secret_arn
valueFrom = secret_arn
}],
local.feature_flags_secrets,
module.app_config.enable_identity_provider ? [{
Expand Down
29 changes: 17 additions & 12 deletions infra/{{app_name}}/service/secrets.tf
Original file line number Diff line number Diff line change
@@ -1,16 +1,21 @@
module "secrets" {
for_each = local.service_config.secrets
source = "../../modules/secrets"

source = "../../modules/secret"
service_name = local.service_name
secrets = {
for name, config in local.service_config.secrets :
name => {
manage_method = config.manage_method

# When generating secrets and storing them in parameter store, append the
# terraform workspace to the secret store path if the environment is temporary
# to avoid conflicts with existing environments.
# Don't do this for secrets that are managed manually since the temporary
# environments will need to share those secrets.
secret_store_name = (each.value.manage_method == "generated" && local.is_temporary ?
"${each.value.secret_store_name}/${terraform.workspace}" :
each.value.secret_store_name
)
manage_method = each.value.manage_method
# When generating secrets and storing them in parameter store, append the
# terraform workspace to the secret store path if the environment is temporary
# to avoid conflicts with existing environments.
# Don't do this for secrets that are managed manually since the temporary
# environments will need to share those secrets.
secret_store_name = (config.manage_method == "generated" && local.is_temporary ?
"${config.secret_store_name}/${terraform.workspace}" :
config.secret_store_name
)
}
}
}
Loading