postgresql - 使用 Terraform 为 Google Cloud SQL PostgreSQL 数据库创建架构
问题描述
我是 Terraform 的新手,我想为postgres
在 Google 云 SQL 上的 PostgreSQL 9.6 实例上创建的数据库创建一个模式。
要创建PostgreSQL
我有这个的实例main.tf
:
resource "google_sql_database_instance" "my-database" {
name = "my-${var.deployment_name}"
database_version = "POSTGRES_9_6"
region = "${var.deployment_region}"
settings {
tier = "db-f1-micro"
ip_configuration {
ipv4_enabled = true
}
}
}
我试图创建一个PostgreSQL
像这样的对象:
provider "postgresql" {
host = "${google_sql_database_instance.my-database.ip_address}"
username = "postgres"
}
最后创建架构:
resource "postgresql_schema" "my_schema" {
name = "my_schema"
owner = "postgres"
}
但是,此配置不起作用,我们运行terraform plan
:
Inappropriate value for attribute "host": string required.
如果我删除Postgres
对象:
Error: Error initializing PostgreSQL client: error detecting capabilities: error PostgreSQL version: dial tcp :5432: connect: connection refused
此外,我想postgres
为创建 PostgreSQL 实例时默认创建的用户添加密码。
已编辑: 使用的版本
Terraform v0.12.10
+ provider.google v2.17.0
+ provider.postgresql v1.2.0
有什么建议么?
解决方案
您在上面设置的 terraform 存在一些问题。
- 您的实例未定义任何授权网络。您应该将您的实例资源更改为如下所示:(注意:我使用 0.0.0.0/0 仅用于测试目的)
resource "google_sql_database_instance" "my-database" {
name = "my-${var.deployment_name}"
database_version = "POSTGRES_9_6"
region = "${var.deployment_region}"
settings {
tier = "db-f1-micro"
ip_configuration {
ipv4_enabled = true
authorized_networks {
name = "all"
value = "0.0.0.0/0"
}
}
}
depends_on = [
"google_project_services.vpc"
]
}
- 正如这里提到的,您需要创建一个具有强密码的用户。
resource "google_sql_user" "user" {
name = "test_user"
instance = "${google_sql_database_instance.my-database.name}"
password = "VeryStrongPassword"
depends_on = [
"google_sql_database_instance.my-database"
]
}
- 您应该使用实例的“public_ip_address”或“ip_address.0.ip_address”属性来访问 IP 地址。此外,您应该更新您的提供程序和架构资源以反映上面创建的用户。
provider "postgresql" {
host = "${google_sql_database_instance.my-database.public_ip_address}"
username = "${google_sql_user.user.name}"
password = "${google_sql_user.user.password}"
}
resource "postgresql_schema" "my_schema" {
name = "my_schema"
owner = "test_user"
}
- 您的 postgres 提供程序依赖于 google_sql_database_instance 资源,然后才能设置提供程序:
所有提供者都在计划/应用开始时初始化,因此如果一个提供者的配置无效(在本例中为空主机),则 Terraform 将失败。无法定义提供者与另一个提供者中的资源之间的依赖关系。然而,使用target 参数
terraform apply -target=google_sql_user.user
有一个解决方法,
这将创建数据库用户(以及它的所有依赖项 - 在本例中为数据库实例),一旦完成,请遵循:
terraform apply
然后这应该会成功,因为已经创建了实例并且 ip_address 可供 postgres 提供程序使用。
最后说明:不建议在生产实例中使用不带 SSL 的公共 IP 地址连接到 Cloud SQL 实例。
推荐阅读
- php - Laravel(如何将数据添加到数据库)
- javascript - 无法从 python django(frappe 框架)服务器返回图像并在 js doctype 中显示
- crm - WIX / Velo - 自动化工作流 API
- r - 优化 R 中的错误 - 无法在初始参数处进行评估
- wordpress - 查看片段 字段“作者”的对象类型无效
- c# - 检测自定义形状中的圆圈
- javascript - .insertRow() 为空时无法正常工作
- c - c - fflush 或缓冲区清理
- spring - 在本地 Openshift 错误中部署 docker.io 映像
- python - (自适应)心冲击图伪影去除的最佳基组