Terraform:如何修改而不是创建 GCP 子网?

Terraform: How to amend instead of create GCP subnet?

我们在各种项目中有大约 5000 多个子网,并且提出了一个新要求,将所有子网的“log_config”更改为匹配 INTERVAL_10_MIN 以聚合更多日志。

我尝试使用以下 Terraform 代码:​​

resource "google_compute_subnetwork" "subnet-with-logging" {
  name          = "my-subnetwork"
  ip_cidr_range = "10.2.0.0/16"
  region        = "us-central1"
  network       = google_compute_network.custom-test.id

  log_config {
    aggregation_interval = "INTERVAL_10_MIN"
    flow_sampling        = 0.5
    metadata             = "INCLUDE_ALL_METADATA"
  }
}

但是当我 运行 它时,我得到以下错误:

Error Creating Subnetwork Error 409: The resource xxxx  already exists

但我想修改现有的子网而不是创建一个新子网。

如何使用 Terraform 修改 GCP 中的现有子网?

如果您希望 Terraform 能够管理资源,您需要先 import 资源。

Terraform 小心翼翼地避免接触任何未明确告知要管理并在其相关状态文件中进行跟踪的任何内容。通常这只是通过 Terraform 创建它,但您也可以导入现有资源,以便带外创建的东西,例如通过单击 GUI 手动创建,或通过其他工具创建,但导入由另一个 Terraform 状态管理的资源不是一个好主意如果每个文件的配置不同并且它们试图继续相互覆盖,则打开自己的文件以产生差异。

资源导入可以一次完成一个,例如通过 运行 执行以下命令 google_compute_subnetwork

terraform import google_compute_subnetwork.default projects/{{project}}/regions/{{region}}/subnetworks/{{name}}

如果您要管理 5000 多个子网,那么您需要批量导入它们 - 您可以编写一个脚本来生成和 运行 上述命令,或者使用类似 terraformer 的东西来自动从您的 GCP 帐户导入大量资源。

但是,我会提醒您不要这样做,而是考虑您希望如何在更长的时间内使用 Terraform 管理这些资源,而不是这种一次性更改。 Terraform 的一般最佳实践是考虑通过将资源(及其状态文件)拆分为彼此不依赖的逻辑部分来最小化爆炸半径。例如,您可能拥有纯粹用于开发、测试或生产的网络等,您应该根据这些进行分离,以便您可以将 Terraform 分别应用于这些网络,以便在影响生产之前检查和观察您的更改。

如果您只想进行一次性更改,那么 Terraform 可能不是适合这里工作的工具,因为 Terraform 更适合管理资源从创建到多次更新的整个生命周期并可能删除。