如何通过编程方式创建可访问Cloud SQL的Cloud Run Job?
如何通过编程方式创建可访问私有Cloud SQL的Cloud Run Job?
问题描述
我需要通过编程方式创建一个能访问Cloud SQL实例的Cloud Run Job。在控制台成功创建的Job的YAML文件里,看到访问权限是由run.googleapis.com/cloudsql-instances和run.googleapis.com/vpc-access-connector这类注解控制的。
尝试用Java Builder添加注解:
builder.putAnnotations( "run.googleapis.com/cloudsql-instances", "my-instance")
结果触发报错:
INVALID_ARGUMENT: Violation in CreateJobRequest.job.template.annotations[run.googleapis.com/vpc-access-egress]: system annotations are not supported in Cloud Run API v2.
这让我以为以run.googleapis.com开头的注解不被允许,那是不是没法通过编程方式创建连接私有Cloud SQL数据库的Job?
解决方案
不是无法实现,而是Cloud Run API v2不再支持通过系统注解(以run.googleapis.com开头的)配置VPC或Cloud SQL访问,需要改用API v2对应的原生字段来配置:
1. 配置Cloud SQL访问(Java示例)
在API v2中,Cloud SQL实例的连接有两种配置方式:
- 方式一:通过环境变量传递连接信息
builder.getTemplateBuilder() .getSpecBuilder() .addContainersBuilder() .addEnvBuilder() .setName("CLOUDSQL_CONNECTION_NAME") .setValue("你的项目ID:区域:实例名");
- 方式二:直接设置
cloudSqlInstances字段(需使用最新版客户端库)
builder.getTemplateBuilder() .getSpecBuilder() .addCloudSqlInstances("你的项目ID:区域:实例名");
2. 配置VPC访问连接器(Java示例)
VPC连接器需要配置在template.spec.vpcAccess字段下,替代原注解:
builder.getTemplateBuilder() .getSpecBuilder() .getVpcAccessBuilder() .setConnector("projects/你的项目ID/locations/区域/connectors/连接器名") .setEgress("ALL_TRAFFIC"); // 按需设置为PRIVATE_RANGES_ONLY或ALL_TRAFFIC
关键注意事项
- 确保使用Cloud Run v2版本的Java客户端库,v1库的字段结构和v2不兼容
- 给Cloud Run Job的服务账号配置必要权限:比如
Cloud SQL Client角色、VPC连接器的访问权限 - API v2将原v1的系统注解全部转化为原生API字段,更符合REST规范,也避免了注解冲突
内容的提问来源于stack exchange,提问作者eric
相关产品推荐
相关产品推荐

