【发布时间】:2020-10-07 21:03:39
【问题描述】:
目标:
在 GKE pod 中生成签名 URL,无需手动注入服务帐号 JSON 密钥。生成它们的语法需要服务帐户电子邮件和私钥。
//import "cloud.google.com/go/storage"
url, err := storage.SignedURL(bucketName, objectName, &storage.SignedURLOptions{
ContentType: contentType,
GoogleAccessID: saEmail,
PrivateKey: saPrivateKey,
})
换句话说,我想从 GKE 节点中自动提供的默认凭据中加载 saEmail 和 saPrivateKey。
尝试:
ctx := context.Background()
//errors ignored for brevity
//import "golang.org/x/oauth2/google"
creds, _ := google.FindDefaultCredentials(ctx, storage.ScopeReadWrite)
cfg, _ := google.JWTConfigFromJSON(creds.JSON)
url, _ := storage.SignedURL(bucketName, objectName, &storage.SignedURLOptions{
ContentType: contentType,
GoogleAccessID: cfg.Email,
PrivateKey: cfg.PrivateKey,
})
当我在 GKE pod 中运行 google.FindDefaultCredentials() 时,结果 JSON 为空。
环境:
-
Go1.13 -
GKE1.14.10-gke.36 -
cloud.google.com/gov0.58.0 -
cloud.google.com/go/storagev1.8.0
补充说明:
我已经测试了两种可能的替代方案,涉及手动将服务帐户密钥 (JSON) 注入 pod,但我希望尽可能避免使用它们:
将服务帐户密钥写入文件并将
GOOGLE_APPLICATION_CREDENTIALS设置为其路径。完成后,google.FindDefaultCredentials()会加载电子邮件和私钥。将服务帐户密钥作为字符串传递到 pod 并使用
google.JWTConfigFromJSON()解析它。
【问题讨论】:
-
看起来这可能是打字系统问题。
FindDefaultCredentials()方法 returns a custom struct type 可能没有编组为 JSON,因此,它不能被下一个方法JWTConfigFromJSON()expects a[]bytearray 读取。我可能在这里遗漏了一些东西,但是您是否在传递第一个返回值之前对其进行了转换?
标签: go google-cloud-platform google-cloud-storage google-kubernetes-engine