使用 Terraform 为 Google Cloud SQL PostgreSQL 数据库创建架构

Gon*_*nca 2 postgresql google-cloud-sql terraform terraform-provider-gcp

我是 Terraform 的新手,我想为postgres在 Google Cloud 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
      }
  }
}
Run Code Online (Sandbox Code Playgroud)

我试图创建一个PostgreSQL这样的对象:

provider "postgresql" {
  host            = "${google_sql_database_instance.my-database.ip_address}"
  username        = "postgres"
}

Run Code Online (Sandbox Code Playgroud)

最后创建架构:

resource "postgresql_schema" "my_schema" {
  name  = "my_schema"
  owner = "postgres"
}
Run Code Online (Sandbox Code Playgroud)

但是,这个配置不起作用,我们运行terraform plan

Inappropriate value for attribute "host": string required.
Run Code Online (Sandbox Code Playgroud)

如果我删除Postgres对象:

Error: Error initializing PostgreSQL client: error detecting capabilities: error PostgreSQL version: dial tcp :5432: connect: connection refused
Run Code Online (Sandbox Code Playgroud)

此外,我想postgres为创建 PostgreSQL 实例时默认创建的用户添加密码。

编辑: 使用的版本

Terraform v0.12.10
+ provider.google v2.17.0
+ provider.postgresql v1.2.0
Run Code Online (Sandbox Code Playgroud)

有什么建议?

Ami*_*our 5

您上面的 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"
      ]
    }
Run Code Online (Sandbox Code Playgroud)
  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"
  ]
}
Run Code Online (Sandbox Code Playgroud)
  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"
}
Run Code Online (Sandbox Code Playgroud)
  1. 您的 postgres 提供程序依赖于 google_sql_database_instance 资源才能设置提供程序:

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

terraform apply -target=google_sql_user.user

这将创建数据库用户(以及它的所有依赖项 - 在这种情况下是数据库实例),一旦完成,请执行以下操作:

terraform apply

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

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