【问题标题】:Error 403, "The caller does not have permission" when trying to impersonate Service Account in GCP尝试在 GCP 中模拟服务帐户时出现错误 403,“调用者没有权限”
【发布时间】:2022-07-18 04:57:04
【问题描述】:

我有这个相当简单的 Terraform 配置:

terraform {
  required_providers {
    google = { 
      source  = "hashicorp/google"
      version = "~> 4.19.0"
    }   

    airflow = { 
      source = "DrFaust92/airflow"
      version = "~> 0.6.0"
    }   
  }
}

data "http" "client_id" {
  url = var.cloud_composer.airflow_uri
}

resource "google_service_account" "impersonated-gsa" {
  account_id = "impersonated"
}

data "google_service_account_access_token" "impersonated" {
  target_service_account = google_service_account.impersonated-gsa.email
  delegates              = []
  scopes                 = ["userinfo-email", "cloud-platform"]
  lifetime               = "300s"
}

provider "google" {
  alias        = "impersonated"
  access_token = data.google_service_account_access_token.impersonated.access_token
}

data "google_service_account_id_token" "oidc" {
  provider               = google.impersonated
  target_service_account = google_service_account.impersonated-gsa.email
  delegates              = []
  include_email          = true
  target_audience        = regex("[A-Za-z0-9-]*\\.apps\\.googleusercontent\\.com", data.http.client_id.body)
}

provider "airflow" {
  base_endpoint = data.http.client_id.url
  oauth2_token = data.google_service_account_id_token.oidc.id_token
}

配置大多是直接从Terraform Airflow provider的文档中复制过来的。

当我尝试在其上运行 Terraform 时,例如 terraform plan,我收到此 403 错误:

╷
│ Error: googleapi: Error 403: The caller does not have permission, forbidden
│ 
│   with module.airflow.data.google_service_account_access_token.impersonated,
│   on modules/airflow/providers.tf line 23, in data "google_service_account_access_token" "impersonated":
│   23: data "google_service_account_access_token" "impersonated" {
│ 
╵

我正在本地终端中运行 Terraform,并按照 Terraform docs 中的说明通过我的 gcloud 用户进行身份验证。我的用户在 GCP 中有实际的 Owner 角色,据我所知,它不需要更多权限来完成这项工作。无论如何,我也为自己添加了roles/iam.serviceAccountTokenCreator 角色,似乎需要执行此操作,但没有帮助,错误是一样的。

在这一点上,我不知道我做错了什么,或者即使 Terraform 配置本身是正确的。

有人可以提供任何建议或建议吗?谢谢。

编辑以添加更多详细信息,因为我无法对 John Hanley 评论提供完整答案:

对,

  1. 我没有在任何文档中看到userinfo-email。实际上hereherehere 总是userinfo-email。反正我改成userinfo.email。这并不影响结果。
  2. 我检查到筋疲力尽,实际上我的用户帐户,我唯一配置为运行 Terraform 的用户帐户是所有者。我不可能与任何其他非所有者用户一起运行 Terraform。
  3. 好的,现在进行三重检查,我在 GCP 仪表板中手动创建了一个服务帐户,为其分配了所有者角色,还为其分配了服务帐户令牌创建者角色。然后我配置我的本地运行 Terraform,错误是完全一样的。

所以,错误一定是在TF配置上。

【问题讨论】:

  • 您确定使用您的用户凭证来运行 terraform 吗?如果是这样,您是如何验证的?
  • 我确定我使用我的用户凭据运行 Terraform,因为我没有将 Terraform 配置为以其他方式运行,当我运行 gcloud auth list 时,我看到我的 GCP 用户已被选中。

标签: google-cloud-platform terraform airflow impersonation


【解决方案1】:
  1. userinfo-email 范围无效。它应该是 userinfo.email

  2. 您声明您正在使用具有所有者角色的帐户。但是,错误消息表明您没有在 Terraform 中使用该身份。

  3. 使用用户身份可能会导致错误(API 配额)。您应该使用服务帐户。我建议分配一个服务帐户,为其分配所需的角色,并使用服务帐户初始化 Terraform 提供程序。

【讨论】:

    【解决方案2】:

    尝试使用另一个项目的 service_account = Service Account 创建 Composer 时出现同样的错误。 :(

    【讨论】:

      猜你喜欢
      • 2019-08-08
      • 1970-01-01
      • 2021-04-06
      • 1970-01-01
      • 2020-04-10
      • 2023-01-18
      • 2021-09-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多