如何修复:Google 云 SQL 导出时出现 403 错误
How to fix: 403 Error with Google Cloud SQL Export
我正在尝试将我们的一个 Cloud SQL Postgres 实例的完整 SQL 转储导出到 Google Cloud Storage 以便我们可以使用 google-api-go-client
(https://github.com/googleapis/google-api-go-client)
无论我配置什么,我都会不断收到此错误:panic: googleapi: Error 403: The client is not authorized to make this request., notAuthorized
来自 sqladminService.Instances.Export
。
我有一个配置了以下权限的服务帐户:
- 云SQL管理员
- 存储管理员
- 计算存储管理员(其他)
我要导出到的存储桶继承了存储管理员角色的权限。
代码:
./k8s/sql.go
package gcp
import (
"fmt"
"time"
"golang.org/x/net/context"
"golang.org/x/oauth2/google"
sqladmin "google.golang.org/api/sqladmin/v1beta4"
)
type SQLService interface {
Test(project string) error
}
type sqlService struct {
context context.Context
sqladminService *sqladmin.Service
}
func NewSQLService(serviceAccountJSON []byte) (SQLService, error) {
context := context.Background()
jwtCfg, err := google.JWTConfigFromJSON(serviceAccountJSON, sqladmin.SqlserviceAdminScope, sqladmin.CloudPlatformScope)
if err != nil {
return sqlService{}, err
}
httpClient := jwtCfg.Client(context)
sqladminService, err := sqladmin.New(httpClient)
if err != nil {
return sqlService{}, err
}
return sqlService{
context: context,
sqladminService: sqladminService,
}, nil
}
func (s sqlService) Test(project string) error {
instance := "REGION:INSTANCE_NAME
storageURI := fmt.Sprintf("gs://BUCKET/FILE-%s.sql.gz", time.Now().Format(time.RFC3339))
databases := []string{"DATABASE"}
req := &sqladmin.InstancesExportRequest{
ExportContext: &sqladmin.ExportContext{
Uri: storageURI,
Databases: databases,
},
}
_resp, err := s.sqladminService.Instances.Export(project, instance, req).Context(s.context).Do()
if err != nil {
return err
}
return nil
}
测试代码:
func Test(cfg config.Config) {
sql, err := gcp.NewSQLService(cfg.GCPServiceAccountEncodedCreds)
if err != nil {
panic(err)
}
err = sql.Test(cfg.Project)
if err != nil {
panic(err)
}
}
如有任何帮助,我们将不胜感激
InstancesExport 的文档显示所需的参数是 "projectId" 和 "instanceId"。您已将 instance
声明为 "REGION:INSTANCE_NAME"
- 但您真正想要的是 "INSTANCE_NAME"
。
您无权查看该实例(因为在本例中,它不存在)。
我正在尝试将我们的一个 Cloud SQL Postgres 实例的完整 SQL 转储导出到 Google Cloud Storage 以便我们可以使用 google-api-go-client
(https://github.com/googleapis/google-api-go-client)
无论我配置什么,我都会不断收到此错误:panic: googleapi: Error 403: The client is not authorized to make this request., notAuthorized
来自 sqladminService.Instances.Export
。
我有一个配置了以下权限的服务帐户:
- 云SQL管理员
- 存储管理员
- 计算存储管理员(其他)
我要导出到的存储桶继承了存储管理员角色的权限。
代码:
./k8s/sql.go
package gcp
import (
"fmt"
"time"
"golang.org/x/net/context"
"golang.org/x/oauth2/google"
sqladmin "google.golang.org/api/sqladmin/v1beta4"
)
type SQLService interface {
Test(project string) error
}
type sqlService struct {
context context.Context
sqladminService *sqladmin.Service
}
func NewSQLService(serviceAccountJSON []byte) (SQLService, error) {
context := context.Background()
jwtCfg, err := google.JWTConfigFromJSON(serviceAccountJSON, sqladmin.SqlserviceAdminScope, sqladmin.CloudPlatformScope)
if err != nil {
return sqlService{}, err
}
httpClient := jwtCfg.Client(context)
sqladminService, err := sqladmin.New(httpClient)
if err != nil {
return sqlService{}, err
}
return sqlService{
context: context,
sqladminService: sqladminService,
}, nil
}
func (s sqlService) Test(project string) error {
instance := "REGION:INSTANCE_NAME
storageURI := fmt.Sprintf("gs://BUCKET/FILE-%s.sql.gz", time.Now().Format(time.RFC3339))
databases := []string{"DATABASE"}
req := &sqladmin.InstancesExportRequest{
ExportContext: &sqladmin.ExportContext{
Uri: storageURI,
Databases: databases,
},
}
_resp, err := s.sqladminService.Instances.Export(project, instance, req).Context(s.context).Do()
if err != nil {
return err
}
return nil
}
测试代码:
func Test(cfg config.Config) {
sql, err := gcp.NewSQLService(cfg.GCPServiceAccountEncodedCreds)
if err != nil {
panic(err)
}
err = sql.Test(cfg.Project)
if err != nil {
panic(err)
}
}
如有任何帮助,我们将不胜感激
InstancesExport 的文档显示所需的参数是 "projectId" 和 "instanceId"。您已将 instance
声明为 "REGION:INSTANCE_NAME"
- 但您真正想要的是 "INSTANCE_NAME"
。
您无权查看该实例(因为在本例中,它不存在)。