首页 > 解决方案 > 使用 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

有什么建议么?

标签: postgresqlterraformgoogle-cloud-sqlterraform-provider-gcp

解决方案


您在上面设置的 terraform 存在一些问题。

  1. 您的实例未定义任何授权网络。您应该将您的实例资源更改为如下所示:(注意:我使用 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"
      ]
    }
  1. 正如这里提到的,您需要创建一个具有强密码的用户。
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"
  ]
}
  1. 您应该使用实例的“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"
}
  1. 您的 postgres 提供程序依赖于 google_sql_database_instance 资源,然后才能设置提供程序:

所有提供者都在计划/应用开始时初始化,因此如果一个提供者的配置无效(在本例中为空主机),则 Terraform 将失败。无法定义提供者与另一个提供者中的资源之间的依赖关系。然而,使用target 参数

terraform apply -target=google_sql_user.user

有一个解决方法, 这将创建数据库用户(以及它的所有依赖项 - 在本例中为数据库实例),一旦完成,请遵循:

terraform apply

然后这应该会成功,因为已经创建了实例并且 ip_address 可供 postgres 提供程序使用。

最后说明:不建议在生产实例中使用不带 SSL 的公共 IP 地址连接到 Cloud SQL 实例。


推荐阅读