如何通过Google工作负载身份联盟从AWS触发Cloud Function?
问题:通过AWS EC2使用GCP工作负载身份联盟调用Cloud Function失败
我正尝试从AWS EC2实例(服务端)触发已授权的Cloud Function,计划用GCP工作负载身份联盟(WIF)实现,但遇到了问题。此前已通过WIF成功列出Cloud Storage存储桶,也能通过WIF调用Deployment Manager API部署计算实例,但相同逻辑无法应用到Cloud Function调用上。
已完成的配置步骤
- 创建带有对应IAM角色的AWS EC2实例
- 创建GCP工作负载身份联盟池
- 创建具备调用目标Cloud Function权限的服务账号
- 绑定工作负载身份联盟池与上述服务账号,生成
clientLibraryConfig.json配置文件
另外有个疑问:我没有组织账号,无法在组织策略中启用联盟,是否可以跳过这个步骤实现目标?
Node.js代码尝试及报错
我用Node.js编写的调用代码如下:
function main() { const {GoogleAuth} = require('google-auth-library'); const auth = new GoogleAuth(); const url = 'https://us-central1-multi-service-app-js.cloudfunctions.net/helloHttp', const targetAudience = 'https://us-central1-multi-service-app-js.cloudfunctions.net/helloHttp' const client = await auth.getIdTokenClient(targetAudience); const res = await client.request({url}); console.info(res.data); } request().catch(err => { console.error(err.message); process.exitCode = 1; }); } main();
执行后出现错误:
Cannot fetch ID token in this environment, use GCE or set the GOOGLE_APPLICATION_CREDENTIALS environment variable to a service account credentials JSON file.
我已经通过export命令设置GOOGLE_APPLICATION_CREDENTIALS指向clientLibraryConfig.json,也配置了GOOGLE_CLOUD_PROJECT环境变量,但报错依旧。
更新:Python SDK尝试及报错
改用Python SDK通过WIF调用Cloud Function,遇到以下错误:
google.auth.exceptions.RefreshError: ('Unable to acquire impersonated credentials', '{ "error": { "code": 400, "message": "Request contains an invalid argument.", "status": "INVALID_ARGUMENT" } } ')
初步推测
由于调用Cloud Function需要先获取ID Token,我怀疑问题出在ID Token的获取环节,且Node.js和Python SDK均出现同类问题,推测是google-auth-library中GoogleAuth模块在处理WIF场景下的ID Token获取存在问题,目前已向GCP提交相关工单。
内容的提问来源于stack exchange,提问作者JayantSeth
相关产品推荐
相关产品推荐

