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

Cloud Build中Liquibase操作Spanner报错:API未启用及跨项目计费问题

跨项目GCP Cloud Build + Liquibase管理Spanner Schema的权限与计费问题

问题背景

我搭建了一个用于支持多GCP项目部署的CI/CD GCP项目,该项目未启用Spanner API等额外资源API。在使用Cloud Build配置Liquibase进行Spanner Schema管理时,触发以下错误:

ERROR: Exception Primary Reason:  PERMISSION_DENIED: Cloud Spanner API has not been used in project <CLOUD_BUILD_PROJECT_ID> before or it is disabled. Enable it by visiting https://console.developers.google.com/apis/api/spanner.googleapis.com/overview?project=<CLOUD_BUILD_PROJECT_ID> then retry. If you enabled this API recently, wait a few minutes for the action to propagate to our systems and retry. li

对应的Cloud Build YAML配置片段如下:

- id: 'download_liquibase_spanner_extension'
    name: 'gcr.io/cloud-builders/wget'
    args:
      - '-P'
      - '/workspace/louhi_ws/drivers'
      - 'https://github.com/cloudspannerecosystem/liquibase-spanner/releases/download/4.32.0/liquibase-spanner-4.32.0-all.jar'
  - id: 'run_liquibase_update'
    name: 'liquibase/liquibase:4.33.0'
    env:
      - '_TARGET_PROJECT=${_TARGET_PROJECT}'
      - '_SPANNER_INSTANCE=${_SPANNER_INSTANCE}'
      - '_SPANNER_DATABASE=${_SPANNER_DATABASE}'
    args:
      - '--changelog-file=/workspace/louhi_ws/changelog/changelog.yaml'
      - '--url=jdbc:cloudspanner:/projects/${_TARGET_PROJECT}/instances/${_SPANNER_INSTANCE}/databases/${_SPANNER_DATABASE}'
      - '--driver=com.google.cloud.spanner.jdbc.JdbcDriver'
      - '--classpath=/workspace/louhi_ws/drivers/liquibase-spanner-4.32.0-all.jar'
      - 'update'
    waitFor: ['download_liquibase_spanner_extension']

技术问题

  1. 是否可将目标GCP项目传入Liquibase容器,使其使用目标项目的Spanner API并由目标项目计费,而非CI/CD项目?
  2. 有无可行方案实现跨项目CI/CD部署,且不会给CI/CD项目带来额外计费?

解答

问题1:能否让Liquibase使用目标项目的Spanner API并由其计费?

可以实现,核心是让Cloud Build的执行身份切换到目标项目的服务账号,而非使用CI/CD项目默认的Cloud Build服务账号,具体操作:

  • 在目标项目中创建具备Spanner Schema管理权限(如roles/spanner.databaseAdmin)的服务账号,下载其密钥JSON文件。
  • 将密钥文件存储为CI/CD项目的Cloud Build Secret,避免硬编码。
  • 在run_liquibase_update步骤中添加环境变量GOOGLE_APPLICATION_CREDENTIALS,指向密钥文件路径,确保Liquibase的JDBC URL正确指向目标项目。
  • 此时Liquibase发起的Spanner API调用会以目标项目的服务账号身份执行,API调用的计费归属目标项目,而非CI/CD项目。

注意:CI/CD项目的Cloud Build本身运行费用仍归属该项目,但Spanner API调用费用会转移到目标项目。

问题2:跨项目CI/CD零额外计费的可行方案?

完全避免CI/CD项目产生任何额外费用不现实(Cloud Build本身运行资源会产生费用),但可实现将所有资源相关API调用费用转移到目标项目,同时最小化CI/CD项目开销:

  • 切换执行身份:按问题1的方案使用目标项目服务账号,让Spanner API费用全归目标项目。
  • 精简CI/CD项目API:仅保留Cloud Build必需的API(如cloudbuild.googleapis.com),禁用其他不必要API,避免误触发计费。
  • 优化构建配置:使用最小规格的构建机器,缩短构建时长,减少Cloud Build自身运行费用。
  • 直接在目标项目执行构建(可选):若管理复杂度可接受,直接在目标项目触发Cloud Build任务,所有构建和API费用均归属目标项目,但会增加多项目维护成本。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 14:50:57