You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Terraform中无需提供凭证生成存储桶Signed URL

解决GCS签名URL生成的凭证兼容问题

首先明确:生成GCS签名URL必须依赖具备签名权限的身份,但无需下载服务账号JSON密钥文件。你遇到的错误是因为Terraform官方的google_storage_object_signed_url数据源仅支持传统的服务账号JSON密钥(带私钥),不兼容external_account类型的凭证。以下是可行的替代方案:

方法一:用Terraform的external数据源调用gcloud命令

Google Cloud CLI的gcloud storage sign-url命令支持直接利用当前环境的凭证(包括external_account)生成签名URL,无需本地持有私钥。通过Terraform的external数据源调用该命令即可绕过原数据源的限制。

修改后的main.tf代码

resource "google_storage_bucket" "bucket" {
  name                        = "test-bucket"
  location                    = "europe-west2"
  uniform_bucket_level_access = true
  force_destroy               = true
  storage_class               = "COLDLINE"
}

resource "google_storage_bucket_object" "object" {
  for_each   = { for item in var.bucket_object : item.name => item if var.create_bucket_object }
  name       = each.key
  bucket     = google_storage_bucket.bucket.name
  content    = lookup(each.value, "content", null)
  depends_on = [google_storage_bucket.bucket]
}

# 调用gcloud生成签名URL
data "external" "signed_url" {
  program = [
    "bash",
    "-c",
    <<EOT
      gcloud storage sign-url \
        --duration 2h \
        "gs://${google_storage_bucket.bucket.name}/where/are/you/test.txt"
    EOT
  ]

  depends_on = [google_storage_bucket_object.object["where/are/you/test.txt"]]
}

# 输出生成的签名URL
output "object_signed_url" {
  value = trimspace(data.external.signed_url.result["stdout"])
}

必要权限

确保当前身份拥有以下IAM权限:

  • storage.objects.get:允许访问目标存储对象
  • iam.serviceAccounts.signBlob:允许调用IAM Credentials API生成签名

方法二:手动调用IAM Credentials API生成签名(进阶)

如果无法使用gcloud CLI,可通过Terraform的google_iam_service_account_sign_blob数据源生成签名,再手动拼接符合GCS规范的签名URL。这种方式需要自行处理URL参数、签名算法等细节,步骤更繁琐,仅推荐在无法使用CLI的场景下使用。

核心逻辑

  1. 构造GCS签名URL所需的请求参数(过期时间、HTTP方法等)
  2. 调用google_iam_service_account_sign_blob对参数进行签名
  3. 将签名结果编码后拼接成完整的签名URL

内容的提问来源于stack exchange,提问作者iamarunk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 16:20:13