【问题标题】:How do I create a GCP SQL database sequentially in Terraform?如何在 Terraform 中按顺序创建 GCP SQL 数据库?
【发布时间】:2020-10-04 01:18:01
【问题描述】:

对于,我需要能够在 GCP 中配置多个 SQL 数据库。这些数据库还需要位于具有私有 IP 地址的 VPC 上。

配置

resource "google_compute_network" "container_network" {
  name = "container-network"
}

resource "google_compute_global_address" "sql" {
  name = "sql-private-ip"
  purpose = "VPC_PEERING"
  address_type = "INTERNAL"
  prefix_length = 16
  network = google_compute_network.container_network.self_link
}

resource "google_service_networking_connection" "sql" {
  network = google_compute_network.container_network.self_link
  service = "servicenetworking.googleapis.com"
  reserved_peering_ranges = [google_compute_global_address.sql.name]
}

resource "google_sql_database_instance" "master" {
  provider = google-beta
  count = 1
  database_version = "MYSQL_5_7"

  depends_on = [google_service_networking_connection.sql]

  settings {
    tier = "db-f1-micro"
    ip_configuration {
      ipv4_enabled = false
      private_network = google_compute_network.container_network.id
    }
  }
}

当我将此配置用于单个数据库时,效果很好。如果我然后更改count = 2,那也可以。但是,如果我破坏基础设施并设置count = 2,它就会失败。

Error: Error waiting for Create Instance: Failed to create subnetwork. <eye3 title='INVALID_ARGUMENT'/> generic::INVALID_ARGUMENT: New subnetwork overlaps with an IP range (10.28.0.0/24) in one of the active peers of an active peer (consumer-311061328248).

对我来说,这似乎是同时创建两个数据库并尝试分配相同的 IP 范围。

有没有办法按顺序或同时创建数据库?我怀疑这将是一个 Terraform 问题,而不是 GCP 问题,尽管我对此持开放态度。

【问题讨论】:

  • 一个选项是有两个 resource "google_sql_database_instance" 并在第二个到第一个上设置一个 depends_on,... 可能是基于计数的条件depends_on

标签: google-cloud-platform terraform terraform-provider-gcp


【解决方案1】:

我正在测试是否有一些花哨的东西取决于自我:

resource "google_sql_database_instance" "master" {
  provider = google-beta
  count = 2
  database_version = "MYSQL_5_7"

  depends_on = [google_sql_database_instance.master[count.index-1]]

  ...
}

但是不,不幸的是不允许,我们得到:Error: Invalid expression

需要单个静态变量引用:仅属性访问和 使用常量键进行索引。没有计算、函数调用、模板 这里允许使用表达式等。

除了我在 cmets 中提到的使用多个 resource "google_sql_database_instance" 以及它们之间的依赖关系(不是该选项的忠实粉丝)...
我看到的唯一其他选项是将 terraform 并行度设置为 1,这将限制资源创建。
您可以在此处阅读更多信息:
https://www.terraform.io/docs/commands/apply.html#parallelism-n

【讨论】:

  • 很高兴我不是唯一一个首先想到depends_on 的人,尤其是因为无论如何这就是google_service_network_connection 需要做的事情。我会尝试并行性。它会更慢,但如果它有效,我可以根据需要启用它。谢谢
  • 似乎我不是唯一一个在此功能后被问到的人github.com/hashicorp/terraform/issues/14258
  • 哦,是的,parallelism 每个资源将是一个不错的补充
  • 是的,我同意。可惜不太可能发生。附带说明一下,我在 Pulumi 上尝试了完全相同的配置,并且没有任何问题。鉴于我 50/50 是使用 Pulumi 还是 Terraform,这可能会让我远离 Terraform
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-13
  • 1970-01-01
  • 1970-01-01
  • 2018-09-27
  • 2020-07-18
相关资源
最近更新 更多