我正在使用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。
我不认为这是最佳的,但它现在可以了。