【发布时间】:2019-07-16 11:24:49
【问题描述】:
我编写了一个应用程序,该应用程序具有使用 go lang 通过 Google Kubernetes Engine 上传图像的功能。其他一切正常,但是当我尝试将图像写入 Google Cloud Storage 时,我一直遇到问题。
这是我在 golang 中实际使用 google storage api 的代码:
func putImage(imageURL string, image multipart.File) bool {
fmt.Println("Putting into image location : " + imageURL)
contextBackground := context.Background()
storageClient, err := storage.NewClient(contextBackground)
if err != nil {
fmt.Println("No client.")
return false
}
bucket := storageClient.Bucket("mytestbucketname")
bucketWriter := bucket.Object(imageURL).NewWriter(contextBackground)
bucketWriter.ContentType = "image/jpg"
bucketWriter.CacheControl = "public, max-age=0"
size, err := io.Copy(bucketWriter, image)
if err != nil {
fmt.Println("failed to put image")
return false
}
fmt.Println(size)
fmt.Println("Successfully put image")
bucketWriter.Close()
return true
}
上面的函数总是返回 true 并且 size 总是大于 0。但是,当我检查存储桶时,它实际上并没有任何内容。所以我研究了一下,发现默认的服务账户只有云存储的读取权限。这很奇怪,因为它应该返回 false 或 size 应该为 0 甚至输出权限被拒绝的错误。
官方 cloud.google.com/go/storage API 说 Bucket() 函数返回一个实际上不执行任何网络操作的 BucketHandle,这对于为什么我没有收到权限被拒绝错误 (?) 是有道理的。所以我决定检查我是否真的从客户端或存储桶中得到任何东西,只是为了看看读取权限是否有效。我添加了以下代码:
attr, err := bucket.Attrs(contextBackground)
if err != nil {
fmt.Println(err.Error())
}
fmt.Println("bucket name : " + attr.Name)
此时我开始遇到导致应用程序关闭的致命错误。我在尝试检索存储桶的属性时遇到的错误是:
Get https://www.googleapis.com/storage/v1/b/mytestbucketname?alt=json&prettyPrint=false&projection=full: oauth2: cannot fetch token: Post https://oauth2.googleapis.com/token: x509: certificate signed by unknown authority
所以我认为我需要将 ca 证书添加到我的图像中。但这对我来说听起来不合逻辑,因为如果我在 Google Kubernetes Engine 中运行我的图像并且它正在访问我的 Google Cloud Storage,鉴于它已经有一个具有读取权限的默认服务帐户,我为什么需要证书?我创建了一个版本为 1.12.8-gke.10 的新集群,并确保禁用颁发客户端证书并确保我具有对存储的读取权限,但仍然出现相同的错误。我将此行添加到我的 docker 文件中,但仍然遇到相同的错误:
RUN apk --no-cache add ca-certificates && update-ca-certificates
我已经做了两天了,现在我的想法已经不多了。我的问题是当我使用默认权限时尝试从 Kubernetes Engine 访问存储桶属性时,我做错了什么,不断给我“x.509 certificate signed by unknown authority”错误?从技术上讲,获取存储桶属性只是一个读取功能,我应该能够使用默认权限来完成它吗?如果有人有任何想法或曾经遇到过同样的问题,请给我一些帮助!谢谢!
【问题讨论】:
标签: go google-api google-cloud-storage google-kubernetes-engine service-accounts