Google Cloud Platform 和 Terraform 使用 Identity Aware Proxy IAP 保护 App Engine

Google Cloud Platform and Terraform to protect App Engine with Identity Aware Proxy IAP

大约三天后,我疯狂地尝试通过 Terraform 保护我的 App Engine。当我通过 GCP 控制台手动保护我的应用程序时,我的步骤是:

手动即可。

使用 terraform 我已经成功创建了所有变量、提供程序并激活了所有需要的 API,但是我保护应用程序的方法似乎有问题,但我不知道是什么。以下是我的代码片段:

  1. 创建 App Engine(有效)
resource "google_app_engine_application" "app-init" {
    project       = var.project_id
    location_id   = var.project_location
    database_type = "CLOUD_FIRESTORE"
}
  1. 激活 IAP 并创建 OAuth 同意屏幕(不起作用)
resource "google_iap_brand" "project_brand" {
    support_email     = "my-owner-service-account-email@..."
    application_title = "Cloud IAP protected Application"
    project           = "my-project-id"
}

执行这个我得到这个错误:

创建品牌时出错:googleapi:错误 409:请求的实体已存在

我的代码或方法有什么问题?

非常感谢大家!

每个项目只能启动 App Engine 一次,IAP 品牌也是如此。因此,这意味着您已经在您的项目中配置了这些,并且无法再次重新创建它们。见 Terraform doc:

Brands can only be created once for a Google Cloud project and the underlying Google API doesn't not support DELETE or PATCH methods. Destroying a Terraform-managed Brand will remove it from state but will not delete it from Google Cloud.

以下是有关如何在 Terraform 中创建 App Engine 应用程序和启用 IAP 的正确代码段:

resource "google_app_engine_application" "app-init" {
    project       = var.project_id
    location_id   = var.project_location
    database_type = "CLOUD_FIRESTORE"
    iap {
      enabled = true
      oauth2_client_id = "your_client_id"
      oauth2_client_secret = "your_client_secret"
    }
}

Terraform Google provider is just another client that calls Google Cloud APIs. google_app_engine_application is equivalent to apps.create.

记下凭据 oauth2_client_idoauth2_client_secret。即使您创建了一个新项目,这些凭据也只能在您设置 OAuth 同意屏幕后才能找到。这些设置在 Terraform 中是必需的,因此在创建和管理 App Engine 应用程序时,如果没有 OAuth2 凭据,您将无法启用 IAP。

此外,apps.patch API 支持更新 iap 字段,但它在 Terraform 中不可用,因此如果您的项目中已有 App Engine 应用程序,唯一的方法是 enable/disable IAP 是通过 GCP 控制台、客户端库或直接访问 API。

我认为您可以向 Google 云团队发送反馈,了解您在改造这些资源(IAP 和 App Engine 应用程序)方面的经验:https://cloud.google.com/support/docs/issue-trackers

我最终在我的代码中添加了一些条件,以使其与已部署的资源一起使用。 如果已经部署了 App Engine,那么我将“功能标志”app_engine_application_terraformed 切换为 false:

resource "null_resource" "enable_iap_when_app_engine_manual" {
  count = !var.app_engine_application_terraformed && var.iap_enabled ? 1 : 0

  triggers = { always_run = timestamp() }

  provisioner "local-exec" {
    when    = create
    command = <<-EOT
      gcloud iap web enable --project=${var.project_id} \
        --oauth2-client-id='${var.iap_client_id}' \
        --oauth2-client-secret='${var.iap_client_secret}' \
        --resource-type=app-engine
    EOT
  }
}