将 GCP 云与 Terraform 结合使用时,我可以自动启用 API 吗?

Can I automatically enable APIs when using GCP cloud with terraform?

我对使用 terraform 的 GCP 还很陌生,我想使用集中式工具部署我的所有模块。

有什么方法可以去掉每次启用googleAPI的步骤,这样部署就不会中断吗?

有一个名为“google_project_service”的 Terraform 资源定义允许启用服务 (API)。这记录在 google_project_service.

用法示例如下:

resource "google_project_service" "project" {
  project = "your-project-id"
  service = "iam.googleapis.com"
}

是的,您可以使用 google_project_service 资源一次启用一个 API。您可以使用 count 或其他循环方法来启用多个 API。您需要项目 editor/owner 角色才能执行此操作。

# Enable services in newly created GCP Project.
resource "google_project_service" "gcp_services" {
  count   = length(var.gcp_service_list)
  project = google_project.demo_project.project_id
  service = var.gcp_service_list[count.index]

  disable_dependent_services = true
}

你可以找到完整的例子here.

而不是像@pradeep 建议的那样使用 count,您也可以遍历有问题的服务:

variable "gcp_service_list" {
  description ="The list of apis necessary for the project"
  type = list(string)
  default = [
    "cloudresourcemanager.googleapis.com",
    "serviceusage.googleapis.com"
  ]
}

resource "google_project_service" "gcp_services" {
  for_each = toset(var.gcp_service_list)
  project = "your-project-id"
  service = each.key
}

对于那些在 2022 年阅读本文的人来说,从 Terraform 自动启用 serviceusagecloudresourcesmanager 不起作用,因为通过 API 启用那些 API 具有依赖性在他们已经启用...

解决方法是通过gcloud命令行来完成:

# Use `gcloud` to enable:
# - serviceusage.googleapis.com
# - cloudresourcemanager.googleapis.com
resource "null_resource" "enable_service_usage_api" {
  provisioner "local-exec" {
    command = "gcloud services enable serviceusage.googleapis.com cloudresourcemanager.googleapis.com --project ${var.project_id}"
  }

  depends_on = [google_project.project]
}

# Wait for the new configuration to propagate
# (might be redundant)
resource "time_sleep" "wait_project_init" {
  create_duration = "60s"

  depends_on = [null_resource.enable_service_usage_api]
}

有关 https://medium.com/rockedscience/how-to-fully-automate-the-deployment-of-google-cloud-platform-projects-with-terraform-16c33f1fb31f

的更多详细信息

2022 - 分享我使用代码启用服务的个人经验

为什么不应该使用 Terraform 启用服务
  1. 通常 成本 与启用服务相关联,并且结算帐户必须及时与服务相关联。例如,您想创建一个静态 public ip 或设置一个 Cloud CDN。

  2. 可以按照 https://cloud.google.com/service-usage/docs/enable-disable#gcloud and (使用 Terraform 空资源 运行ning gcloud 命令)中的建议使用代码启用服务,但额外的挑战是,启用服务不会在秒或分钟内发生

    添加 wait/sleep 或依赖流对我有一段时间的帮助,但从长远来看 运行 它 使我的代码变得复杂

  3. 交叉依赖问题。当我为计算启用服务时使用 Terraform 代码,然后其他开发人员能够创建资源。一段时间后,当我不再需要并尝试 terraform destroy 时,我遇到了几个依赖性问题。

TL;DR Enabling services is usually one-time task just like creating a billing account. As per my experience, I recommend not to automate such important things.