Hello,
i’m attempting to create the rds while leveraging aws secrets manager.
Unfortunately Im running into a cycle dependency.
Appreciate your input.
Simplified code:
resource "aws_db_instance" "dbs" {
for_each = var.RDS
...
engine = each.value.engine
username = each.value.username
password = jsondecode(data.aws_secretsmanager_secret_version.rds_secret_data[each.key]).password
...
}
resource "aws_secretsmanager_secret" "rds_secret" {
for_each = var.RDS
name = "blah"
}
resource "random_password" "password" {
for_each = var.RDS
length = 16
special = true
override_special = "!#$%&*()-_=+[]{}<>:?"
}
resource "aws_secretsmanager_secret_version" "rds_secret_version" {
for_each = var.RDS
secret_id = aws_secretsmanager_secret.rds_secret[each.key].id
secret_string = jsonencode("
username = ${each.value.username} ,
password = "XXXX",
engine = ${each.value.engine},
host = ${aws_db_instance.dbs.endpoint},
port = ${aws_db_instance.dbs.port},
dbInstanceIdentifier = ${aws_db_instance.dbs.identifier} ")
}
data aws_secretsmanager_secret_version rds_secret_data {
for_each = var.RDS
secret_id = aws_secretsmanager_secret.rds_secret[each.key].id
}
in the rds_secret_version
resource, I have to provide aws_db_instance attributes that create a cycle …
The general idea is to use aws_secretsmanager_secret_rotation
. For the rotation to work the secret_string
has to include all connection parameters from RDS.
P.S. I can see dbs_cluster and aws_db_instance
have the “automagical” support for the password now: the [Enhancement]: RDS support for storing master user password in Secrets Manager · Issue #28538 · hashicorp/terraform-provider-aws · GitHub
But that creates a secret with a random name that i prefer to avoid.