0

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

  • 创建应用引擎
  • 激活 IAP 并创建 OAuth 同意屏幕
  • 激活对 Web 应用程序的保护 (=> App Engine)

手动它可以工作。

使用 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:请求的实体已存在

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

非常感谢每一位!

4

2 回答 2

1

每个项目只能启动一次App Engine ,同样的事情也适用于 IAP 品牌。因此,这意味着您已经在项目中配置了这些,并且无法再次重新创建它们。请参阅Terraform 文档

品牌只能为 Google Cloud 项目创建一次,并且底层 Google API 不支持 DELETE 或 PATCH 方法。销毁 Terraform 管理的品牌会将其从状态中删除,但不会将其从 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 提供商只是另一个调用 Google Cloud API 的客户端。google_app_engine_application相当于apps.create

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

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

于 2021-04-26T07:12:01.570 回答
1

我认为您可以向 Google Cloud 团队发送反馈,了解您在改造这些资源(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
  }
}
于 2021-08-17T11:50:42.303 回答