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 控制台手动保护我的应用程序时,我的步骤是:
- 创建 App 引擎
- 激活 IAP 并创建 OAuth 同意屏幕
- 激活对 Web 应用程序的保护(=> App Engine)
手动即可。
使用 terraform 我已经成功创建了所有变量、提供程序并激活了所有需要的 API,但是我保护应用程序的方法似乎有问题,但我不知道是什么。以下是我的代码片段:
- 创建 App Engine(有效)
resource "google_app_engine_application" "app-init" {
project = var.project_id
location_id = var.project_location
database_type = "CLOUD_FIRESTORE"
}
- 激活 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_id
和 oauth2_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
}
}
大约三天后,我疯狂地尝试通过 Terraform 保护我的 App Engine。当我通过 GCP 控制台手动保护我的应用程序时,我的步骤是:
- 创建 App 引擎
- 激活 IAP 并创建 OAuth 同意屏幕
- 激活对 Web 应用程序的保护(=> App Engine)
手动即可。
使用 terraform 我已经成功创建了所有变量、提供程序并激活了所有需要的 API,但是我保护应用程序的方法似乎有问题,但我不知道是什么。以下是我的代码片段:
- 创建 App Engine(有效)
resource "google_app_engine_application" "app-init" {
project = var.project_id
location_id = var.project_location
database_type = "CLOUD_FIRESTORE"
}
- 激活 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 toapps.create
.
记下凭据 oauth2_client_id
和 oauth2_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
}
}