如何在 Terraform 中使用 secret manager 创建 Aurora Serverless 数据库集群

How to create Aurora Serverless database cluster with secret manager in Terraform

我一直在阅读此页面:https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/rds_cluster

那里的例子主要是针对配置的数据库,我是无服务器数据库的新手,是否有一个 Terraform 示例来创建无服务器 Aurora 数据库集群 (SQL db),使用存储在秘密管理员?

非常感谢。

创建无服务器极光的基本示例是:

resource "aws_rds_cluster" "default" {
  cluster_identifier      = "aurora-cluster-demo"
  engine                  = "aurora-mysql"  
  engine_mode             = "serverless"  
  database_name           = "myauroradb"  
  enable_http_endpoint    = true  
  master_username         = "root"
  master_password         = "chang333eme321"
  backup_retention_period = 1
  
  skip_final_snapshot     = true
  
  scaling_configuration {
    auto_pause               = true
    min_capacity             = 1    
    max_capacity             = 2
    seconds_until_auto_pause = 300
    timeout_action           = "ForceApplyCapacityChange"
  }  
}

我不确定你想用 Secret Manager 做什么。从你的问题中不清楚,所以我提供了任何例子。

我猜你想随机化 master_password? 你可以这样做:

master_password = random_password.DatabaseMasterPassword.result

SSM参数可以这样创建:

resource "aws_ssm_parameter" "SSMDatabaseMasterPassword" {
  name  = "database-master-password"
  type  = "SecureString"
  value = random_password.DatabaseMasterPassword.result
}

随机密码可以这样定义:

resource "random_password" "DatabaseMasterPassword" {
  length           = 24
  special          = true
  override_special = "!#$%^*()-=+_?{}|"
}

接受的答案将仅使用 pre-set 密码创建 Aurora RDS 实例——但不包括 Secrets Manager。使用 Secrets Manager 是个好主意,这样您的数据库 应用程序(Lambdas、EC2 等)就可以从 Secrets Manager 访问密码,而无需 copy/paste到多个位置(例如应用程序配置)。

此外,通过使用 random_password 对密码进行变形,它将以明文形式存储在您的 terraform.tfstate 文件中,这可能是一个问题。要解决此问题,您还需要启用 Secrets Manager Automatic Secret Rotation.

自动旋转是 Terraform 的一种高级配置。涉及:

AWS provides ready-to-use Lambdas 用于许多常见的旋转场景。具体的 Lambda 将根据数据库引擎(MySQL vs. Postgres vs. SQL Server vs. Oracle 等)以及您是否将连接到数据库而有所不同您正在轮换的相同凭据。

例如,当秘密轮换过程是这样的:

  • 调用轮换 lambda,Secrets Manager 会将密钥名称作为参数传递
  • Lambda 将使用秘密中的详细信息(数据库主机、Post、用户名、密码)连接到 RDS
  • Lambda 将生成一个新密码和运行“更新密码”命令,这可能因数据库引擎而异
  • Lambda 会将新凭证更新到 Secrets Manager

要使所有这些正常工作,您还需要考虑 Lambda 需要的权限——例如​​与 RDS 实例的网络连接和对 read/write 机密的 IAM 权限。

如前所述,它有点高级——但会导致 Secrets Manager 成为密码的唯一持久位置。一旦设置完成,它就可以很好地工作,并且您的应用程序可以安全地从 Secrets Manager 检索密码(最后一个提示——可以在您的应用程序中缓存秘密以减少 Secrets Manager 调用 但是请务必在连接失败时刷新该缓存,以便您的应用程序将处理自动轮换)。