Terraform创建CloudSQL实例报Per-Product Per-Project服务账号不存在
问题根因
- 报错指向的
Per-Product Per-Project Service Account是Cloud SQL服务在项目内的专属服务代理账号(命名格式为service-<项目数字ID>@cloudsql.iam.gserviceaccount.com)。当项目首次启用Cloud SQL API、或者首次创建带私有IP/AD集成配置的MSSQL实例时,GCP后端会异步自动创建这个服务账号,整个预配流程通常需要3-7分钟。 - 当前使用的
google-betaprovider版本存在时序逻辑缺陷:发起实例创建请求后,会立即校验该服务代理账号的存在状态,不会主动等待后端完成账号异步预配,一旦预配耗时超过provider默认校验窗口就会直接抛出错误,中断Terraform流程,但后端的实例创建流程实际并未终止,这就是控制台能看到实例大部分配置已经生成的原因。 - 通过GCP控制台、gcloud CLI手动创建实例时,前端会内置等待服务账号预配的逻辑,不会提前中断流程,因此相同权限下手动操作可以正常完成创建。
排查与解决步骤
- 第一步:确认服务代理账号状态
先在GCP项目设置页获取项目对应的数字ID,执行如下gcloud命令查询Cloud SQL服务代理账号是否存在:
如果查询结果为空,说明账号还未完成预配,可手动触发API重初始化,执行后等待3-5分钟再重新查询账号状态:gcloud iam service-accounts list --filter="email:cloudsql.iam.gserviceaccount.com"gcloud services enable sqladmin.googleapis.com --force - 第二步:调整Terraform配置规避时序问题
- 给Cloud SQL实例资源增加显式API依赖,确保SQL Admin API完全就绪、服务代理账号生成后再发起实例创建,可在配置中新增如下资源并绑定依赖:
在原有resource "google_project_service" "sql_api" { project = var.gcp_project service = "sqladmin.googleapis.com" disable_dependent_services = false disable_on_destroy = false }google_sql_database_instance资源块内新增depends_on = [google_project_service.sql_api]配置即可。 - 拉长google-beta provider的操作超时阈值,给后端预配流程留足时间,provider配置调整示例:
provider "google-beta" { project = var.gcp_project region = var.gcp_region timeouts { create = "15m" update = "15m" } } - 如果是项目内首次创建带AD集成的私有IP MSSQL实例,可分两步部署:先创建不带AD配置、仅私有IP的基础实例,等一次apply完成确认服务代理账号正常后,再追加
active_directory_config配置块做增量更新,彻底规避首次预配的时序冲突。
- 给Cloud SQL实例资源增加显式API依赖,确保SQL Admin API完全就绪、服务代理账号生成后再发起实例创建,可在配置中新增如下资源并绑定依赖:
- 第三步:处理残留异常资源
如果控制台已经能看到创建失败的残留实例,不要直接在控制台手动删除,先执行命令把异常实例从本地Terraform状态中移除:
等确认服务代理账号正常存在后,再重新执行terraform state rm google_sql_database_instance.cloud_sql_instanceterraform apply发起创建即可,避免本地状态和云端资源不一致。
内容的提问来源于stack exchange,提问作者Michael Riediger
相关产品推荐
相关产品推荐

