使用terraform在网络上不可用的实例上创建RDS数据库



我正在使用Terraform管理中等复杂的基础设施。创建的资源包括一个VPC,其中包含一个EKS集群和一个RDS postgres实例。RDS实例还需要在其上创建一个数据库,并将凭据传递给在集群上运行的应用程序。

我想在VPC的私有子网中创建RDS实例,因此它不能通过网络访问。如果我这样做,我在plan阶段遇到问题,因为数据库还不存在:

│ Error: error detecting capabilities: error PostgreSQL version: dial tcp [::1]:5432: connect: connection refused
│
│   with module.my_module.postgresql_database.env,
│   on ../my_module/database.tf line 16, in resource "postgresql_database" "my_db":
│   16: resource "postgresql_database" "my_db" {

如果我对目标使用多个terraform apply,我至少可以确保db实例存在,但它仍然无法通过网络访问。

同样的问题也存在于EKS集群中——如果我不让集群端点可以访问互联网,我怎么能在集群上安装应用程序(和其他依赖项(例如helm charts,…)?

我不希望在改造后对基础设施进行修改——我认为这会增加很多管理开销。

如何解决这个问题?谢谢!

起程拓殖代码:

module "rds" {
source            = "terraform-aws-modules/rds/aws"
version           = "4.4.0"
engine            = "postgres"
engine_version    = "13.6"
instance_class    = "db.t4g.micro"
allocated_storage = 20
storage_encrypted = true
identifier = "app-db"
username = "postgres"
password = random_password.postgres_master_password.result
port     = "5432"
vpc_security_group_ids = [aws_security_group.database_security_group.id]
maintenance_window = "Sat:00:00-Sat:03:00"
backup_window      = "03:00-06:00"
subnet_ids = module.vpc.private_subnets
family               = "postgres13"
db_subnet_group_name = aws_db_subnet_group.postgresql_subnet_group.name
}
provider "postgresql" {
alias           = "instance_admin"
host            = module.rds.db_instance_address
port            = module.rds.db_instance_port
database        = "postgres"
username        = module.rds.db_instance_username
password        = module.rds.db_instance_password
sslmode         = "require"
connect_timeout = 15
superuser       = false
}
resource "postgresql_database" "env" {
name     = "app_database"
}
resource "random_string" "postgres_pass" {
length  = 16
special = false
}
resource "postgresql_role" "db_role" {
name     = "db_role"
login    = true
password = random_string.postgres_pass.result
}

我最终在VPC的公共子网中创建了数据库,有两个安全组。

  • 只允许来自EKS集群的访问
  • 另一个为空,我仅在地形运行期间动态配置本地IP。

我不认为这是最佳的,但它现在可以了。

相关内容

  • 没有找到相关文章

最新更新