Terraform允许您使用选项username
和password
定义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
}