在只读流水线系统中配置Google Cloud ADC的替代方案(适配KMS模块)
在只读流水线系统中配置Google Cloud ADC的替代方案(适配KMS模块)
针对你遇到的只读CI/CD流水线无法创建临时凭证文件,且API Key不被KMS API支持的问题,这里有两个可行的替代方案,完全不需要写入任何文件:
方案1:直接在代码中加载凭证字符串(最直接适配只读环境)
Google Cloud的Python客户端库本身支持从内存中的字典初始化服务账号凭证,不需要依赖本地文件。具体步骤如下:
- 在CI系统中存储凭证:把你的GCP服务账号JSON凭证以字符串形式存在CI的Secret中(比如命名为
GCP_SERVICE_ACCOUNT_JSON),在流水线运行时注入为环境变量。 - 修改代码加载凭证:在代码中直接读取环境变量中的字符串,解析为字典后初始化客户端,完全在内存中完成,无需写入临时文件。
修改你提供的示例代码如下:
import os import json from google.cloud import kms_v1 from google.oauth2 import service_account def sample_asymmetric_sign(): # 从环境变量读取凭证字符串并解析为字典 service_account_info = json.loads(os.environ.get("GCP_SERVICE_ACCOUNT_JSON")) # 从内存中的凭证信息创建Credentials对象 credentials = service_account.Credentials.from_service_account_info(service_account_info) # 使用凭证初始化KMS客户端 client = kms_v1.KeyManagementServiceClient(credentials=credentials) # 初始化请求(替换为你的实际资源路径) request = kms_v1.AsymmetricSignRequest( name="projects/[PROJECT_ID]/locations/[LOCATION]/keyRings/[KEY_RING]/cryptoKeys/[KEY]/cryptoKeyVersions/[VERSION]", ) # 发起请求 response = client.asymmetric_sign(request=request) print(response)
这个方案完全规避了文件写入操作,完美适配只读的runner环境,而且和ADC的逻辑兼容,不会影响KMS API的调用。
方案2:使用工作负载身份联邦(无长期凭证,更安全)
如果你的生产CI系统支持OIDC(OpenID Connect),可以配置GCP的工作负载身份联邦,让CI runner直接通过OIDC协议获取临时GCP凭证,全程不需要存储或处理任何长期服务账号凭证(JSON文件/字符串):
- 在GCP中创建工作负载身份池和身份提供者,关联你的CI系统的OIDC issuer URL。
- 配置服务账号权限,允许身份池中的主体扮演该服务账号(需确保账号拥有KMS操作权限)。
- 在CI流水线中设置对应环境变量,触发ADC的OIDC自动认证流程,全程无需文件操作。
这个方案的优势是完全不需要存储任何长期凭证,安全性更高,适合长期稳定的生产流水线使用。
为什么API Key不可行?
你遇到的401 API keys are not supported by this API报错是正常的:Google Cloud KMS属于敏感的管理类API,不支持使用API Key进行身份验证,必须使用服务账号凭证或工作负载身份联邦的临时凭证,所以API Key这条路确实走不通。
备注:内容来源于stack exchange,提问作者Saikat Karmakar
相关产品推荐
相关产品推荐

