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']
技术问题
- 是否可将目标GCP项目传入Liquibase容器,使其使用目标项目的Spanner API并由目标项目计费,而非CI/CD项目?
- 有无可行方案实现跨项目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
相关产品推荐
相关产品推荐

