无法从 terraform 更改存储传输服务帐户权限

发布于 2025-01-19 03:04:48 字数 1501 浏览 1 评论 0原文

我正在尝试使用云函数中的网址列表启动谷歌存储传输服务

为此,我需要存储传输服务帐户具有以下权限(遵循谷歌文档 此处)。 为此,我的 IAC 如下:

ma​​in.tf

provider "google" {
  project = var.project
  region  = var.region
  zone    = var.zone
}

locals {
  storage_transfer_service_account = "project-${var.project}@storage-transfer-service.iam.gserviceaccount.com"
}

resource "google_project_service" "storage_transfer_api" {
  project            = var.project
  service            = "storagetransfer.googleapis.com"
  disable_on_destroy = true
}

# For the storage transfer service account
resource "google_project_iam_member" "legacy_bucket_writer" {
  project = var.project
  role    = "roles/storage.legacyBucketWriter"
  member  = "serviceAccount:${local.storage_transfer_service_account}"
}

resource "google_project_iam_member" "object_viewer" {
  project = var.project
  role    = "roles/storage.objectViewer"
  member  = "serviceAccount:${local.storage_transfer_service_account}"
}

但是当我运行我的 terraform plan 时,我收到以下错误:

tf.plan : var.project is a string, known only after apply
tf.plan : Can't access attributes on a primitive-typed value (string).

我了解 项目计划期间尚未设置变量,但如何向服务帐户授予必要的权限?

I am trying to launch a google storage transfer service using url list from a cloudfunction.

For that I need the storage transfer service account to have the following permissions (following the google documentation here).
For that, my IAC is the following:

main.tf

provider "google" {
  project = var.project
  region  = var.region
  zone    = var.zone
}

locals {
  storage_transfer_service_account = "project-${var.project}@storage-transfer-service.iam.gserviceaccount.com"
}

resource "google_project_service" "storage_transfer_api" {
  project            = var.project
  service            = "storagetransfer.googleapis.com"
  disable_on_destroy = true
}

# For the storage transfer service account
resource "google_project_iam_member" "legacy_bucket_writer" {
  project = var.project
  role    = "roles/storage.legacyBucketWriter"
  member  = "serviceAccount:${local.storage_transfer_service_account}"
}

resource "google_project_iam_member" "object_viewer" {
  project = var.project
  role    = "roles/storage.objectViewer"
  member  = "serviceAccount:${local.storage_transfer_service_account}"
}

But when I run my terraform plan I get the following error:

tf.plan : var.project is a string, known only after apply
tf.plan : Can't access attributes on a primitive-typed value (string).

I understand the project variable is not set yet during plan, but how can I grant the necessary permission to the service account ?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

暮倦 2025-01-26 03:04:48

仅关于 terraform 代码的一些评论:

  1. 有一个特殊的 terraform 数据资源 - google_storage_transfer_project_service_account - 使用它可能会很有用。它可能看起来像这样(var.project 表示项目 ID):

    数据“google_storage_transfer_project_service_account”“st_service_account”{
      项目 = var.project
    }
    
  2. Terraform 尝试异步运行大量 API 命令。同时,某些资源可能依赖于其他资源。有时可以推断这些依赖关系,有时 terraform 源文件中没有足够的信息。在 alter 情况下,可以使用 depends_on 元参数< /a>.有一段代码(在您的 terraform 中)用于启用存储传输 API。这需要时间。据我所知,存储传输服务帐户是在 API 启用期间创建的。在创建服务账户之前,无法获取其详细信息并为其分配其他 IAM 角色。


Couple of comments about terraform code only:

  1. There is a special terraform data resource - google_storage_transfer_project_service_account - it might be useful to utilize it. It might look something like (var.project means the project ID):

    data "google_storage_transfer_project_service_account" "st_service_account" {
      project = var.project
    }
    
  2. Terraform tries to run a lot API commands asynchronously. At the same time some resources may be dependent on others. Sometimes it is possible to infer those dependencies and sometimes there is not enough information in terraform source files. In the alter case a depends_on meta-argument can be used. There is a piece of code (in your terraform) used to enable a Storage Transfer API. It takes time. From the best of my understanding, the storage transfer service account is created during that API enabling. And until the service account is created, it is not possible to get its details and assign additional IAM roles for it.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文