具有 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】:您应该使用google
和google-beta
提供程序。
在同一个providers.tf
中同时使用google
和google-beta
提供程序是安全。 Terraform 向 Beta 端点发送对任何需要 google-beta
提供程序的资源的请求:https://. . .googleapis.com/v1beta1/. . .
;即,使用 google-beta
提供程序类似于使用 beta
gcloud
组。
你应该:
在providers.tf
中包含google
和google-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 bigquery(google-cloud-ruby gem)的视图表(具有 resource_full)中获取数据
具有 Trace Agent 连接的 Google Cloud Functions