【问题标题】:Terraform two PostgreSQL databases setupTerraform 两个 PostgreSQL 数据库设置
【发布时间】:2023-07-04 13:02:01
【问题描述】:

我对 teraform 脚本非常陌生。 我们的系统在 AWS 中运行,我们有一个由多个微服务访问的数据库服务器实例。

每个需要持久化一些数据的微服务都需要指向同一数据库服务器上的不同数据库(模式)。我们希望每个服务都有自己的架构,以使服务彼此完全解耦。然而,创建一个单独的数据库实例来实现这一点有点过分,因为某些服务只能持续几乎没有,所以这将是一种浪费,

我在所有微服务通用的 services.tf 脚本中创建了 PostgreSQL 资源:

resource "aws_db_instance" "my-system" {
  identifier_prefix       = "${var.resource_name_prefix}-tlm-"
  engine                  = "postgres"
  allocated_storage       = "${var.database_storage_size}"
  storage_type            = "${var.database_storage_type}"
  storage_encrypted       = true
  skip_final_snapshot     = true
  instance_class          = "${var.database_instance_type}"
  availability_zone       = "${data.aws_availability_zones.all.names[0]}"
  db_subnet_group_name    = "${aws_db_subnet_group.default.name}"
  vpc_security_group_ids  = "${var.security_group_ids}"
  backup_retention_period = "${var.database_retention_period}"
  backup_window           = "15:00-18:00"     // UTC
  maintenance_window      = "sat:19:00-sat:20:00" // UTC

  tags = "${var.tags}"
}

现在,对于我的 service-1 和 service-2,我希望能够创建 corespondent 数据库名称。我认为以下内容不正确,我只是添加它以让您了解我想要实现的目标。

所以 service-1.tf 将包含:

resource "aws_db_instance" "my-system" {
  name                    = "service_1"
}

service-2.tf 将包含:

resource "aws_db_instance" "my-system" {
  name                    = "service_2"
}

我的问题是我应该在 service-1.tf 和 service-2.tf 中添加什么来实现这一点。

提前感谢您的意见。

【问题讨论】:

  • 你是说你想在同一个实例上有多个 postgres 模式和用户由应用程序分隔?您目前如何在 RDS 实例上创建用户和架构?
  • 这是我想通过我的问题找到的。如何使用 terraform 在同一数据库实例上自动创建多个模式/用户

标签: amazon-web-services microservices terraform


【解决方案1】:

Terraform 只能在 RDS 实例级别进行管理。配置模式等是 DBA 的任务。

您可以自动化 DBA 任务的一种方法是使用 local-exec 提供程序创建一个 null_resource 以使用 postgres 客户端来完成工作。

【讨论】:

    【解决方案2】:

    您可以使用count 只管理一个 tf 文件

    resource "aws_db_instance" "my-system" {
      count                   = "2"
      name                    = "service_${count.index}"
      identifier_prefix       = "${var.resource_name_prefix}-tlm-"
      engine                  = "postgres"
      allocated_storage       = "${var.database_storage_size}"
      storage_type            = "${var.database_storage_type}"
      storage_encrypted       = true
      skip_final_snapshot     = true
      instance_class          = "${var.database_instance_type}"
      availability_zone       = "${data.aws_availability_zones.all.names[0]}"
      db_subnet_group_name    = "${aws_db_subnet_group.default.name}"
      vpc_security_group_ids  = "${var.security_group_ids}"
      backup_retention_period = "${var.database_retention_period}"
      backup_window           = "15:00-18:00"     // UTC
      maintenance_window      = "sat:19:00-sat:20:00" // UTC
    
      tags = "${var.tags}"
    }
    

    【讨论】:

    • 这个问题令人困惑,但他们明确表示他们只想要一个 RDS 实例,而不是 2 个。