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

在只读流水线系统中配置Google Cloud ADC的替代方案(适配KMS模块)

在只读流水线系统中配置Google Cloud ADC的替代方案(适配KMS模块)

针对你遇到的只读CI/CD流水线无法创建临时凭证文件,且API Key不被KMS API支持的问题,这里有两个可行的替代方案,完全不需要写入任何文件:

方案1:直接在代码中加载凭证字符串(最直接适配只读环境)

Google Cloud的Python客户端库本身支持从内存中的字典初始化服务账号凭证,不需要依赖本地文件。具体步骤如下:

  1. 在CI系统中存储凭证:把你的GCP服务账号JSON凭证以字符串形式存在CI的Secret中(比如命名为GCP_SERVICE_ACCOUNT_JSON),在流水线运行时注入为环境变量。
  2. 修改代码加载凭证:在代码中直接读取环境变量中的字符串,解析为字典后初始化客户端,完全在内存中完成,无需写入临时文件。

修改你提供的示例代码如下:

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 13:08:10