为Postgres应用程序用户配置Terraform for RDS



Terraform允许您使用选项usernamepassword定义Postgres主用户和密码。但是没有设置应用程序postgres用户的选项,您将如何做到这一点?

AWS RDS资源仅用于使用AWS api创建/更新/删除RDS资源本身。

要在RDS实例本身上创建用户或数据库,您要么希望使用其他工具(如psql -官方命令行工具或配置管理工具,如Ansible),要么使用Terraform的Postgresql提供程序。

假设您已经创建了您的RDS实例,然后您将作为主用户连接到该实例,然后创建应用程序用户,如下所示:

provider "postgresql" {
  host = "postgres_server_ip1"
  username = "postgres_user"
  password = "postgres_password"
}
resource "postgresql_role" "application_role" {
  name = "application"
  login = true
  password = "application-password"
  encrypted = true
}

上述两个答案要求运行地形的主机能够直接访问RDS数据库,而您通常不这样做。我建议在lambda函数中编写所需的代码(可选地使用秘密管理器检索主密码):

resource "aws_lambda_function" "terraform_lambda_func" {
  filename      = "${path.module}/lambda_function/lambda_function.zip"
  ...
}

,然后使用下面的数据源(示例)调用lambda函数。

data "aws_lambda_invocation" "create_app_user" {
  function_name = aws_lambda_function.terraform_lambda_func.function_name
  
  input = <<-JSON
    {
      "step": "create_app_user"
    }
  JSON
    
  depends_on = [aws_lambda_function.terraform_lambda_func]
  provider = aws.primary
}

这个解决方案是通用的。它可以做AWS API可以做的lambda函数可以做的事情,基本上是无限的。

除了@ydaetskcoR的答案,这里是RDS PostgreSQL的完整示例;

provider "postgresql" {
  scheme    = "awspostgres"
  host      = "db.domain.name"
  port      = "5432"
  username  = "db_username"
  password  = "db_password"
  superuser = false
}

resource "postgresql_role" "new_db_role" {
    name                = "new_db_role"
    login               = true
    password            = "db_password"
    encrypted_password  = true
}
resource "postgresql_database" "new_db" {
  name              = "new_db"
  owner             = postgresql_role.new_db_role.name
  template          = "template0"
  lc_collate        = "C"
  connection_limit  = -1
  allow_connections = true
}

最新更新