具有 Beta 参数的 Google Cloud Platform 资源的正确 Terraform 提供程序配置是啥?

Posted

技术标签:

【中文标题】具有 Beta 参数的 Google Cloud Platform 资源的正确 Terraform 提供程序配置是啥?【英文标题】:What is the Correct Terraform Provider Configuration for Google Cloud Platform Resources with Beta Arguments?具有 Beta 参数的 Google Cloud Platform 资源的正确 Terraform 提供程序配置是什么? 【发布时间】:2021-11-07 07:51:32 【问题描述】:

改造任何由任何 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

地形化$GKE_CLUSTER_NAME 需要在container_cluster.tf 内定义google_container_cluster 资源定义,其中包括config_connector_config 参数(在addons_config 块内;更多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 中的状态之后?

【问题讨论】:

【参考方案1】:

应该使用googlegoogle-beta 提供程序。

在同一个providers.tf 中同时使用googlegoogle-beta 提供程序是安全。 Terraform 向 Beta 端点发送对任何需要 google-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
. . .

在完成上述建议的两个然后运行refresh后,输出 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。

【讨论】:

以上是关于具有 Beta 参数的 Google Cloud Platform 资源的正确 Terraform 提供程序配置是啥?的主要内容,如果未能解决你的问题,请参考以下文章

具有 Google Cloud Functions 的 Google Cloud Endpoints [关闭]

Google Cloud DataCatalog

如何从 Google bigquery(google-cloud-ruby gem)的视图表(具有 resource_full)中获取数据

具有 Trace Agent 连接的 Google Cloud Functions

Google Cloud Firestore REST API createDocument 自动生成 ID

您可以在具有服务角色的项目之间共享 Google Cloud KMS 密钥吗?