【发布时间】: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 评论提供完整答案:
对,
- 我没有在任何文档中看到
userinfo-email。实际上here、here 和here 总是userinfo-email。反正我改成userinfo.email。这并不影响结果。 - 我检查到筋疲力尽,实际上我的用户帐户,我唯一配置为运行 Terraform 的用户帐户是所有者。我不可能与任何其他非所有者用户一起运行 Terraform。
- 好的,现在进行三重检查,我在 GCP 仪表板中手动创建了一个服务帐户,为其分配了所有者角色,还为其分配了服务帐户令牌创建者角色。然后我配置我的本地运行 Terraform,错误是完全一样的。
所以,错误一定是在TF配置上。
【问题讨论】:
-
您确定使用您的用户凭证来运行 terraform 吗?如果是这样,您是如何验证的?
-
我确定我使用我的用户凭据运行 Terraform,因为我没有将 Terraform 配置为以其他方式运行,当我运行
gcloud auth list时,我看到我的 GCP 用户已被选中。
标签: google-cloud-platform terraform airflow impersonation