Создать схему для базы данных Google Cloud SQL PostgreSQL, используя Terraform - PullRequest
1 голос
/ 15 октября 2019

Я новичок в Terraform и хочу создать схему для базы данных postgres, созданной на экземпляре PostgreSQL 9.6 в облаке Google SQL.

Чтобы создать экземпляр 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

Есть предложения?

Ответы [ 2 ]

4 голосов
/ 15 октября 2019

Существует несколько проблем с настройкой 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"
      ]
    }
Как уже упоминалось здесь , вам необходимо создать пользователя с надежным паролем
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 потерпит неудачу. Невозможно определить зависимость между поставщиком и ресурсом внутри другого поставщика. Однако существует обходной путь с использованием целевого параметра terraform apply -target=google_sql_user.userЭто создаст пользователя базы данных (а также все его зависимости - в данном случае экземпляр базы данных), и после его завершения выполните следующее:terraform apply

Это должно завершиться успешно, так как экземпляр уже создан, и ip_address доступен для использования поставщиком postgres.

Заключительное примечание: Использование публичных IP-адресов без SSL дляподключение к экземплярам Cloud SQL не рекомендуется для производственных экземпляров.

0 голосов
/ 21 октября 2019

Это было мое решение, и мне нужно просто запустить: terraform apply:

// POSTGRESQL INSTANCE
resource "google_sql_database_instance" "my-database" {
  database_version = "POSTGRES_9_6"
  region = var.deployment_region

  settings {
      tier = var.db_machine_type
      ip_configuration {
          ipv4_enabled = true
          authorized_networks {
              name = "my_ip"
              value = var.db_allowed_networks.my_network_ip
          }
      }
  }
}

// DATABASE USER
resource "google_sql_user" "user" {
  name     = var.db_credentials.db_user
  instance = google_sql_database_instance.my-database.name
  password = var.db_credentials.db_password
  depends_on = [
    "google_sql_database_instance.my-database"
  ]

  provisioner "local-exec" {
    command = "psql postgresql://${google_sql_user.user.name}:${google_sql_user.user.password}@${google_sql_database_instance.my-database.public_ip_address}/postgres -c \"CREATE SCHEMA myschema;\""
  }
}
...