google-cloud-platform - 对于带有 Beta 参数的 Google Cloud Platform 资源,正确的 Terraform 提供程序配置是什么?

标签 google-cloud-platform terraform google-kubernetes-engine terraform-provider-gcp infrastructure-as-code

对任何 beta 参数定义的任何 Google Cloud Platform (GCP) 资源进行地形改造都需要 google-beta 提供程序。是否应该使用 google-beta 提供商而不是google 提供商一起使用?

换句话说,假设某个 Google Kubernetes Engine (GKE) 集群 $GKE_CLUSTER_NAME 存在于 GCP 项目 $GCP_PROJECT_NAME 中:

gcloud container clusters list \
--format="value(name)" \
--project=$GCP_PROJECT_NAME

#=>

. . .
$GKE_CLUSTER_NAME
. . .

启用配置连接器:

gcloud container clusters describe $GKE_CLUSTER_NAME \
--format=“value(addonsConfig.configConnectorConfig.enabled)” \
--zone=$GKE_CLUSTER_ZONE

#=>

True

Terraforming $GKE_CLUSTER_NAME 需要 container_cluster.tf 中的 google_container_cluster 资源定义,其中包含 config_connector_config 参数 (在 addons_config block 内;more here )和 provider 参数(官方引用文档中缺少):

resource "google_container_cluster" "test" {
  addons_config {
    config_connector_config {
      enabled = true
    }
    . . .
  }
  . . .
  provider        = google-beta
  . . .
}

不需要需要 providers.tf 中的 google-beta provider 定义:

provider "google" {
  project = ". . ."
}

terraform {
  required_providers {
    google = {
      version = "~> 3.83.0"
    }
  }
}

此问题以及其他资源定义中缺少 provider 参数(例如 container_node_pool.tf 中的 google_container_node_pool)会导致以下是 providers 命令的输出:

terraform providers

Providers required by configuration:
.
├── provider[registry.terraform.io/hashicorp/google] ~> 3.83.0
└── provider[registry.terraform.io/hashicorp/google-beta]

Providers required by state:

    provider[registry.terraform.io/hashicorp/google]

    provider[registry.terraform.io/hashicorp/google-beta]

apply命令刷新terraform.tfstate状态文件后。

使用 beta 参数对 GCP 资源进行地形改造的方法是否更正确、更不易出错?或者,我应该运行 replace-provider 子命令:

terraform state replace-provider \
-auto-approve \
"hashicorp/google" \
"hashicorp/google-beta"

#=>

Terraform will perform the following actions:

  ~ Updating provider:
    - registry.terraform.io/hashicorp/google
    + registry.terraform.io/hashicorp/google-beta

Changing 2 resources:

  google_container_node_pool.$GKE_NODE_POOL_NAME

Successfully replaced provider for 1 resources.

并修改providers.tf:

provider "google-beta" {
  project = ". . ."
}

terraform {
  required_providers {
    google-beta = {
      version = "~> 3.83.0"
    }
  }
}

这样providers命令的输出是:

terraform providers

#=>

Providers required by configuration:
.
└── provider[registry.terraform.io/hashicorp/google-beta] ~> 3.83.0

Providers required by state:

    provider[registry.terraform.io/hashicorp/google-beta]

apply命令刷新terraform.state中的状态后?

最佳答案

应该使用两者googlegoogle-beta提供商。

在同一 providers.tf 中使用 googlegoogle-beta 提供商是安全的>。 Terraform 将对需要 google-beta 提供程序的任何资源的请求发送到 Beta 端点:https://。 。 .googleapis.com/v1beta1/。 。 .;即,使用 google-beta 提供程序与使用 beta gcloud 组类似。

应该:

  • providers.tf 中包含 googlegoogle-beta 提供程序:

    provider "google" {
      project = ". . ."
    }
    
    provider "google-beta" {
      project = ". . ."
    }
    
    terraform {
      required_providers {
        google = {
          version = "~> 3.83.0"
        }
        google-beta = {
          version = "~> 3.83.0"
        }
      }
    }
    
  • 每个 GCP 资源使用 provider 参数:google-beta 对于任何具有 至少一项启用的 Beta 功能:

    resource "google_container_cluster" "beta_cluster" {
       . . .
       provider        = google-beta
       . . .
    }
    

    google 对于所有其他资源:

    resource "google_container_node_pool" "general_availability_node_pool" {
    . . .
      provider       = google
    . . .
    }
    

在进行上述建议的两项更改并然后运行刷新后,输出为 providers 命令现在应类似于以下内容:

terraform providers

#=>

Providers required by configuration:
.
├── provider[registry.terraform.io/hashicorp/google] ~> 3.83.0
└── provider[registry.terraform.io/hashicorp/google-beta] ~> 3.83.0

Providers required by state:

    provider[registry.terraform.io/hashicorp/google]

    provider[registry.terraform.io/hashicorp/google-beta]

应该阅读官方文档。对于提供商版本 here .

关于google-cloud-platform - 对于带有 Beta 参数的 Google Cloud Platform 资源,正确的 Terraform 提供程序配置是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69138644/

相关文章:

kubernetes - rfc7231#section-6.5.1 Kubernetes上的dotnet核心入口 Controller api访问问题

go - 如何从Go Cloud功能向VM添加计费标签?

mysql - Ubuntu Apache 服务器中的 HDD 空间即将耗尽

google-cloud-platform - Terraform Bigquery 创建表替换表而不是编辑

mysql - 谷歌云 SQL ER_HOST_IS_BLOCKED

kubernetes - 从 URL 安装 Helm 图表, "Error: gzip: invalid header"

angular - 从 Angular 2 应用程序连接到 Google Cloud Endpoints

javascript - Firebase 实时数据库触发太多更新事件

amazon-web-services - 在 terraform 中更改/删除资源时的依赖冲突

json - Terraform 从 AWS secret 管理器中以错误的格式获取 secret 值